recoll-1.17.3/000755 001750 000000 00000000000 11757440713 013475 5ustar00dockeswheel000000 000000 recoll-1.17.3/COPYING000644 001750 000000 00000043110 11740755063 014526 0ustar00dockeswheel000000 000000 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. recoll-1.17.3/ChangeLog000644 001750 000000 00001214122 11740755063 015251 0ustar00dockeswheel000000 000000 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. recoll-1.17.3/INSTALL000644 001750 000000 00000123113 11757440713 014527 0ustar00dockeswheel000000 000000 More documentation can be found in the doc/ directory or at http://www.recoll.org Link: HOME Link: PREVIOUS Link: NEXT Recoll user manual Prev Next -------------------------------------------------------------------------- Chapter 5. Installation and configuration Table of Contents 5.1. Installing a binary copy 5.2. Supporting packages 5.3. Building from source 5.4. Configuration overview 5.1. Installing a binary copy There are three types of binary Recoll installations: * Through your system normal software distribution framework (ie, Debian/Ubuntu apt, FreeBSD ports, etc.). * From a package downloaded from the Recoll web site. * From a prebuilt tree downloaded from the Recoll web site. In all cases, the strict software dependancies (ie on Xapian or iconv) will be automatically satisfied, you should not have to worry about them. You will only 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.1.1. Installing through a package system If you use a BSD-type port system or a prebuilt package (DEB, RPM, manually or through the system software configuration utility), just follow the usual procedure for your system. 5.1.2. Installing a prebuilt Recoll The unpackaged binary versions on the Recoll web site are just compressed tar files of a build tree, where only the useful parts were kept (executables and sample configuration). The executable binary files are built with a static link to libxapian and libiconv, to make installation easier (no dependencies). After extracting the tar file, you can proceed with installation as if you had built the package from source (that is, just type make install). The binary trees are built for installation to /usr/local. -------------------------------------------------------------------------- Prev Home Next API Supporting packages Link: HOME Link: UP Link: PREVIOUS Link: NEXT Recoll user manual 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 filters 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 the Recoll helper applications page 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 the Recoll helper applications page 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 filter 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 the Xpdf or Poppler packages. * Postscript files need pstotext. The original version has an issue with shell character in file names, which is corrected in recent packages. See the the Recoll helper applications page 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 need catdoc. * 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 standard version, has much trouble with non-western character sets. Check the Recoll helper applications page. * TeX files need untex or detex. Check the Recoll helper applications page 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: Recoll releases before 1.13 used the id3info command from the id3lib package to extract mp3 tag information, metaflac (standard flac tools) for flac files, and ogginfo (vorbis tools) for ogg files. Releases 1.14 and later use a single Python filter based on mutagen for all audio file types. * 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. * chm: files in microsoft help format need Python and the pychm module (which needs chmlib). * 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. * 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 filter, 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 filters need iconv and the standard sed and awk. -------------------------------------------------------------------------- Prev Home Next Installation and configuration Up Building from source Link: HOME Link: UP Link: PREVIOUS Link: NEXT Recoll user manual Prev Chapter 5. Installation and configuration Next -------------------------------------------------------------------------- 5.3. Building from source 5.3.1. Prerequisites C++ compiler. Up to Recoll version 1.13.04, its absence can manifest itself by strange messages about a missing iconv_open. 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. Development files for Qt . Development files for X11 and zlib. Check the Recoll download page for up to date version information. You will most probably be able to find a binary package for Qt for your system. You may have to compile Xapian but this is not difficult (if you are using FreeBSD, there is a port). You may also need libiconv. Recoll currently uses version 1.9 (this should not be critical). On Linux systems, the iconv interface is part of libc and you should not need to do anything special. 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. Depending on the Qt 3 configuration on your system, you may have to set the QTDIR and QMAKESPECS variables in your environment: * QTDIR should point to the directory above the one that holds the qt include files (ie: if qt.h is /usr/local/qt/include/qt.h, QTDIR should be /usr/local/qt). * QMAKESPECS should be set to the name of one of the Qt mkspecs sub-directories (ie: linux-g++). On many Linux systems, QTDIR is set by the login scripts, and QMAKESPECS is not needed because there is a default link in mkspecs/. Neither QTDIR nor QMAKESPECS should be needed with Qt 4, configuration details are entirely determined by qmake (which is quite often installed as qmake-qt4). Configure options: * --without-aspell will disable the code for phonetic matching of search terms. * --with-fam or --with-inotify will enable the code for real time indexing. Inotify support is enabled by default on recent Linux systems. * --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. * --enable-xattr will enable code to fetch data from file extended attributes. This is only useful is some application stores data in there, and also needs some simple configuration (see comments in the fields configuration file). * --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). * --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. * --disable-qtgui Disable the Qt interface. Will allow building the indexer and the command line search program in absence of a Qt environment. * --disable-x11mon Disable X11 connection monitoring inside recollindex. Together with --disable-qtgui, this allows building recoll without Qt and X11. * 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.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 Home Next Supporting packages Up Configuration overview Link: HOME Link: UP Link: PREVIOUS Recoll user manual 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 define the parameters for one index. The configuration files can be edited by hand or through the Indexing 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. 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. 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: * 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. 5.4.1. Main configuration file 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.1.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 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 recoll_noindex variable in mimemap for an alternative approach which indexes the file names. 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 and FNM_LEADING_DIR flags. 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). 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. 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). 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 use the 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 mimemap file). This can be useful for files with suffix-less names, but it will also cause the indexing of many bogus "text" files. processbeaglequeue 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. beaglequeuedir 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. 5.4.1.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. 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. 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 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. 5.4.1.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 Beagle 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 Beagle web browser plugin indexing code, and defines the maximum size for the web page cache. Default: 40 MB. 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 depends on average document size. The default value is 10. 5.4.1.4. Miscellaneous parameters: 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. 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. filtermaxseconds Maximum filter execution time, after which it is aborted. Some postscript programs just loop... filtersdir 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 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. 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. 5.4.2. 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 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 filter-specific sections Some filters may need specific configuration for handling fields. Only the email message filter 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 filter 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 = [mail] # Extract the X-My-Tag mail header, and use it internally with the # mailmytag field name x-my-tag = mailmytag 5.4.3. 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. mimemap also has a recoll_noindex variable which is a list of suffixes. Matching files will be skipped (which avoids unnecessary decompressions or file executions). This is partially redundant with skippedNames in the main configuration file, with a few differences: it will not affect directories, it cannot be made dependant on the file-system location (it is a configuration-wide parameter), and the file names will still be indexed (not even the file names are indexed for patterns in skippedNames. recoll_noindex is used mostly for things known to be unindexable by a given Recoll version. Having it there avoids cluttering the more user-oriented and locally customized skippedNames. 5.4.4. 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.5. 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 user preferences dialog. If Use desktop preferences to choose document editor is checked in the Recoll GUI user preferences, all mimeview entries will be ignored except the one labelled application/x-all (which is set to use xdg-open by default). 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. Please note that these 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). * %F. Original file name. Same as %f except if a temporary file is used. * %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. * %M. Mime type * %U, %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.6. Examples of configuration adjustments 5.4.6.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: * 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 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.6.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): * 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 filter 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 a filter. -------------------------------------------------------------------------- Prev Home Building from source Up recoll-1.17.3/Makefile.in000644 001750 000000 00000004700 11740755063 015542 0ustar00dockeswheel000000 000000 # Copyright (C) 2005 J.F.Dockes prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ datadir = @datadir@ datarootdir = @datarootdir@ mandir = @mandir@ QMAKE = @QMAKE@ QTGUI = @QTGUI@ all: mk/sysconf ${MAKE} -C lib ${MAKE} -C index recollindex @NOQTMAKE@(cd $(QTGUI); ${QMAKE} recoll.pro) @NOQTMAKE@${MAKE} -C $(QTGUI) depth=.. @NOPYTHON@${MAKE} -C python/recoll ${MAKE} -C query recollq mk/sysconf: @echo "You need to run configure first" ; exit 1 static: mk/sysconf ${MAKE} -C lib rm -f index/recollindex ${MAKE} -C index BSTATIC=-Wl,-Bstatic BDYNAMIC=-Wl,-Bdynamic \ LIBXAPIANSTATICEXTRA="@LIBXAPIANSTATICEXTRA@" \ recollindex @NOQTMAKE@(cd $(QTGUI); $(QMAKE) recoll.pro) @NOQTMAKE@rm -f $(QTGUI)/recoll @NOQTMAKE@${MAKE} -C $(QTGUI) BSTATIC=-Wl,-Bstatic \ @NOQTMAKE@ BDYNAMIC=-Wl,-Bdynamic depth=.. \ @NOQTMAKE@ LIBXAPIANSTATICEXTRA="@LIBXAPIANSTATICEXTRA@" clean: ${MAKE} -C common clean ${MAKE} -C index clean ${MAKE} -C internfile clean ${MAKE} -C lib clean ${MAKE} -C query clean ${MAKE} -C utils clean -${MAKE} -C desktop/unity-lens-recoll clean -${MAKE} -C python/recoll clean @NOQTMAKE@@-${MAKE} -C $(QTGUI) clean rm -f qtgui/Makefile qtgui/confgui/Makefile qtgui/recoll rm -f filters/rclexecm.pyc rm -rf qtgui/.moc qtgui/.ui qtgui/confgui/.moc qtgui/confgui/.ui rm -rf qtgui/.obj qtgui/.moc qtgui/.ui rm -rf python/recoll/build rm -rf $(QTGUI)/recoll.app # Note: we don't remove the top Makefile, to keep the "clean" targets # available but a "Make" won't work without a configure anyway distclean: clean -${MAKE} -C desktop/unity-lens-recoll distclean -${MAKE} -C python/recoll distclean rm -f mk/sysconf mk/localdefs sampleconf/recoll.conf \ qtgui/recoll.pro \ config.log config.status \ recollinstall \ lib/*.dep common/autoconfig.h rm -f common/rclversion.h rm -f index/alldeps lib/alldeps query/alldeps bincimapmime/alldeps rm -rf autom4te.cache maintainer-clean: distclean rm -f doc/user/*.html* doc/user/*.txt doc/user/HTML.manifest rm -f qtgui/i18n/*.qm # recollinstall can be executed by the user and will compute 'normal' # values for bindir etc., relative to the prefix argument. When executed # here, we pass a bunch of variables in the environment, the values will # override the computed defaults. install: all DESTDIR=${DESTDIR} bindir=${bindir} datadir=${datadir} \ mandir=${mandir} \ /bin/sh ./recollinstall ${prefix} .PHONY: all static clean distclean install recoll-1.17.3/README000644 001750 000000 00000444301 11757440713 014363 0ustar00dockeswheel000000 000000 More documentation can be found in the doc/ directory or at http://www.recoll.org Recoll user manual Jean-Francois Dockes Copyright (c) 2005-2012 Jean-Francois Dockes This document introduces full text search notions and describes the installation and use of the Recoll application. It currently describes Recoll 1.17. [ Split HTML / Single HTML ] ---------------------------------------------------------------------- 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.2. Index storage 2.2.1. Xapian index formats 2.2.2. Security aspects 2.3. Indexing configuration 2.3.1. The indexing configuration GUI 2.4. Using Beagle WEB browser plugins 2.5. Periodic indexing 2.5.1. Running indexing 2.5.2. Using cron to automate indexing 2.6. Real time indexing 2.6.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. The preview window 3.1.5. Complex/advanced search 3.1.6. The term explorer tool 3.1.7. Multiple databases 3.1.8. Document history 3.1.9. Sorting search results and collapsing duplicates 3.1.10. Search tips, shortcuts 3.1.11. 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. The query language 3.4.1. Modifiers 3.5. Anchored searches and wildcards 3.5.1. More about wildcards 3.5.2. Anchored searches 3.6. Desktop integration 3.6.1. Hotkeying recoll 3.6.2. The KDE Kicker Recoll applet 4. Programming interface 4.1. Writing a document filter 4.1.1. Simple filters 4.1.2. Telling Recoll about the filter 4.1.3. Filter HTML output 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.1.1. Installing through a package system 5.1.2. Installing a prebuilt Recoll 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. Main configuration file 5.4.2. The fields file 5.4.3. The mimemap file 5.4.4. The mimeconf file 5.4.5. The mimeview file 5.4.6. Examples of configuration adjustments ---------------------------------------------------------------------- Chapter 1. Introduction 1.1. Giving it a try If you do not like reading manuals (who does?) and would like to give Recoll a try, just install the application and start the recoll graphical user interface (GUI), which will ask 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. Also be aware that you may need to install the appropriate supporting applications for document types that need them (for example antiword for ms-word files). ---------------------------------------------------------------------- 1.2. Full text search Recoll is a full text search application. Full text search applications let you find your data by content rather than by external attributes (like a file name). More specifically, they will let you specify words (terms) that should or should not appear in the text you are looking for, and 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 those terms are prominent, in a similar way to Internet search engines. A search application tries 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, not for a specific form or spelling. These different forms may include plurals, different tenses for a verb, or terms derived from the same root or stem (example: floor, floors, floored, flooring...). Search applications usually expand queries to all such related terms (words that reduce to the same stem) and also provide a way to disable this expansion if you are actually searching for a specific form. Stemming, by itself, does not accommodate for misspellings or phonetic searches. Recoll supports these features through a specific tool (the term explorer) which will let you explore the set of index terms along different modes. ---------------------------------------------------------------------- 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. Recoll provides the mechanisms and interface to get data into and out of the system. In practice, Xapian works by remembering where terms appear in your document files. The acquisition process is called indexing. The resulting 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 with different character sets, encodings, and languages into the same index. It has input filters for many document types. 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 stemmer module for most common languages where stemming makes sense. 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 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. 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, awaiting the addition of an automatic language recognition module to Recoll, it is much less cumbersome than separating your documents according to what language they are written in. 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 The indexing process is started automatically the first time you execute the recoll GUI. Indexing can also be performed by executing the recollindex command. 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 a Ubuntu Unity Lens module. ---------------------------------------------------------------------- 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. 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). Recoll indexing can be performed with two different methods: * 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. * 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. 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 in turn be themselves compound ones. Such hierarchies can go quite deep, and Recoll can process, for example, an ms-word 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. Without further configuration, Recoll will index all appropriate files from your home directory, with a reasonable set of defaults. 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. See the section about using multiple databases for more information on multiple configurations and indexes. 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): * 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 that you wish to make searchable. * You can also specify a different 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 document set size, 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. Unfortunately, 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. Indexing 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 using the dialogs in the recoll GUI. You can also use multiple indexes defined by separate configurations, typically to separate personal and shared indexes, or to take advantage of the organization of your data to improve search precision. 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 ---------------------------------------------------------------------- 2.3.1. The indexing configuration GUI Most parameters for a given indexing 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->Indexing Configuration menu entry. It is divided in three tabs, Global parameters, Local parameters, and Beagle web history, which is explained in the next section. The first tab allows setting global variables, like the lists of top directories, skipped paths, or stemming languages. The second 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 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. Using Beagle WEB browser plugins Beagle is (was?) a concurrent desktop indexer, built on Lucene and the Mono project (C#), for which a number of add-on browser plugins were written. These work by copying visited web pages to an indexing queue directory, which the indexer then processes. Especially, there is a Firefox extension. If, for any reason, you so happen to prefer Recoll to Beagle, you can still use the Firefox plugin, which is written in Javascript and completely independant of C#, Beagle, Lucene..., and set Recoll to process the Beagle queue directory. This supposes that Beagle is not running, else both programs will fight for the same files. This feature can be enabled in the GUI indexing configuration panel, or by editing the configuration file (set processbeaglequeue to 1). There are more recent instructions about how to find and install the Firefox extension on the Recoll wiki. Unfortunately, it seems that the plugin does not work anymore with recent Firefox versions (tried with 10.0). This is not the trival installation version check issue, explicit manual indexing requests still work, but automatic indexing on page load does not. ---------------------------------------------------------------------- 2.5. Periodic indexing 2.5.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 are still up to date will not need to be reindexed). recollindex has a number of other options which are described in its man page. Of special interest 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 . recollindex -i will not descend into directory parameters, but just add them as index entries. It is up to the external file selection method to build the complete file list. ---------------------------------------------------------------------- 2.5.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.6. 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 discarded. 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. ---------------------------------------------------------------------- 2.6.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: * 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 and location in the file system. 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). ---------------------------------------------------------------------- 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. File name will specifically look for file names. The entry will be split at white space characters, and each fragment will be separately expanded, then the search will be for file names matching all fragments (this is new in 1.15, older releases did an OR of the whole thing which did not make sense). Things to know: * The search is case- and accent-insensitive. * Fragments without any wild card character and not capitalized will be prepended and appended with '*' (ie: etc -> *etc*, but Etc -> etc). Of course it does not make sense to have multiple fragments if one of them is capitalized (as this one will require an exact match). * If you want to search for a pattern including white space, use double quotes (ie: "admin note*"). * If you have a big index (many files), excessively generic fragments may result in inefficient searches. * As an example, inst recoll would match recollinstall.in (and quite a few others...). The point of having a separate file name search is that wild card expansion can be performed more efficiently on a relatively small subset of the index (allowing wild cards on the left of terms without excessive penality). All search modes allow wildcards inside terms (*, ?, []). You may want to have a look at the section about wildcards for more information about this. You can search for exact phrases (adjacent words in a given order) by enclosing the input inside double quotes. Ex: "virtual reality". 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. 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 (the old sort tool is gone after release 1.15, because the new result table has much better capability). 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 attempt to start an external viewer. The viewer for each document type can be configured through the user preferences dialog, or by editing the mimeview configuration file. You can also check the Use desktop preferences option in the user preferences dialog to use the desktop defaults for all documents. This is probably the best option if you are using a well configured Gnome or KDE desktop. 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. 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 * Copy File Name * Copy Url * Save to File * Find similar * Preview Parent document * Open Parent document The Preview and Open entries do the same thing as the corresponding links. 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 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. The Parent document entries will appear for documents which are not actually files but are part of, or attached to, a higher level document. This entry is mainly useful for email attachments and permits viewing the message to which the document is attached. Note that the entry will also appear for an email which is part of an mbox folder file, but that you can't actually visualize the folder (there will be an error dialog if you try). Recoll is unfortunately not yet smart enough to disable the entry in this case. In other cases, the Open option makes sense, for example to start a chm viewer on the parent document for a help page. ---------------------------------------------------------------------- 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. 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). 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. 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. You can print the current preview window contents by typing Ctrl-P (Ctrl + P) in the window text. ---------------------------------------------------------------------- 3.1.5. 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. 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.5.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: * 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. ---------------------------------------------------------------------- 3.1.5.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 * 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. ---------------------------------------------------------------------- 3.1.6. 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 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 200 results for wildcards and regular expressions. 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.7. Multiple databases Multiple Recoll databases or 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 recollindex program instance can only update one specific index. A recoll program instance is also associated with a specific index, which is the one to be updated by its indexing thread, 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. Of course, 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. 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 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. 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.8. 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.9. 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 Query configuration dialog, and is off by default. ---------------------------------------------------------------------- 3.1.10. Search tips, shortcuts 3.1.10.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.10.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.10.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. 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. 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. 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.11. Customizing the search interface You can customize some aspects of the search interface by using the Query 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. * 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. * Use
 tags instead of 
to display plain text as HTML in preview: 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. * Use desktop preferences to choose document editor: if this is checked, the xdg-open utility will be used to open files when you click the Open link in the result list, instead of the application defined in mimeview. xdg-open will in term use your desktop preferences to choose an appropriate application. * Choose editor applications this will let you choose the command started by the Open links inside the result list, for specific document types. * Display category filter as toolbar... this will let you choose if the document categories are displayed as a list or a set of buttons. * 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 and Start with sort dialog open: If you use these dialogs all the time, checking these entries will get them 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 Recoll 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 Recoll tries to build document abstracts when displaying the result list. Abstracts are constructed by taking context from the document information, around the search terms. This can slow down result list display significantly for big documents, and you may want to turn it off. * 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, ---------------------------------------------------------------------- 3.1.11.1. The result list format The result list presentation can be exhaustively customized by adjusting two elements: * The paragraph format * Html code inside the header section These can be edited from the Result list tab of the Query configuration. Newer versions of Recoll (from 1.17) use a WebKit HTML object by default (this may be disabled at build time), and 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. No more detail will be given about the header part (only useful with the WebKit build), if there are restrictions to what you can do, they are beyond this author's HTML/CSS/Javascript abilities... There are a few examples on the page about customising the result list on the Recoll web site. ---------------------------------------------------------------------- 3.1.11.1.1. The paragraph format This is an arbitrary HTML string where the following printf-like % substitutions will be performed: * %A. Abstract * %D. Date * %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. * %K. Keywords (if any) * %L. Precooked Preview and Edit links * %M. Mime type * %N. result Number inside the result page * %R. Relevance percentage * %S. Size information * %T. Title or Filename if not set. * %t. Title or Filename if not set. * %U. Url The format of the Preview and Edit links is and where docnum (%N) expands to the document number inside the result page). 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. For example, you could look at the fields for the document types of interest (use the right-click menu inside the preview window), and add what you want to the list of stored fields. A candidate example would be the recipient field which is generated by the message filters. The default value for the paragraph format string is: %R %S %L   %T
%M %D   %U %i
%A %K You may, for example, try the following for a more web-like experience:
%T
%A%U - %S - %L Or the clean looking: %L %R %T
%S %U
%A
%K Note that the P%N link in the above paragraph makes the title a preview link. 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: * By passing option -t 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 -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. 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 -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. 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 roughly 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. Example: Beatles, author:balzac, dc:title:grandet The colon, if present, means "contains". Xesam defines other relations, which are not supported for now. 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. Do not enter explicit parenthesis, they are not supported for now. An element preceded by a - specifies a term that should not appear. Pure negative queries are forbidden. 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. Modifiers can be set on a phrase clause, for example to specify a proximity search (unordered). See the modifier section. Recoll 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. * ext specifies the file name extension (Ex: ext:html) 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 out of the specified directory, only after release 1.15.8. A tilde inside the value will be expanded to the home directory. dir is not a regular field and only one value makes sense in a query (you can't use dir:dir1 OR dir:dir2). Relative paths make sense, for example, dir:share/doc would match either /usr/share/doc or /usr/local/share/doc * 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 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. 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. The document filters 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.4.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: * l can be used to turn off stemming (mostly makes sense with p because stemming is off by default for phrases). * 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 * 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.5. 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.5.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: * * 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 before using wildcards. * 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. * 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.5.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. ---------------------------------------------------------------------- 3.6. Desktop integration Being independant of the desktop type has its drawbacks: Recoll desktop integration is minimal. Here follow a few things that may help. ---------------------------------------------------------------------- 3.6.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.6.2. The KDE Kicker Recoll applet 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 filters for new types of documents. The processing of metadata attributes for documents (fields) is highly configurable. ---------------------------------------------------------------------- 4.1. Writing a document filter Recoll filters are executable programs which translate from a specific format (ie: openoffice, acrobat, etc.) to the Recoll indexing input format, which may be text/plain or text/html. As of Recoll 1.13, there are two kinds of filters: * Simple filters (the old ones) run once and exit. They can be bare programs like antiword, or shell-scripts using other programs. They are very simple to write, just having to write the text to the standard output. * Multiple filters, new in 1.13, run as long as their master process (ie: recollindex) is active. They can process multiple files (sparing the process startup time which can be very significant), or multiple documents per file (ie: 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 these new filters are written in Python, using a common module to handle the protocol. The following will just describe the simple filters. If you can program and want to write one of the other kind, it shouldn't be too difficult to make sense of one of the existing modules. For example, look at rclzip which uses Zip file paths as internal identifiers (ipath), and rclinfo, which uses an integer index. ---------------------------------------------------------------------- 4.1.1. Simple filters Recoll simple filters 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 filter. In some cases the output of the translating program is completely appropriate, and no intermediate shell-script is needed. Filters are called with a single argument which is the source file name. They should output the result to stdout. When writing a filter, 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 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 filter if the operation is for indexing or previewing. Some filters 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 filters, for example rclps for a starting point. Don't forget to make your filter executable before testing ! ---------------------------------------------------------------------- 4.1.2. Telling Recoll about the filter There are two elements that link a file to the filter which should process it: the association of file to mime type and the association of a mime type with a filter. 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 filters 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 filter. This is determined by the execm keyword. ---------------------------------------------------------------------- 4.1.3. Filter 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. "&" should be transformed into "&", "<" should be transformed into "<". This is not always properly done by translating programs which output HTML, and of course nerver by those which output plain text. 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 also make use of other header fields if they are present: title, description, keywords. Filters also have the possibility to "invent" field names. This should be output as meta tags: See the following section for details about configuring how field data is processed by the indexer. ---------------------------------------------------------------------- 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 filters as meta fields in the HTML header section, 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 filters, 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. You can find more information in the section about the fields file, or in comments inside the file. ---------------------------------------------------------------------- 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 Python interface is not built by default and can be found in the source package, under python/recoll. In order to build the module, you should first build or re-build the Recoll library using position-independant objects: cd recoll-xxx/ configure --enable-pic make There is no significant disadvantage in using PIC objects for the main Recoll executables, so you can use the --enable-pic option for the main build too. The python/recoll/ directory contains the usual setup.py script which you can then use to build and install the module: cd recoll-xxx/python/recoll python setup.py build python setup.py install ---------------------------------------------------------------------- 4.3.2.2. Interface manual NAME recoll - This is an interface to the Recoll full text indexer. FILE /usr/local/lib/python2.5/site-packages/recoll.so CLASSES Db Doc Query SearchData class Db(__builtin__.object) | Db([confdir=None], [extra_dbs=None], [writable = False]) | | A Db object holds a connection to a Recoll index. Use the connect() | function to create one. | confdir specifies a Recoll configuration directory (default: | $RECOLL_CONFDIR or ~/.recoll). | extra_dbs is a list of external databases (xapian directories) | writable decides if we can index new data through this connection | | Methods defined here: | | | addOrUpdate(...) | addOrUpdate(udi, doc, parent_udi=None) -> None | Add or update index data for a given document | The udi string must define a unique id for the document. It is not | interpreted inside Recoll | doc is a Doc object | if parent_udi is set, this is a unique identifier for the | top-level container (ie mbox file) | | delete(...) | delete(udi) -> Bool. | Purge index from all data for udi. If udi matches a container | document, purge all subdocs (docs with a parent_udi matching udi). | | makeDocAbstract(...) | makeDocAbstract(Doc, Query) -> string | Build and return 'keyword-in-context' abstract for document | and query. | | needUpdate(...) | needUpdate(udi, sig) -> Bool. | Check if the index is up to date for the document defined by udi, | having the current signature sig. | | purge(...) | purge() -> Bool. | Delete all documents that were not touched during the just finished | indexing pass (since open-for-write). These are the documents for | the needUpdate() call was not performed, indicating that they no | longer exist in the primary storage system. | | query(...) | query() -> Query. Return a new, blank query object for this index. | | setAbstractParams(...) | setAbstractParams(maxchars, contextwords). | Set the parameters used to build 'keyword-in-context' abstracts | | ---------------------------------------------------------------------- | Data and other attributes defined here: | class Doc(__builtin__.object) | Doc() | | 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 no useful methods but | 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 | Predefined attributes (index/query/both): | text (index): document plain text | url (both) | fbytes (both) optional) file size in bytes | filename (both) | fmtime (both) optional file modification date. Unix time printed | as string | dbytes (both) document text bytes | dmtime (both) document creation/modification date | ipath (both) value private to the app.: internal access path | inside file | mtype (both) mime type for original document | mtime (query) dmtime if set else fmtime | origcharset (both) charset the text was converted from | size (query) dbytes if set, else fbytes | sig (both) app-defined file modification signature. | For up to date checks | relevancyrating (query) | abstract (both) | author (both) | title (both) | keywords (both) | | Methods defined here: | | | ---------------------------------------------------------------------- | Data and other attributes defined here: | class Query(__builtin__.object) | Recoll Query objects are used to execute index searches. | They must be created by the Db.query() method. | | Methods defined here: | | | execute(...) | execute(query_string, stemming=1|0) | | Starts a search for query_string, a Recoll search language string | (mostly Xesam-compatible). | The query can be a simple list of terms (and'ed by default), or more | complicated with field specs etc. See the Recoll manual. | | executesd(...) | executesd(SearchData) | | Starts a search for the query defined by the SearchData object. | | fetchone(...) | fetchone(None) -> Doc | | Fetches the next Doc object in the current search results. | | sortby(...) | sortby(field=fieldname, ascending=true) | Sort results by 'fieldname', in ascending or descending order. | Only one field can be used, no subsorts for now. | Must be called before executing the search | | ---------------------------------------------------------------------- | Data descriptors defined here: | | next | Next index to be fetched from results. Normally increments after | each fetchone() call, but can be set/reset before the call effect | seeking. Starts at 0 | | ---------------------------------------------------------------------- | Data and other attributes defined here: | class SearchData(__builtin__.object) | SearchData() | | A SearchData object describes a query. It has a number of global | parameters and a chain of search clauses. | | Methods defined here: | | | addclause(...) | addclause(type='and'|'or'|'excl'|'phrase'|'near'|'sub', | qstring=string, slack=int, field=string, stemming=1|0, | subSearch=SearchData) | Adds a simple clause to the SearchData And/Or chain, or a subquery | defined by another SearchData object | | ---------------------------------------------------------------------- | Data and other attributes defined here: | FUNCTIONS connect(...) connect([confdir=None], [extra_dbs=None], [writable = False]) -> Db. Connects to a Recoll database and returns a Db object. confdir specifies a Recoll configuration directory (the default is built like for any Recoll program). extra_dbs is a list of external databases (xapian directories) writable decides if we can index new data through this connection ---------------------------------------------------------------------- 4.3.2.3. 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. #!/usr/bin/env python import recoll db = recoll.connect() db.setAbstractParams(maxchars=80, contextwords=2) query = db.query() nres = query.execute("some user question") print "Result count: ", nres if nres > 5: nres = 5 while query.next >= 0 and query.next < nres: doc = query.fetchone() print query.next for k in ("title", "size"): print k, ":", getattr(doc, k).encode('utf-8') abs = db.makeDocAbstract(doc, query).encode('utf-8') print abs print ---------------------------------------------------------------------- Chapter 5. Installation and configuration 5.1. Installing a binary copy There are three types of binary Recoll installations: * Through your system normal software distribution framework (ie, Debian/Ubuntu apt, FreeBSD ports, etc.). * From a package downloaded from the Recoll web site. * From a prebuilt tree downloaded from the Recoll web site. In all cases, the strict software dependancies (ie on Xapian or iconv) will be automatically satisfied, you should not have to worry about them. You will only 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.1.1. Installing through a package system If you use a BSD-type port system or a prebuilt package (DEB, RPM, manually or through the system software configuration utility), just follow the usual procedure for your system. ---------------------------------------------------------------------- 5.1.2. Installing a prebuilt Recoll The unpackaged binary versions on the Recoll web site are just compressed tar files of a build tree, where only the useful parts were kept (executables and sample configuration). The executable binary files are built with a static link to libxapian and libiconv, to make installation easier (no dependencies). After extracting the tar file, you can proceed with installation as if you had built the package from source (that is, just type make install). The binary trees are built for installation to /usr/local. ---------------------------------------------------------------------- 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 filters 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 the Recoll helper applications page 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 the Recoll helper applications page 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 filter 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 the Xpdf or Poppler packages. * Postscript files need pstotext. The original version has an issue with shell character in file names, which is corrected in recent packages. See the the Recoll helper applications page 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 need catdoc. * 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 standard version, has much trouble with non-western character sets. Check the Recoll helper applications page. * TeX files need untex or detex. Check the Recoll helper applications page 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: Recoll releases before 1.13 used the id3info command from the id3lib package to extract mp3 tag information, metaflac (standard flac tools) for flac files, and ogginfo (vorbis tools) for ogg files. Releases 1.14 and later use a single Python filter based on mutagen for all audio file types. * 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. * chm: files in microsoft help format need Python and the pychm module (which needs chmlib). * 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. * 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 filter, 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 filters need iconv and the standard sed and awk. ---------------------------------------------------------------------- 5.3. Building from source 5.3.1. Prerequisites C++ compiler. Up to Recoll version 1.13.04, its absence can manifest itself by strange messages about a missing iconv_open. 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. Development files for Qt . Development files for X11 and zlib. Check the Recoll download page for up to date version information. You will most probably be able to find a binary package for Qt for your system. You may have to compile Xapian but this is not difficult (if you are using FreeBSD, there is a port). You may also need libiconv. Recoll currently uses version 1.9 (this should not be critical). On Linux systems, the iconv interface is part of libc and you should not need to do anything special. ---------------------------------------------------------------------- 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. Depending on the Qt 3 configuration on your system, you may have to set the QTDIR and QMAKESPECS variables in your environment: * QTDIR should point to the directory above the one that holds the qt include files (ie: if qt.h is /usr/local/qt/include/qt.h, QTDIR should be /usr/local/qt). * QMAKESPECS should be set to the name of one of the Qt mkspecs sub-directories (ie: linux-g++). On many Linux systems, QTDIR is set by the login scripts, and QMAKESPECS is not needed because there is a default link in mkspecs/. Neither QTDIR nor QMAKESPECS should be needed with Qt 4, configuration details are entirely determined by qmake (which is quite often installed as qmake-qt4). Configure options: * --without-aspell will disable the code for phonetic matching of search terms. * --with-fam or --with-inotify will enable the code for real time indexing. Inotify support is enabled by default on recent Linux systems. * --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. * --enable-xattr will enable code to fetch data from file extended attributes. This is only useful is some application stores data in there, and also needs some simple configuration (see comments in the fields configuration file). * --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). * --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. * --disable-qtgui Disable the Qt interface. Will allow building the indexer and the command line search program in absence of a Qt environment. * --disable-x11mon Disable X11 connection monitoring inside recollindex. Together with --disable-qtgui, this allows building recoll without Qt and X11. * 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.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 define the parameters for one index. The configuration files can be edited by hand or through the Indexing 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. 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. 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: * 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. ---------------------------------------------------------------------- 5.4.1. Main configuration file 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.1.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 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 recoll_noindex variable in mimemap for an alternative approach which indexes the file names. 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 and FNM_LEADING_DIR flags. 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). 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. 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). 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 use the 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 mimemap file). This can be useful for files with suffix-less names, but it will also cause the indexing of many bogus "text" files. processbeaglequeue 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. beaglequeuedir 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. ---------------------------------------------------------------------- 5.4.1.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. 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. 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 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. ---------------------------------------------------------------------- 5.4.1.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 Beagle 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 Beagle web browser plugin indexing code, and defines the maximum size for the web page cache. Default: 40 MB. 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 depends on average document size. The default value is 10. ---------------------------------------------------------------------- 5.4.1.4. Miscellaneous parameters: 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. 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. filtermaxseconds Maximum filter execution time, after which it is aborted. Some postscript programs just loop... filtersdir 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 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. 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. ---------------------------------------------------------------------- 5.4.2. 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 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 filter-specific sections Some filters may need specific configuration for handling fields. Only the email message filter 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 filter 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 = [mail] # Extract the X-My-Tag mail header, and use it internally with the # mailmytag field name x-my-tag = mailmytag ---------------------------------------------------------------------- 5.4.3. 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. mimemap also has a recoll_noindex variable which is a list of suffixes. Matching files will be skipped (which avoids unnecessary decompressions or file executions). This is partially redundant with skippedNames in the main configuration file, with a few differences: it will not affect directories, it cannot be made dependant on the file-system location (it is a configuration-wide parameter), and the file names will still be indexed (not even the file names are indexed for patterns in skippedNames. recoll_noindex is used mostly for things known to be unindexable by a given Recoll version. Having it there avoids cluttering the more user-oriented and locally customized skippedNames. ---------------------------------------------------------------------- 5.4.4. 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.5. 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 user preferences dialog. If Use desktop preferences to choose document editor is checked in the Recoll GUI user preferences, all mimeview entries will be ignored except the one labelled application/x-all (which is set to use xdg-open by default). 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. Please note that these 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). * %F. Original file name. Same as %f except if a temporary file is used. * %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. * %M. Mime type * %U, %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.6. Examples of configuration adjustments 5.4.6.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: * 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 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.6.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): * 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 filter 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 a filter. ---------------------------------------------------------------------- recoll-1.17.3/VERSION000644 001750 000000 00000000007 11757430356 014544 0ustar00dockeswheel000000 000000 1.17.3 recoll-1.17.3/aspell/000755 001750 000000 00000000000 11740755063 014754 5ustar00dockeswheel000000 000000 recoll-1.17.3/bincimapmime/000755 001750 000000 00000000000 11757440614 016127 5ustar00dockeswheel000000 000000 recoll-1.17.3/common/000755 001750 000000 00000000000 11757440614 014765 5ustar00dockeswheel000000 000000 recoll-1.17.3/configure000755 001750 000000 00000613065 11755634533 015422 0ustar00dockeswheel000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for Recoll 1.17.2. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Recoll' PACKAGE_TARNAME='recoll' PACKAGE_VERSION='1.17.2' PACKAGE_STRING='Recoll 1.17.2' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="index/recollindex.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS RCLVERSION NOPYTHON NOPIC LIBQZEITGEIST QMAKE_DISABLE_ZEITGEIST QMAKE_ENABLE_ZEITGEIST QMAKE_DISABLE_WEBKIT QMAKE_ENABLE_WEBKIT NOCMDLINE NOQTMAKE HAVE_MKDTEMP XAPIANCXXFLAGS QTRECOLL_DATADIR QTGUI QMAKE LIBFAM LIBXAPIANSTATICEXTRA LIBXAPIANDIR LIBXAPIAN LIBICONV INCICONV X_LIBX11 X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS CXXCPP XMKMF QMAKEPATH XAPIAN_CONFIG aspellProg fileProg EGREP GREP CPP ac_ct_CC CFLAGS CC OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_largefile with_file_command with_aspell with_inotify with_fam enable_xattr enable_camelcase enable_python_module enable_pic enable_qtgui enable_webkit with_qzeitgeist enable_x11mon with_x ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP XMKMF CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures Recoll 1.17.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/recoll] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of Recoll 1.17.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-largefile omit support for large files --enable-xattr Enable fetching metadata from file extended attributes. This is only useful if some application creates them on (part of) your data set. You also need to set up appropriate mappings in the configuration. --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). --disable-python-module Do not build the Python module. --enable-pic Do not compile library objects as position independant code. This is incompatible with the php or python extensions. --disable-qtgui Disable the QT-based graphical user interface. --disable-webkit Disable use of qt-webkit. --disable-x11mon Disable recollindex support for X11 session monitoring. Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-file-command Specify version of 'file' command (ie: --with-file-command=/usr/local/bin/file) --without-aspell Disable use of aspell spelling package to provide term expansion to other spellings --with-inotify Use inotify for almost real time indexing of modified files. --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. --with-qzeitgeist Enable the use of the qzeitgeist library to send zeitgeist events. --with-x use the X Window System Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Recoll configure 1.17.2 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Recoll $as_me 1.17.2, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers common/autoconfig.h" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test C$CXX = C ; then as_fn_error $? "C++ compiler needed. Please install one (ie: gnu g++)" "$LINENO" 5 fi sys=`uname | tr / _` if test ! -f mk/$sys ; then { $as_echo "$as_me:${as_lineno-$LINENO}: No system configuration file found in mk/ for uname = '$sys'. Trying with Default file. If the build fails, you'll need to write a configuration file, starting from one of the existing ones." >&5 $as_echo "$as_me: No system configuration file found in mk/ for uname = '$sys'. Trying with Default file. If the build fails, you'll need to write a configuration file, starting from one of the existing ones." >&6;} sys=Default fi (cd mk; rm -f sysconf; ln -s $sys sysconf) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi # OpenBSD needs sys/param.h for mount.h to compile ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done for ac_header in sys/mount.h sys/statfs.h sys/statvfs.h sys/vfs.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_SYS_PARAM_H # include #endif " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Use specific 'file' command ? (Useful on solaris to specify # /usr/local/bin/file instead of the system's which doesn't understand '-i' # Check whether --with-file-command was given. if test "${with_file_command+set}" = set; then : withval=$with_file_command; withFileCommand=$withval else withFileCommand=file fi case $withFileCommand in file) # Extract the first word of "file", so it can be a program name with args. set dummy file; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_fileProg+:} false; then : $as_echo_n "(cached) " >&6 else case $fileProg in [\\/]* | ?:[\\/]*) ac_cv_path_fileProg="$fileProg" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_fileProg="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi fileProg=$ac_cv_path_fileProg if test -n "$fileProg"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $fileProg" >&5 $as_echo "$fileProg" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) fileProg=$withFileCommand;; esac if test ! -x "$fileProg"; then as_fn_error $? "$fileProg does not exist or is not executable" "$LINENO" 5 fi cat >>confdefs.h <<_ACEOF #define FILE_PROG "$fileProg" _ACEOF # 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 $as_echo "#define USE_SYSTEM_FILE_COMMAND 1" >>confdefs.h 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 # Check whether --with-aspell was given. if test "${with_aspell+set}" = set; then : withval=$with_aspell; withAspell=$withval else withAspell=yes fi case $withAspell in no);; yes) # Extract the first word of "aspell", so it can be a program name with args. set dummy aspell; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_aspellProg+:} false; then : $as_echo_n "(cached) " >&6 else case $aspellProg in [\\/]* | ?:[\\/]*) ac_cv_path_aspellProg="$aspellProg" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_aspellProg="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi aspellProg=$ac_cv_path_aspellProg if test -n "$aspellProg"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $aspellProg" >&5 $as_echo "$aspellProg" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) # The argument should be the path to the aspell program aspellProg=$withAspell ;; esac if test X$withAspell != Xno ; then $as_echo "#define RCL_USE_ASPELL 1" >>confdefs.h if test X$aspellProg != X ; then aspellBase=`dirname $aspellProg` aspellBase=`dirname $aspellBase` cat >>confdefs.h <<_ACEOF #define ASPELL_PROG "$aspellProg" _ACEOF if test -f $aspellBase/include/aspell.h ; then cat >>confdefs.h <<_ACEOF #define ASPELL_INCLUDE "$aspellBase/include/aspell.h" _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: aspell support enabled but aspell package not found. Compiling with internal aspell interface file" >&5 $as_echo "$as_me: aspell support enabled but aspell package not found. Compiling with internal aspell interface file" >&6;} $as_echo "#define ASPELL_INCLUDE \"aspell-local.h\"" >>confdefs.h fi else # aspell support enabled but no aspell install yet { $as_echo "$as_me:${as_lineno-$LINENO}: aspell support enabled but aspell package not found. Compiling with internal aspell interface file" >&5 $as_echo "$as_me: aspell support enabled but aspell package not found. Compiling with internal aspell interface file" >&6;} $as_echo "#define ASPELL_INCLUDE \"aspell-local.h\"" >>confdefs.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 # Check whether --with-inotify was given. if test "${with_inotify+set}" = set; then : withval=$with_inotify; withInotify=$withval else withInotify=$inot_default fi if test X$withInotify != Xno ; then { $as_echo "$as_me:${as_lineno-$LINENO}: enabled support for inotify monitoring" >&5 $as_echo "$as_me: enabled support for inotify monitoring" >&6;} $as_echo "#define RCL_MONITOR 1" >>confdefs.h $as_echo "#define RCL_USE_INOTIFY 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: inotify not found, inotify monitoring disabled" >&5 $as_echo "$as_me: inotify not found, inotify monitoring disabled" >&6;} fi # Real time monitoring with FAM # Check whether --with-fam was given. if test "${with_fam+set}" = set; then : withval=$with_fam; withFam=$withval else withFam=yes fi if test X$withFam != Xno -a X$withInotify != Xno ; then { $as_echo "$as_me:${as_lineno-$LINENO}: FAM support enabled but inotify support also enabled. Disabling FAM support and using inotify" >&5 $as_echo "$as_me: FAM support enabled but inotify support also enabled. Disabling FAM support and using inotify" >&6;} 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 { $as_echo "$as_me:${as_lineno-$LINENO}: FAM library not found, disabling FAM and real time indexing support" >&5 $as_echo "$as_me: FAM library not found, disabling FAM and real time indexing support" >&6;} withFam=no fi ;; *) # The argument should be the path to the fam library famLib=$withFam ;; esac if test X$withFam != Xno ; then $as_echo "#define RCL_MONITOR 1" >>confdefs.h $as_echo "#define RCL_USE_FAM 1" >>confdefs.h 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 as_fn_error $? "fam.h not found in $famBase/include. Specify --with-fam=no to disable fam support" "$LINENO" 5 fi LIBFAM="-L$famLibDir -l$famBLib" { $as_echo "$as_me:${as_lineno-$LINENO}: fam library directive: $LIBFAM" >&5 $as_echo "$as_me: fam library directive: $LIBFAM" >&6;} cat >>confdefs.h <<_ACEOF #define FAM_INCLUDE "$famBase/include/fam.h" _ACEOF else as_fn_error $? "fam library not found" "$LINENO" 5 fi fi # Enable use of file extended attributes. # Not by default as these are little used for now. # Check whether --enable-xattr was given. if test "${enable_xattr+set}" = set; then : enableval=$enable_xattr; xattrEnabled=$enableval else xattrEnabled=no fi if test X$xattrEnabled = Xyes ; then $as_echo "#define RCL_USE_XATTR 1" >>confdefs.h 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 # Check whether --enable-camelcase was given. if test "${enable_camelcase+set}" = set; then : enableval=$enable_camelcase; camelcaseEnabled=$enableval else camelcaseEnabled=no fi if test X$camelcaseEnabled = Xyes ; then $as_echo "#define RCL_SPLIT_CAMELCASE 1" >>confdefs.h fi # Disable building the python module. This is built by default, because # it's really the easiest way to interface and extend recoll. It forces PIC # objects for everything (indexing performance impact: 1%), because it's # just not worth building the lib twice # You can still have a non-pic recoll with: # configure --disable-python-module; make; make install;make clean # configure; make; cd python/recoll; make install # # Check whether --enable-python-module was given. if test "${enable_python_module+set}" = set; then : enableval=$enable_python_module; pythonEnabled=$enableval else pythonEnabled=yes fi if test X$pythonEnabled = Xyes ; then NOPYTHON="" else NOPYTHON="#" fi # Build PIC objects for the library ? # Check whether --enable-pic was given. if test "${enable_pic+set}" = set; then : enableval=$enable_pic; picEnabled=$enableval else picEnabled=forpython fi case $picEnabled in forpython) picEnabled=$pythonEnabled; NOPIC=$NOPYTHON;; yes) NOPIC="";; *) NOPIC="#";; esac if test X$pythonEnabled = Xyes -a X$picEnabled != Xyes; then as_fn_error $? "Python build needs PIC library" "$LINENO" 5 fi for ac_func in mkdtemp do : ac_fn_c_check_func "$LINENO" "mkdtemp" "ac_cv_func_mkdtemp" if test "x$ac_cv_func_mkdtemp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MKDTEMP 1 _ACEOF fi done ##### Look for iconv. This can exist in either libc (ie: Linux, solaris) or ##### libiconv. We'd need a --with-libiconv= option ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu LIBICONV="" S_LDFLAGS=$LDFLAGS S_CPPFLAGS=$CPPFLAGS for dir in ${libdir} /opt/local/lib /usr/local/lib ;do CPPFLAGS="$S_CPPFLAGS -I$dir/../include" LDFLAGS="$S_LDFLAGS -L$dir" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : LIBICONV="-L$dir";INCICONV=-I$dir/../include fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test A"$LIBICONV" != A ; then break fi LDFLAGS="$S_LDFLAGS -L$dir -liconv" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : LIBICONV="-L$dir -liconv";INCICONV=-I$dir/../include fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test A"$LIBICONV" != A ; then break fi done LDFLAGS=$S_LDFLAGS CPPFLAGS=$S_CPPFLAGS if test A"$LIBICONV" = A ; then as_fn_error $? "Cannot find iconv_open anywhere. Please install iconv" "$LINENO" 5 exit 1 fi #echo LIBICONV $LIBICONV #echo INCICONV $INCICONV CPPFLAGS="$CPPFLAGS $INCICONV" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type of inbuf parameter to iconv" >&5 $as_echo_n "checking for type of inbuf parameter to iconv... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv(0,(const char **)0,(size_t *)0,(char **)0,(size_t *)0); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : rcl_iconv_inbuf_const="1" else rcl_iconv_inbuf_const="0" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test X$rcl_iconv_inbuf_const = X1 ; then $as_echo "#define RCL_ICONV_INBUF_CONST 1" >>confdefs.h fi ############# Putenv { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type of string parameter to putenv" >&5 $as_echo_n "checking for type of string parameter to putenv... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { putenv((const char *)0); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : rcl_putenv_string_const="1" else rcl_putenv_string_const="0" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test X$rcl_putenv_string_const = X1 ; then $as_echo "#define PUTENV_ARG_CONST 1" >>confdefs.h fi #### Look for Xapian # Extract the first word of "xapian-config", so it can be a program name with args. set dummy xapian-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XAPIAN_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $XAPIAN_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_XAPIAN_CONFIG="$XAPIAN_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_XAPIAN_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_XAPIAN_CONFIG" && ac_cv_path_XAPIAN_CONFIG="no" ;; esac fi XAPIAN_CONFIG=$ac_cv_path_XAPIAN_CONFIG if test -n "$XAPIAN_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XAPIAN_CONFIG" >&5 $as_echo "$XAPIAN_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$XAPIAN_CONFIG" = "no" ; then as_fn_error $? "Cannot find xapian-config command in $PATH. Is xapian-core installed ?" "$LINENO" 5 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 # Also recent xapian libs need lz even when they think they don't... LIBXAPIAN="$LIBXAPIAN -lz" 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 #### 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. # # Check whether --enable-qtgui was given. if test "${enable_qtgui+set}" = set; then : enableval=$enable_qtgui; enableQT=$enableval else enableQT="yes" fi if test "$enableQT" != "yes" ; then NOQTMAKE="#" NOCMDLINE="" else NOQTMAKE="" NOCMDLINE="#" 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;; *) # Extract the first word of "$QMAKE", so it can be a program name with args. set dummy $QMAKE; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_QMAKEPATH+:} false; then : $as_echo_n "(cached) " >&6 else case $QMAKEPATH in [\\/]* | ?:[\\/]*) ac_cv_path_QMAKEPATH="$QMAKEPATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_QMAKEPATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_QMAKEPATH" && ac_cv_path_QMAKEPATH="NOTFOUND" ;; esac fi QMAKEPATH=$ac_cv_path_QMAKEPATH if test -n "$QMAKEPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKEPATH" >&5 $as_echo "$QMAKEPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; esac if test X$QMAKEPATH = XNOTFOUND ; then as_fn_error $? "Cannot find the qmake program. Maybe you need to install qt development files and tools and/or set the QTDIR environment variable?" "$LINENO" 5 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 # Discriminate qt3/4. Qt3 qmake prints its version on stderr but we don't # depend on this. We try to detect the qt 4 version string instead. qmakevers="`${QMAKE} --version 2>&1`" #echo "qmake version: $qmakevers" v4=`expr "$qmakevers" : '.*Qt *version *4.*'` if test X$v4 = X0 ; then as_fn_error $? "qmake seems to indincate using Qt version 3 which is not supported any more" "$LINENO" 5 QTGUI=qtgui else { $as_echo "$as_me:${as_lineno-$LINENO}: using qt version 4 user interface" >&5 $as_echo "$as_me: using qt version 4 user interface" >&6;} 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} recoll.pro if test $? != 0 ; then as_fn_error $? "Cannot use qmake to generate a Makefile. Maybe you need to check the QTDIR and QMAKESPEC environment variables?" "$LINENO" 5 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 as_fn_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" "$LINENO" 5 fi fi cd .. ##### Using Qt webkit for reslist display? Else Qt textbrowser # Check whether --enable-webkit was given. if test "${enable_webkit+set}" = set; then : enableval=$enable_webkit; enableWebkit=$enableval else enableWebkit="yes" fi 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 # Check whether --with-qzeitgeist was given. if test "${with_qzeitgeist+set}" = set; then : withval=$with_qzeitgeist; withQZeitgeist=$withval else withQZeitgeist="no" fi 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="$ac_config_files $QTGUI/recoll.pro" ##################### End QT stuff fi ### X11: this is needed for the session monitoring code (in recollindex -m) # Check whether --enable-x11mon was given. if test "${enable_x11mon+set}" = set; then : enableval=$enable_x11mon; enableX11mon=$enableval else enableX11mon="yes" fi if test X$withInotify = Xno -a X$withFam = Xno ; then enableX11mon=no fi if test "$enableX11mon" = "yes" ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cxx_werror_flag=$ac_xsave_cxx_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_cxx_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_cxx_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_cxx_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_cxx_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi X_LIBX11=-lX11 else $as_echo "#define DISABLE_X11MON 1" >>confdefs.h 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'" # We have to expand prefix in here, couldn't find a way to do it inside # the qt gui .pro file or Makefile. This just means that you can't change # prefix at build time. It works at install time because we dont' use the # qtgui Makefile m_prefix=$prefix test "X$m_prefix" = "XNONE" && m_prefix=/usr/local m_datadir=${m_prefix}/share QTRECOLL_DATADIR=${m_datadir}/recoll RCLVERSION=`cat VERSION` # All object files depend on localdefs which has the cc flags. Avoid # changing it unless necessary ac_config_files="$ac_config_files mk/localdefs.new:mk/localdefs.in" ac_config_files="$ac_config_files recollinstall" ac_config_files="$ac_config_files Makefile" ac_config_files="$ac_config_files sampleconf/recoll.conf" ac_config_files="$ac_config_files common/rclversion.h" ac_config_files="$ac_config_files python/recoll/setup.py" for d in bincimapmime index lib query do rm -f $d/alldeps.stamp cp -f /dev/null $d/alldeps done (cd lib;test -f Makefile && chmod +w Makefile;sh mkMake) cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Recoll $as_me 1.17.2, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Recoll config.status 1.17.2 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "common/autoconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS common/autoconfig.h" ;; "$QTGUI/recoll.pro") CONFIG_FILES="$CONFIG_FILES $QTGUI/recoll.pro" ;; "mk/localdefs.new") CONFIG_FILES="$CONFIG_FILES mk/localdefs.new:mk/localdefs.in" ;; "recollinstall") CONFIG_FILES="$CONFIG_FILES recollinstall" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "sampleconf/recoll.conf") CONFIG_FILES="$CONFIG_FILES sampleconf/recoll.conf" ;; "common/rclversion.h") CONFIG_FILES="$CONFIG_FILES common/rclversion.h" ;; "python/recoll/setup.py") CONFIG_FILES="$CONFIG_FILES python/recoll/setup.py" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if cmp -s mk/localdefs mk/localdefs.new ; then rm -f mk/localdefs.new else mv -f mk/localdefs.new mk/localdefs fi recoll-1.17.3/configure.ac000644 001750 000000 00000042634 11743463357 016000 0ustar00dockeswheel000000 000000 AC_INIT([Recoll], m4_esyscmd_s(cat VERSION)) AC_CONFIG_HEADERS([common/autoconfig.h]) AC_PREREQ(2.53) AC_CONFIG_SRCDIR(index/recollindex.cpp) AC_PROG_CXX if test C$CXX = C ; then AC_MSG_ERROR([C++ compiler needed. Please install one (ie: gnu g++)]) fi sys=`uname | tr / _` if test ! -f mk/$sys ; then AC_MSG_NOTICE([ No system configuration file found in mk/ for uname = '$sys'. Trying with Default file. If the build fails, you'll need to write a configuration file, starting from one of the existing ones.]) sys=Default fi (cd mk; rm -f sysconf; ln -s $sys sysconf) AC_SYS_LARGEFILE # OpenBSD needs sys/param.h for mount.h to compile AC_CHECK_HEADERS([sys/param.h]) 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.]), 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 file extended attributes. # Not by default as these are little used for now. AC_ARG_ENABLE(xattr, AC_HELP_STRING([--enable-xattr], [Enable fetching metadata from file extended attributes. This is only useful if some application creates them on (part of) your data set. You also need to set up appropriate mappings in the configuration.]), xattrEnabled=$enableval, xattrEnabled=no) if test X$xattrEnabled = Xyes ; then AC_DEFINE(RCL_USE_XATTR, 1, [Use file extended attributes]) 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. This is built by default, because # it's really the easiest way to interface and extend recoll. It forces PIC # objects for everything (indexing performance impact: 1%), because it's # just not worth building the lib twice # You can still have a non-pic recoll with: # configure --disable-python-module; make; make install;make clean # configure; make; cd python/recoll; make install # AC_ARG_ENABLE(python-module, AC_HELP_STRING([--disable-python-module], [Do not build the Python module.]), pythonEnabled=$enableval, pythonEnabled=yes) if test X$pythonEnabled = Xyes ; then NOPYTHON="" else NOPYTHON="#" fi # Build PIC objects for the library ? AC_ARG_ENABLE(pic, AC_HELP_STRING([--enable-pic], [Do not compile library objects as position independant code. This is incompatible with the php or python extensions.]), picEnabled=$enableval, picEnabled=forpython) case $picEnabled in forpython) picEnabled=$pythonEnabled; NOPIC=$NOPYTHON;; yes) NOPIC="";; *) NOPIC="#";; esac if test X$pythonEnabled = Xyes -a X$picEnabled != Xyes; then AC_MSG_ERROR([Python build needs PIC library]) fi AC_CHECK_FUNCS(mkdtemp) ##### 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_LDFLAGS=$LDFLAGS S_CPPFLAGS=$CPPFLAGS for dir in ${libdir} /opt/local/lib /usr/local/lib ;do CPPFLAGS="$S_CPPFLAGS -I$dir/../include" LDFLAGS="$S_LDFLAGS -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 LDFLAGS="$S_LDFLAGS -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 LDFLAGS=$S_LDFLAGS 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 AC_PATH_PROG(XAPIAN_CONFIG, xapian-config, no) 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 # Also recent xapian libs need lz even when they think they don't... LIBXAPIAN="$LIBXAPIAN -lz" 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 #### 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") if test "$enableQT" != "yes" ; then NOQTMAKE="#" NOCMDLINE="" else NOQTMAKE="" NOCMDLINE="#" 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 # Discriminate qt3/4. Qt3 qmake prints its version on stderr but we don't # depend on this. We try to detect the qt 4 version string instead. qmakevers="`${QMAKE} --version 2>&1`" #echo "qmake version: $qmakevers" v4=`expr "$qmakevers" : '.*Qt[ ][ ]*version[ ][ ]*4.*'` if test X$v4 = X0 ; then AC_MSG_ERROR([qmake seems to indincate using Qt version 3 which is not supported any more]) QTGUI=qtgui else AC_MSG_NOTICE([using qt version 4 user interface]) 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} 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 cd .. ##### Using Qt webkit for reslist display? Else Qt textbrowser AC_ARG_ENABLE(webkit, AC_HELP_STRING([--disable-webkit], [Disable use of qt-webkit.]), 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'" # We have to expand prefix in here, couldn't find a way to do it inside # the qt gui .pro file or Makefile. This just means that you can't change # prefix at build time. It works at install time because we dont' use the # qtgui Makefile m_prefix=$prefix test "X$m_prefix" = "XNONE" && m_prefix=/usr/local m_datadir=${m_prefix}/share QTRECOLL_DATADIR=${m_datadir}/recoll RCLVERSION=`cat VERSION` 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(QTRECOLL_DATADIR) AC_SUBST(XAPIANCXXFLAGS) AC_SUBST(HAVE_MKDTEMP) AC_SUBST(NOQTMAKE) AC_SUBST(NOCMDLINE) 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(NOPIC) AC_SUBST(NOPYTHON) AC_SUBST(RCLVERSION) # All object files depend on localdefs which has the cc flags. Avoid # changing it unless necessary AC_CONFIG_FILES(mk/localdefs.new:mk/localdefs.in) AC_CONFIG_FILES(recollinstall) AC_CONFIG_FILES(Makefile) AC_CONFIG_FILES(sampleconf/recoll.conf) AC_CONFIG_FILES(common/rclversion.h) AC_CONFIG_FILES(python/recoll/setup.py) for d in bincimapmime index lib query do rm -f $d/alldeps.stamp cp -f /dev/null $d/alldeps done (cd lib;test -f Makefile && chmod +w Makefile;sh mkMake) AC_OUTPUT if cmp -s mk/localdefs mk/localdefs.new ; then rm -f mk/localdefs.new else mv -f mk/localdefs.new mk/localdefs fi recoll-1.17.3/desktop/000755 001750 000000 00000000000 11740755063 015145 5ustar00dockeswheel000000 000000 recoll-1.17.3/doc/000755 001750 000000 00000000000 11740755063 014241 5ustar00dockeswheel000000 000000 recoll-1.17.3/filters/000755 001750 000000 00000000000 11757440614 015145 5ustar00dockeswheel000000 000000 recoll-1.17.3/index/000755 001750 000000 00000000000 11757440614 014604 5ustar00dockeswheel000000 000000 recoll-1.17.3/internfile/000755 001750 000000 00000000000 11757427702 015637 5ustar00dockeswheel000000 000000 recoll-1.17.3/kde/000755 001750 000000 00000000000 11740755063 014237 5ustar00dockeswheel000000 000000 recoll-1.17.3/lib/000755 001750 000000 00000000000 11757440614 014243 5ustar00dockeswheel000000 000000 recoll-1.17.3/makestaticdist.sh000644 001750 000000 00000003636 11740755063 017051 0ustar00dockeswheel000000 000000 #!/bin/sh #set -x # A shell-script to make a recoll static binary distribution: fatal() { echo $*;exit 1 } TAR=tar targetdir=${targetdir-/tmp} if test ! -d qtgui;then echo "Should be executed in the master recoll directory" exit 1 fi version=`cat VERSION` sys=`uname -s` sysrel=`uname -r` qtguiassign=`egrep '^QTGUI=' recollinstall` stripassign=`egrep '^STRIP=' recollinstall` test ! -z "$qtguiassign" || fatal "Can't find qt version" test ! -z "$stripassign" || fatal "Can't find strip string" eval $qtguiassign eval $stripassign echo "QTGUI: " $QTGUI "STRIP: " $STRIP topdirsimple=recoll-${version}-${sys}-${sysrel} topdir=$targetdir/$topdirsimple tarfile=$targetdir/recoll-${version}-${sys}-${sysrel}.tgz if test ! -d $topdir ; then mkdir $topdir || exit 1 else echo "Removing everything under $topdir Ok ? (y/n)" read rep if test $rep = 'y';then rm -rf $topdir/* else exit 1 fi fi rm -f index/recollindex ${QTGUI}/recoll make static || exit 1 ${STRIP} index/recollindex ${QTGUI}/recoll files=" COPYING INSTALL Makefile README VERSION desktop desktop/recoll-searchgui.desktop desktop/recoll.png doc/man doc/user filters index/rclmon.sh index/recollindex qtgui/i18n/*.qm qtgui/images qtgui/mtpics/*.png qtgui/recoll recollinstall sampleconf " $TAR chf - $files | (cd $topdir; $TAR xf -) # Remove any install dependancy chmod +w $topdir/Makefile || exit 1 sed -e '/^install:/c\ install: ' < $topdir/Makefile > $topdir/toto && \ mv $topdir/toto $topdir/Makefile # Clean up .svn directories from target. This would be easier with a # --exclude tar option, but we want this to work with non-gnu tars cd $topdir || exit 1 svndirs=`find . -name .svn -print` echo "In: `pwd`. Removing $svndirs ok ?" read rep test "$rep" = 'y' -o "$rep" = 'Y' && rm -rf $svndirs cd $targetdir (cd $targetdir ; \ $TAR chf - $topdirsimple | \ gzip > $tarfile) echo $tarfile created recoll-1.17.3/mk/000755 001750 000000 00000000000 11757440673 014111 5ustar00dockeswheel000000 000000 recoll-1.17.3/php/000755 001750 000000 00000000000 11740755063 014263 5ustar00dockeswheel000000 000000 recoll-1.17.3/python/000755 001750 000000 00000000000 11740755063 015015 5ustar00dockeswheel000000 000000 recoll-1.17.3/qtgui/000755 001750 000000 00000000000 11757440614 014626 5ustar00dockeswheel000000 000000 recoll-1.17.3/query/000755 001750 000000 00000000000 11757440614 014642 5ustar00dockeswheel000000 000000 recoll-1.17.3/rcldb/000755 001750 000000 00000000000 11740755063 014562 5ustar00dockeswheel000000 000000 recoll-1.17.3/sampleconf/000755 001750 000000 00000000000 11757440614 015624 5ustar00dockeswheel000000 000000 recoll-1.17.3/recollinstall.in000755 001750 000000 00000010143 11743463066 016677 0ustar00dockeswheel000000 000000 #!/bin/sh # Install recoll files. fatal() { echo $* exit 1 } usage() { fatal 'Usage: recollinstall [], ie: recollinstall /usr/local' } if test $# -eq 0 ; then PREFIX=@prefix@ elif test $# -eq 1 ; then PREFIX=$1 else usage fi QTGUI=@QTGUI@ # The .qm files are in qtgui/i18n even if qt4 is used I18N=qtgui/i18n test -n "$bindir" || bindir=${PREFIX}/bin test -n "$datadir" || datadir=${PREFIX}/share if test -z "$mandir" ; then if test -d ${PREFIX}/man ; then mandir=${PREFIX}/man else mandir=${datadir}/man fi fi REALPREFIX=$PREFIX ROOTFORPYTHON="" if test -n "$DESTDIR" ; then PREFIX=$DESTDIR/$PREFIX bindir=$DESTDIR/$bindir datadir=$DESTDIR/$datadir mandir=$DESTDIR/$mandir ROOTFORPYTHON="--root=${DESTDIR}" fi echo "Installing to $PREFIX" # Note: solaris 'install' does not understand -v INSTALL=${INSTALL:="install -c"} STRIP=${STRIP:=strip} sys=`uname` @NOQTMAKE@if test "$sys" = Darwin ; then @NOQTMAKE@ RECOLLPROG=${QTGUI}/recoll.app/Contents/MacOS/recoll @NOQTMAKE@else @NOQTMAKE@ RECOLLPROG=${QTGUI}/recoll @NOQTMAKE@fi TESTPROG=index/recollindex test -x $TESTPROG || fatal "$TESTPROG does not exist." \ " You need to build first (type 'make')." for d in \ ${bindir} \ ${mandir}/man1 \ ${mandir}/man5 \ ${datadir}/icons \ ${datadir}/recoll/doc \ ${datadir}/recoll/examples \ ${datadir}/recoll/filters \ ${datadir}/recoll/images \ ${datadir}/recoll/translations \ ${datadir}/icons/hicolor/48x48/apps \ ${datadir}/pixmaps do test -d $d || mkdir -p $d || exit 1 done @NOQTMAKE@test -d ${datadir}/applications \ @NOQTMAKE@ || mkdir -p ${datadir}/applications || exit 1 # Use the xdg utilies to install the desktop file and icon? Couldn't find # out how to get this to work sanely. So keep the old way #PATH=$PATH:desktop/xdg-utils-1.0.1/scripts #export PATH #xdg-desktop-menu install desktop/recoll-searchgui.desktop #xdg-icon-resource install --size 48 desktop/recoll.png @NOQTMAKE@${INSTALL} -m 0444 desktop/recoll-searchgui.desktop ${datadir}/applications @NOQTMAKE@${INSTALL} -m 0444 desktop/recoll.png ${datadir}/icons/hicolor/48x48/apps @NOQTMAKE@${INSTALL} -m 0444 desktop/recoll.png ${datadir}/pixmaps/ if test -f doc/user/usermanual.html ; then ${INSTALL} -m 0444 doc/user/usermanual.html doc/user/docbook.css \ ${datadir}/recoll/doc else echo "User manual not found -> not installed" fi @NOQTMAKE@${INSTALL} -m 0444 doc/man/recoll.1 ${mandir}/man1/ @NOCMDLINE@${INSTALL} -m 0444 doc/man/recollq.1 ${mandir}/man1/ ${INSTALL} -m 0444 doc/man/recollindex.1 ${mandir}/man1/ ${INSTALL} -m 0444 doc/man/recoll.conf.5 ${mandir}/man5/ @NOQTMAKE@${INSTALL} -m 0755 ${RECOLLPROG} ${bindir} || exit 1 @NOQTMAKE@${STRIP} ${bindir}/recoll @NOCMDLINE@${INSTALL} -m 0755 query/recollq ${bindir} || exit 1 @NOCMDLINE@${STRIP} ${bindir}/recollq ${INSTALL} -m 0755 index/recollindex ${bindir} || exit 1 ${STRIP} ${bindir}/recollindex ${INSTALL} -m 0755 filters/rcl* ${datadir}/recoll/filters/ || exit 1 for f in rclexecm.py rcllatinstops.zip;do chmod 644 ${datadir}/recoll/filters/$f done ${INSTALL} -m 0755 desktop/xdg-utils-1.0.1/scripts/xdg-open \ ${datadir}/recoll/filters/ || exit 1 ${INSTALL} -m 0755 desktop/hotrecoll.py \ ${datadir}/recoll/filters/ || exit 1 ${INSTALL} -m 0444 \ desktop/recollindex.desktop \ sampleconf/mimeconf \ sampleconf/mimeview \ sampleconf/recoll.conf \ sampleconf/mimemap \ sampleconf/fields \ sampleconf/recoll.qss \ ${datadir}/recoll/examples/ || exit 1 ${INSTALL} -m 0755 index/rclmon.sh ${datadir}/recoll/examples/ || exit 1 ${INSTALL} -m 0444 qtgui/mtpics/*.png ${datadir}/recoll/images || exit 1 ${INSTALL} -m 0444 ${I18N}/recoll*.qm ${datadir}/recoll/translations || exit 1 # Install the simplified chinese file as just chinese until I can understand # if it's possible to have both. zh_CN doesn't seem to work ${INSTALL} -m 0444 ${I18N}/recoll_zh_CN.qm \ ${datadir}/recoll/translations/recoll_zh.qm || exit 1 @NOPYTHON@(cd python/recoll;python setup.py install \ @NOPYTHON@ --prefix=${REALPREFIX} ${ROOTFORPYTHON}) recoll-1.17.3/unac/000755 001750 000000 00000000000 11740755063 014422 5ustar00dockeswheel000000 000000 recoll-1.17.3/utils/000755 001750 000000 00000000000 11746770633 014642 5ustar00dockeswheel000000 000000 recoll-1.17.3/utils/Makefile000644 001750 000000 00000012053 11740755063 016275 0ustar00dockeswheel000000 000000 depth = .. include $(depth)/mk/sysconf PROGS = trecrontab #trnetcon trcopyfile trcircache trmd5 trreadfile trfileudi \ #trconftree wipedir smallut trfstreewalk trpathut transcode trbase64 \ #trmimeparse trexecmd utf8iter idfile all: $(PROGS) $(BIGLIB) $(BIGLIB): force cd $(depth)/lib;$(MAKE) force: ECRONTAB_OBJS= trecrontab.o $(BIGLIB) trecrontab : $(ECRONTAB_OBJS) $(CXX) -o trecrontab $(ECRONTAB_OBJS) $(LIBICONV) \ $(LIBSYS) trecrontab.o : ecrontab.cpp ecrontab.h $(CXX) -o trecrontab.o -c $(ALL_CXXFLAGS) \ -DTEST_ECRONTAB ecrontab.cpp FSTREEWALK_OBJS= trfstreewalk.o $(BIGLIB) trfstreewalk : $(FSTREEWALK_OBJS) $(CXX) -o trfstreewalk $(FSTREEWALK_OBJS) $(LIBICONV) \ $(LIBSYS) trfstreewalk.o : fstreewalk.cpp fstreewalk.h $(CXX) -o trfstreewalk.o -c $(ALL_CXXFLAGS) \ -DTEST_FSTREEWALK fstreewalk.cpp READFILE_OBJS= trreadfile.o $(BIGLIB) trreadfile : $(READFILE_OBJS) $(CXX) -o trreadfile $(READFILE_OBJS) $(LIBICONV) $(LIBSYS) trreadfile.o : readfile.cpp readfile.h $(CXX) -o trreadfile.o -c $(ALL_CXXFLAGS) \ -DTEST_READFILE readfile.cpp CIRCACHE_OBJS= trcircache.o $(BIGLIB) trcircache : $(CIRCACHE_OBJS) $(CXX) -o trcircache $(CIRCACHE_OBJS) $(LIBICONV) $(LIBSYS) -lz trcircache.o : circache.cpp circache.h $(CXX) -o trcircache.o -c $(ALL_CXXFLAGS) \ -DTEST_CIRCACHE circache.cpp COPYFILE_OBJS= trcopyfile.o $(BIGLIB) trcopyfile : $(COPYFILE_OBJS) $(CXX) -o trcopyfile $(COPYFILE_OBJS) $(LIBICONV) $(LIBSYS) trcopyfile.o : copyfile.cpp copyfile.h $(CXX) -o trcopyfile.o -c $(ALL_CXXFLAGS) \ -DTEST_COPYFILE copyfile.cpp MD5_OBJS= trmd5.o $(BIGLIB) trmd5 : $(MD5_OBJS) $(CXX) -o trmd5 $(MD5_OBJS) $(LIBICONV) $(LIBSYS) trmd5.o : md5.cpp md5.h $(CXX) -o trmd5.o -c $(ALL_CXXFLAGS) -DTEST_MD5 md5.cpp PATHUT_OBJS= trpathut.o $(BIGLIB) trpathut : $(PATHUT_OBJS) $(CXX) $(ALL_CXXFLAGS) -o trpathut $(PATHUT_OBJS) $(LIBICONV) $(LIBSYS) trpathut.o : pathut.cpp pathut.h $(CXX) -o trpathut.o -c $(ALL_CXXFLAGS) -DTEST_PATHUT pathut.cpp NETCON_OBJS= trnetcon.o $(BIGLIB) trnetcon : $(NETCON_OBJS) $(CXX) $(ALL_CXXFLAGS) -o trnetcon $(NETCON_OBJS) $(LIBICONV) $(LIBSYS) trnetcon.o : netcon.cpp netcon.h $(CXX) -o trnetcon.o -c $(ALL_CXXFLAGS) -DTEST_NETCON netcon.cpp FILEUDI_OBJS= trfileudi.o $(BIGLIB) trfileudi : $(FILEUDI_OBJS) $(CXX) $(ALL_CXXFLAGS) -o trfileudi $(FILEUDI_OBJS) trfileudi.o : fileudi.cpp fileudi.h $(CXX) -o trfileudi.o -c $(ALL_CXXFLAGS) -DTEST_FILEUDI fileudi.cpp EXECMD_OBJS= trexecmd.o $(BIGLIB) trexecmd : $(EXECMD_OBJS) $(CXX) $(ALL_CXXFLAGS) -o trexecmd $(EXECMD_OBJS) $(LIBICONV) $(LIBSYS) trexecmd.o : execmd.cpp execmd.h $(CXX) -o trexecmd.o -c $(ALL_CXXFLAGS) -DTEST_EXECMD execmd.cpp TRANSCODE_OBJS= trtranscode.o $(BIGLIB) transcode : $(TRANSCODE_OBJS) $(CXX) $(ALL_CXXFLAGS) -o transcode $(TRANSCODE_OBJS) \ $(LIBICONV) $(LIBSYS) trtranscode.o : transcode.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_TRANSCODE -c -o trtranscode.o \ transcode.cpp IDFILE_OBJS= tridfile.o $(BIGLIB) idfile : $(IDFILE_OBJS) $(CXX) $(ALL_CXXFLAGS) -o idfile $(IDFILE_OBJS) \ $(LIBICONV) $(LIBSYS) tridfile.o : idfile.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_IDFILE -c -o tridfile.o \ idfile.cpp MIMEPARSE_OBJS= trmimeparse.o $(BIGLIB) trmimeparse : $(MIMEPARSE_OBJS) $(CXX) $(ALL_CXXFLAGS) -o trmimeparse $(MIMEPARSE_OBJS) \ $(LIBICONV) $(LIBSYS) trmimeparse.o : mimeparse.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_MIMEPARSE -c -o trmimeparse.o \ mimeparse.cpp SMALLUT_OBJS= trsmallut.o ../lib/smallut.o smallut : $(SMALLUT_OBJS) smallut.h $(CXX) $(ALL_CXXFLAGS) -o smallut $(SMALLUT_OBJS) $(LIBICONV) trsmallut.o : smallut.cpp smallut.h $(CXX) $(ALL_CXXFLAGS) -DTEST_SMALLUT -c -o trsmallut.o \ smallut.cpp ../lib/smallut.o: smallut.cpp smallut.h cd ../lib;make smallut.o WIPEDIR_OBJS= trwipedir.o $(BIGLIB) wipedir : $(WIPEDIR_OBJS) $(CXX) $(ALL_CXXFLAGS) -o wipedir $(WIPEDIR_OBJS) $(LIBICONV) $(LIBSYS) trwipedir.o : wipedir.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_WIPEDIR -c -o trwipedir.o wipedir.cpp UTF8ITER_OBJS= trutf8iter.o utf8iter : $(UTF8ITER_OBJS) $(CXX) $(ALL_CXXFLAGS) -o utf8iter $(UTF8ITER_OBJS) $(BIGLIB) \ $(LIBICONV) $(LIBSYS) trutf8iter.o : utf8iter.cpp utf8iter.h $(CXX) $(ALL_CXXFLAGS) -DTEST_UTF8ITER -c -o trutf8iter.o utf8iter.cpp CONFTREE_OBJS= trconftree.o $(BIGLIB) trconftree : $(CONFTREE_OBJS) $(CXX) $(ALL_CXXFLAGS) -o trconftree $(CONFTREE_OBJS) \ $(LIBICONV) $(LIBSYS) trconftree.o : conftree.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_CONFTREE -c -o trconftree.o conftree.cpp BASE64_OBJS= trbase64.o $(BIGLIB) trbase64 : $(BASE64_OBJS) $(CXX) $(ALL_CXXFLAGS) -o trbase64 $(BASE64_OBJS) trbase64.o : base64.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_BASE64 -c -o trbase64.o base64.cpp X11MON_OBJS= trx11mon.o x11mon.o trx11mon : $(X11MON_OBJS) $(CXX) $(ALL_CXXFLAGS) -o trx11mon $(X11MON_OBJS) -L/usr/X11R6/lib -lX11 trx11mon.o : x11mon.cpp x11mon.h $(CXX) -o trx11mon.o -c $(ALL_CXXFLAGS) -DTEST_X11MON x11mon.cpp x11mon.o: x11mon.cpp $(CXX) -c -I/usr/X11R6/include $(ALL_CXXFLAGS) x11mon.cpp clean: rm -f *.o $(PROGS) recoll-1.17.3/utils/base64.cpp000644 001750 000000 00000024515 11740755063 016433 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #ifndef NO_NAMESPACES using std::string; #endif /* NO_NAMESPACES */ #undef DEBUG_BASE64 #ifdef DEBUG_BASE64 #define DPRINT(X) fprintf X #else #define DPRINT(X) #endif // This is adapted from FreeBSD's code, quite modified for performance. // Tests on a Mac pro 2.1G with a 166MB base64 file // // The original version used strchr to lookup the base64 value from // the input code: // real 0m13.053s user 0m12.574s sys 0m0.471s // Using a direct access, 256 entries table: // real 0m3.073s user 0m2.600s sys 0m0.439s // Using a variable to hold the array length (instead of in.length()): // real 0m2.972s user 0m2.527s sys 0m0.433s // Using values from the table instead of isspace() (final) // real 0m2.513s user 0m2.059s sys 0m0.439s // // The table has one entry per char value (0-256). Invalid base64 // chars take value 256, whitespace 255, Pad ('=') 254. // Valid char points contain their base64 value (0-63) static const int b64values[] = { /* 0 */ 256,/* 1 */ 256,/* 2 */ 256,/* 3 */ 256,/* 4 */ 256, /* 5 */ 256,/* 6 */ 256,/* 7 */ 256,/* 8 */ 256, /*9 ht */ 255,/* 10 nl */ 255,/* 11 vt */ 255,/* 12 np/ff*/ 255,/* 13 cr */ 255, /* 14 */ 256,/* 15 */ 256,/* 16 */ 256,/* 17 */ 256,/* 18 */ 256,/* 19 */ 256, /* 20 */ 256,/* 21 */ 256,/* 22 */ 256,/* 23 */ 256,/* 24 */ 256,/* 25 */ 256, /* 26 */ 256,/* 27 */ 256,/* 28 */ 256,/* 29 */ 256,/* 30 */ 256,/* 31 */ 256, /* 32 sp */ 255, /* ! */ 256,/* " */ 256,/* # */ 256,/* $ */ 256,/* % */ 256, /* & */ 256,/* ' */ 256,/* ( */ 256,/* ) */ 256,/* * */ 256, /* + */ 62, /* , */ 256,/* - */ 256,/* . */ 256, /* / */ 63, /* 0 */ 52,/* 1 */ 53,/* 2 */ 54,/* 3 */ 55,/* 4 */ 56,/* 5 */ 57,/* 6 */ 58, /* 7 */ 59,/* 8 */ 60,/* 9 */ 61, /* : */ 256,/* ; */ 256,/* < */ 256, /* = */ 254, /* > */ 256,/* ? */ 256,/* @ */ 256, /* A */ 0,/* B */ 1,/* C */ 2,/* D */ 3,/* E */ 4,/* F */ 5,/* G */ 6,/* H */ 7, /* I */ 8,/* J */ 9,/* K */ 10,/* L */ 11,/* M */ 12,/* N */ 13,/* O */ 14, /* P */ 15,/* Q */ 16,/* R */ 17,/* S */ 18,/* T */ 19,/* U */ 20,/* V */ 21, /* W */ 22,/* X */ 23,/* Y */ 24,/* Z */ 25, /* [ */ 256,/* \ */ 256,/* ] */ 256,/* ^ */ 256,/* _ */ 256,/* ` */ 256, /* a */ 26,/* b */ 27,/* c */ 28,/* d */ 29,/* e */ 30,/* f */ 31,/* g */ 32, /* h */ 33,/* i */ 34,/* j */ 35,/* k */ 36,/* l */ 37,/* m */ 38,/* n */ 39, /* o */ 40,/* p */ 41,/* q */ 42,/* r */ 43,/* s */ 44,/* t */ 45,/* u */ 46, /* v */ 47,/* w */ 48,/* x */ 49,/* y */ 50,/* z */ 51, /* { */ 256,/* | */ 256,/* } */ 256,/* ~ */ 256, 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256, }; static const char Base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char Pad64 = '='; bool base64_decode(const string& in, string& out) { int io = 0, state = 0, ch = 0; unsigned int ii = 0; out.erase(); size_t ilen = in.length(); out.reserve(ilen); for (ii = 0; ii < ilen; ii++) { ch = (unsigned char)in[ii]; int value = b64values[ch]; if (value == 255) /* Skip whitespace anywhere. */ continue; if (ch == Pad64) break; if (value == 256) { /* A non-base64 character. */ DPRINT((stderr, "base64_dec: non-base64 char at pos %d\n", ii)); return false; } switch (state) { case 0: out += value << 2; state = 1; break; case 1: out[io] |= value >> 4; out += (value & 0x0f) << 4 ; io++; state = 2; break; case 2: out[io] |= value >> 2; out += (value & 0x03) << 6; io++; state = 3; break; case 3: out[io] |= value; io++; state = 0; break; default: fprintf(stderr, "base64_dec: internal!bad state!\n"); return false; } } /* * We are done decoding Base-64 chars. Let's see if we ended * on a byte boundary, and/or with erroneous trailing characters. */ if (ch == Pad64) { /* We got a pad char. */ ch = in[ii++]; /* Skip it, get next. */ switch (state) { case 0: /* Invalid = in first position */ case 1: /* Invalid = in second position */ DPRINT((stderr, "base64_dec: pad char in state 0/1\n")); return false; case 2: /* Valid, means one byte of info */ /* Skip any number of spaces. */ for (; ii < in.length(); ch = in[ii++]) if (!isspace((unsigned char)ch)) break; /* Make sure there is another trailing = sign. */ if (ch != Pad64) { DPRINT((stderr, "base64_dec: missing pad char!\n")); // Well, there are bad encoders out there. Let it pass // return false; } ch = in[ii++]; /* Skip the = */ /* Fall through to "single trailing =" case. */ /* FALLTHROUGH */ case 3: /* Valid, means two bytes of info */ /* * We know this char is an =. Is there anything but * whitespace after it? */ for (; ii < in.length(); ch = in[ii++]) if (!isspace((unsigned char)ch)) { DPRINT((stderr, "base64_dec: non-white at eod: 0x%x\n", (unsigned int)((unsigned char)ch))); // Well, there are bad encoders out there. Let it pass //return false; } /* * Now make sure for cases 2 and 3 that the "extra" * bits that slopped past the last full byte were * zeros. If we don't check them, they become a * subliminal channel. */ if (out[io] != 0) { DPRINT((stderr, "base64_dec: bad extra bits!\n")); // Well, there are bad encoders out there. Let it pass out[io] = 0; // return false; } // We've appended an extra 0. out.resize(io); } } else { /* * We ended by seeing the end of the string. Make sure we * have no partial bytes lying around. */ if (state != 0) { DPRINT((stderr, "base64_dec: bad final state\n")); return false; } } DPRINT((stderr, "base64_dec: ret ok, io %d sz %d len %d value [%s]\n", io, (int)out.size(), (int)out.length(), out.c_str())); return true; } #undef Assert #define Assert(X) void base64_encode(const string &in, string &out) { unsigned char input[3]; unsigned char output[4]; out.erase(); int srclength = in.length(); int sidx = 0; while (2 < srclength) { input[0] = in[sidx++]; input[1] = in[sidx++]; input[2] = in[sidx++]; srclength -= 3; output[0] = input[0] >> 2; output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); output[3] = input[2] & 0x3f; Assert(output[0] < 64); Assert(output[1] < 64); Assert(output[2] < 64); Assert(output[3] < 64); out += Base64[output[0]]; out += Base64[output[1]]; out += Base64[output[2]]; out += Base64[output[3]]; } /* Now we worry about padding. */ if (0 != srclength) { /* Get what's left. */ input[0] = input[1] = input[2] = '\0'; for (int i = 0; i < srclength; i++) input[i] = in[sidx++]; output[0] = input[0] >> 2; output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); Assert(output[0] < 64); Assert(output[1] < 64); Assert(output[2] < 64); out += Base64[output[0]]; out += Base64[output[1]]; if (srclength == 1) out += Pad64; else out += Base64[output[2]]; out += Pad64; } return; } #ifdef TEST_BASE64 #include #include #include "readfile.h" const char *thisprog; static char usage [] = "testfile\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_i 0x2 #define OPT_P 0x4 int main(int argc, char **argv) { thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'i': op_flags |= OPT_i; break; default: Usage(); break; } argc--; argv++; } if (op_flags & OPT_i) { const char *values[] = {"", "1", "12", "123", "1234", "12345", "123456"}; int nvalues = sizeof(values) / sizeof(char *); string in, out, back; int err = 0; for (int i = 0; i < nvalues; i++) { in = values[i]; base64_encode(in, out); base64_decode(out, back); if (in != back) { fprintf(stderr, "In [%s] %d != back [%s] %d (out [%s] %d\n", in.c_str(), int(in.length()), back.c_str(), int(back.length()), out.c_str(), int(out.length()) ); err++; } } in.erase(); in += char(0); in += char(0); in += char(0); in += char(0); base64_encode(in, out); base64_decode(out, back); if (in != back) { fprintf(stderr, "In [%s] %d != back [%s] %d (out [%s] %d\n", in.c_str(), int(in.length()), back.c_str(), int(back.length()), out.c_str(), int(out.length()) ); err++; } exit(!(err == 0)); } else { if (argc > 1) Usage(); string infile; if (argc == 1) infile = *argv++;argc--; string idata, reason; if (!file_to_string(infile, idata, &reason)) { fprintf(stderr, "Can't read file: %s\n", reason.c_str()); exit(1); } string odata; if (!base64_decode(idata, odata)) { fprintf(stderr, "Decoding failed\n"); exit(1); } write(1, odata.c_str(), odata.size() * sizeof(string::value_type)); exit(0); } } #endif recoll-1.17.3/utils/base64.h000644 001750 000000 00000001762 11740755063 016077 0ustar00dockeswheel000000 000000 /* 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 _BASE64_H_INCLUDED_ #define _BASE64_H_INCLUDED_ #include void base64_encode(const std::string& in, std::string& out); bool base64_decode(const std::string& in, std::string& out); #endif /* _BASE64_H_INCLUDED_ */ recoll-1.17.3/utils/cancelcheck.h000644 001750 000000 00000004407 11740755063 017235 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 _CANCELCHECK_H_INCLUDED_ #define _CANCELCHECK_H_INCLUDED_ /** * Common cancel checking mechanism * * The CancelCheck class is used as a singleton objet (private constructor). * The single instance can be accessed as CancelCheck::instance. * It is used as follows, in an asynchronous program where there is an * interactive (or otherwise controlling) task and a long-working one: * - The control task calls setCancel(), usually as a result of user * interaction, if the worker takes too long. * - The worker task calls checkCancel() at regular intervals, possibly as * a side-effect of some other progress-reporting call. If cancellation has * been requested, this will raise an exception, to be catched and processed * wherever the worker was invoked. * The worker side must be exception-clean, but this otherwise avoids * having to set-up code to handle a special cancellation error along * the whole worker call stack. */ class CancelExcept {}; class CancelCheck { public: static CancelCheck& instance() { static CancelCheck ck; return ck; } void setCancel(bool on = true) { cancelRequested = on; } void checkCancel() { if (cancelRequested) { cancelRequested = false; throw CancelExcept(); } } bool cancelState() {return cancelRequested;} private: bool cancelRequested; CancelCheck() : cancelRequested(false) {} CancelCheck& operator=(CancelCheck&); CancelCheck(const CancelCheck&); }; #endif /* _CANCELCHECK_H_INCLUDED_ */ recoll-1.17.3/utils/circache.cpp000644 001750 000000 00000123006 11740755063 017103 0ustar00dockeswheel000000 000000 /* 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 TEST_CIRCACHE #include "autoconfig.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "cstr.h" #include "circache.h" #include "conftree.h" #include "debuglog.h" #include "smallut.h" #include "md5.h" using namespace std; typedef unsigned char UCHAR; typedef unsigned int UINT; typedef unsigned long ULONG; static bool inflateToDynBuf(void *inp, UINT inlen, void **outpp, UINT *outlenp); /* * File structure: * - Starts with a 1-KB header block, with a param dictionary. * - Stored items follow. Each item has a header and 2 segments for * the metadata and the data. * The segment sizes are stored in the ascii header/marker: * circacheSizes = xxx yyy zzz * xxx bytes of metadata * yyy bytes of data * zzz bytes of padding up to next object (only one entry has non zero) * * There is a write position, which can be at eof while * the file is growing, or inside the file if we are recycling. This is stored * in the header (oheadoffs), together with the maximum size * * If we are recycling, we have to take care to compute the size of the * possible remaining area from the last object invalidated by the write, * pad it with neutral data and store the size in the new header. To help with * this, the address for the last object written is also kept in the header * (nheadoffs, npadsize) * */ // First block size #define CIRCACHE_FIRSTBLOCK_SIZE 1024 // Entry header. // 3 x 32 bits sizes as hex integers + 1 x 16 bits flag + at least 1 zero // 15 + 3x(9) + 3 + 1 = 46 static const char *headerformat = "circacheSizes = %x %x %x %hx"; #define CIRCACHE_HEADER_SIZE 64 class EntryHeaderData { public: EntryHeaderData() : dicsize(0), datasize(0), padsize(0), flags(0) {} UINT dicsize; UINT datasize; UINT padsize; unsigned short flags; }; enum EntryFlags {EFNone = 0, EFDataCompressed = 1}; // A callback class for the header-hopping function. class CCScanHook { public: virtual ~CCScanHook() {} enum status {Stop, Continue, Error, Eof}; virtual status takeone(off_t offs, const string& udi, const EntryHeaderData& d) = 0; }; // We have an auxiliary in-memory multimap of hashed-udi -> offset to // speed things up. This is created the first time the file is scanned // (on the first get), and not saved to disk. // The map key: hashed udi. As a very short hash seems sufficient, // maybe we could find something faster/simpler than md5? #define UDIHLEN 4 class UdiH { public: UCHAR h[UDIHLEN]; UdiH(const string& udi) { MD5_CTX ctx; MD5Init(&ctx); MD5Update(&ctx, (const UCHAR*)udi.c_str(), udi.length()); UCHAR md[16]; MD5Final(md, &ctx); memcpy(h, md, UDIHLEN); } string asHexString() const { static const char hex[]="0123456789abcdef"; string out; for (int i = 0; i < UDIHLEN; i++) { out.append(1, hex[h[i] >> 4]); out.append(1, hex[h[i] & 0x0f]); } return out; } bool operator==(const UdiH& r) const { for (int i = 0; i < UDIHLEN; i++) if (h[i] != r.h[i]) return false; return true; } bool operator<(const UdiH& r) const { for (int i = 0; i < UDIHLEN; i++) { if (h[i] < r.h[i]) return true; if (h[i] > r.h[i]) return false; } return false; } }; typedef multimap kh_type; typedef multimap::value_type kh_value_type; class CirCacheInternal { public: int m_fd; ////// These are cache persistent state and written to the first block: // Maximum file size, after which we begin reusing old space off_t m_maxsize; // Offset of the oldest header. off_t m_oheadoffs; // Offset of last write (newest header) off_t m_nheadoffs; // Pad size for newest entry. int m_npadsize; // Keep history or only last entry bool m_uniquentries; ///////////////////// End header entries // A place to hold data when reading char *m_buffer; size_t m_bufsiz; // Error messages ostringstream m_reason; // State for rewind/next/getcurrent operation. This could/should // be moved to a separate iterator. off_t m_itoffs; EntryHeaderData m_ithd; // Offset cache kh_type m_ofskh; bool m_ofskhcplt; // Has cache been fully read since open? // Add udi->offset translation to map bool khEnter(const string& udi, off_t ofs) { UdiH h(udi); LOGDEB2(("Circache::khEnter: h %s offs %lu udi [%s]\n", h.asHexString().c_str(), (ULONG)ofs, udi.c_str())); pair p = m_ofskh.equal_range(h); if (p.first != m_ofskh.end() && p.first->first == h) { for (kh_type::iterator it = p.first; it != p.second; it++) { LOGDEB2(("Circache::khEnter: col h %s, ofs %lu\n", it->first.asHexString().c_str(), (ULONG)it->second)); if (it->second == ofs) { // (h,offs) already there. Happens LOGDEB2(("Circache::khEnter: already there\n")); return true; } } } m_ofskh.insert(kh_value_type(h, ofs)); LOGDEB2(("Circache::khEnter: inserted\n")); return true; } void khDump() { for (kh_type::const_iterator it = m_ofskh.begin(); it != m_ofskh.end(); it++) { LOGDEB(("Circache::KHDUMP: %s %d\n", it->first.asHexString().c_str(), (ULONG)it->second)); } } // Return list of candidate offsets for udi (possibly several // because there may be hash collisions, and also multiple // instances). bool khFind(const string& udi, vector& ofss) { ofss.clear(); UdiH h(udi); LOGDEB2(("Circache::khFind: h %s udi [%s]\n", h.asHexString().c_str(), udi.c_str())); pair p = m_ofskh.equal_range(h); #if 0 if (p.first == m_ofskh.end()) LOGDEB(("KHFIND: FIRST END()\n")); if (p.second == m_ofskh.end()) LOGDEB(("KHFIND: SECOND END()\n")); if (!(p.first->first == h)) LOGDEB(("KHFIND: NOKEY: %s %s\n", p.first->first.asHexString().c_str(), p.second->first.asHexString().c_str())); #endif if (p.first == m_ofskh.end() || !(p.first->first == h)) return false; for (kh_type::iterator it = p.first; it != p.second; it++) { ofss.push_back(it->second); } return true; } // Clear entry for udi/offs bool khClear(const pair& ref) { UdiH h(ref.first); pair p = m_ofskh.equal_range(h); if (p.first != m_ofskh.end() && (p.first->first == h)) { for (kh_type::iterator it = p.first; it != p.second; ) { kh_type::iterator tmp = it++; if (tmp->second == ref.second) m_ofskh.erase(tmp); } } return true; } // Clear entries for list of udi/offs bool khClear(const list >& udis) { for (list >::const_iterator it = udis.begin(); it != udis.end(); it++) khClear(*it); return true; } // Clear all entries for udi bool khClear(const string& udi) { UdiH h(udi); pair p = m_ofskh.equal_range(h); if (p.first != m_ofskh.end() && (p.first->first == h)) { for (kh_type::iterator it = p.first; it != p.second; ) { kh_type::iterator tmp = it++; m_ofskh.erase(tmp); } } return true; } CirCacheInternal() : m_fd(-1), m_maxsize(-1), m_oheadoffs(-1), m_nheadoffs(0), m_npadsize(0), m_uniquentries(false), m_buffer(0), m_bufsiz(0), m_ofskhcplt(false) {} ~CirCacheInternal() { if (m_fd >= 0) close(m_fd); if (m_buffer) free(m_buffer); } char *buf(size_t sz) { if (m_bufsiz >= sz) return m_buffer; if ((m_buffer = (char *)realloc(m_buffer, sz))) { m_bufsiz = sz; } else { m_reason << "CirCache:: realloc(" << sz << ") failed"; m_bufsiz = 0; } return m_buffer; } // Name for the cache file string datafn(const string& d) { return path_cat(d, "circache.crch"); } bool writefirstblock() { assert(m_fd >= 0); ostringstream s; s << "maxsize = " << m_maxsize << "\n" << "oheadoffs = " << m_oheadoffs << "\n" << "nheadoffs = " << m_nheadoffs << "\n" << "npadsize = " << m_npadsize << "\n" << "unient = " << m_uniquentries << "\n" << " " << " " << " " << "\0"; int sz = int(s.str().size()); assert(sz < CIRCACHE_FIRSTBLOCK_SIZE); lseek(m_fd, 0, 0); if (write(m_fd, s.str().c_str(), sz) != sz) { m_reason << "writefirstblock: write() failed: errno " << errno; return false; } return true; } bool readfirstblock() { assert(m_fd >= 0); char bf[CIRCACHE_FIRSTBLOCK_SIZE]; lseek(m_fd, 0, 0); if (read(m_fd, bf, CIRCACHE_FIRSTBLOCK_SIZE) != CIRCACHE_FIRSTBLOCK_SIZE) { m_reason << "readfirstblock: read() failed: errno " << errno; return false; } string s(bf, CIRCACHE_FIRSTBLOCK_SIZE); ConfSimple conf(s, 1); string value; if (!conf.get("maxsize", value, cstr_null)) { m_reason << "readfirstblock: conf get maxsize failed"; return false; } m_maxsize = atol(value.c_str()); if (!conf.get("oheadoffs", value, cstr_null)) { m_reason << "readfirstblock: conf get oheadoffs failed"; return false; } m_oheadoffs = atol(value.c_str()); if (!conf.get("nheadoffs", value, cstr_null)) { m_reason << "readfirstblock: conf get nheadoffs failed"; return false; } m_nheadoffs = atol(value.c_str()); if (!conf.get("npadsize", value, cstr_null)) { m_reason << "readfirstblock: conf get npadsize failed"; return false; } m_npadsize = atol(value.c_str()); if (!conf.get("unient", value, cstr_null)) { m_uniquentries = false; } else { m_uniquentries = stringToBool(value); } return true; } bool writeEntryHeader(off_t offset, const EntryHeaderData& d) { char bf[CIRCACHE_HEADER_SIZE]; memset(bf, 0, CIRCACHE_HEADER_SIZE); snprintf(bf, CIRCACHE_HEADER_SIZE, headerformat, d.dicsize, d.datasize, d.padsize, d.flags); if (lseek(m_fd, offset, 0) != offset) { m_reason << "CirCache::weh: lseek(" << offset << ") failed: errno " << errno; return false; } if (write(m_fd, bf, CIRCACHE_HEADER_SIZE) != CIRCACHE_HEADER_SIZE) { m_reason << "CirCache::weh: write failed. errno " << errno; return false; } return true; } CCScanHook::status readEntryHeader(off_t offset, EntryHeaderData& d) { assert(m_fd >= 0); if (lseek(m_fd, offset, 0) != offset) { m_reason << "readEntryHeader: lseek(" << offset << ") failed: errno " << errno; return CCScanHook::Error; } char bf[CIRCACHE_HEADER_SIZE]; int ret = read(m_fd, bf, CIRCACHE_HEADER_SIZE); if (ret == 0) { // Eof m_reason << " Eof "; return CCScanHook::Eof; } if (ret != CIRCACHE_HEADER_SIZE) { m_reason << " readheader: read failed errno " << errno; return CCScanHook::Error; } if (sscanf(bf, headerformat, &d.dicsize, &d.datasize, &d.padsize, &d.flags) != 4) { m_reason << " readEntryHeader: bad header at " << offset << " [" << bf << "]"; return CCScanHook::Error; } LOGDEB2(("Circache:readEntryHeader: dcsz %u dtsz %u pdsz %u flgs %hu\n", d.dicsize, d.datasize, d.padsize, d.flags)); return CCScanHook::Continue; } CCScanHook::status scan(off_t startoffset, CCScanHook *user, bool fold = false) { assert(m_fd >= 0); off_t so0 = startoffset; bool already_folded = false; while (true) { if (already_folded && startoffset == so0) { m_ofskhcplt = true; return CCScanHook::Eof; } EntryHeaderData d; CCScanHook::status st; switch ((st = readEntryHeader(startoffset, d))) { case CCScanHook::Continue: break; case CCScanHook::Eof: if (fold && !already_folded) { already_folded = true; startoffset = CIRCACHE_FIRSTBLOCK_SIZE; continue; } /* FALLTHROUGH */ default: return st; } string udi; if (d.dicsize) { // d.dicsize is 0 for erased entries char *bf; if ((bf = buf(d.dicsize+1)) == 0) { return CCScanHook::Error; } bf[d.dicsize] = 0; if (read(m_fd, bf, d.dicsize) != int(d.dicsize)) { m_reason << "scan: read failed errno " << errno; return CCScanHook::Error; } string b(bf, d.dicsize); ConfSimple conf(b, 1); if (!conf.get("udi", udi, cstr_null)) { m_reason << "scan: no udi in dic"; return CCScanHook::Error; } khEnter(udi, startoffset); } // Call callback CCScanHook::status a = user->takeone(startoffset, udi, d); switch (a) { case CCScanHook::Continue: break; default: return a; } startoffset += CIRCACHE_HEADER_SIZE + d.dicsize + d.datasize + d.padsize; } } bool readHUdi(off_t hoffs, EntryHeaderData& d, string& udi) { if (readEntryHeader(hoffs, d) != CCScanHook::Continue) return false; string dic; if (!readDicData(hoffs, d, dic, 0)) return false; if (d.dicsize == 0) { // This is an erased entry udi.erase(); return true; } ConfSimple conf(dic); if (!conf.get("udi", udi)) { m_reason << "Bad file: no udi in dic"; return false; } return true; } bool readDicData(off_t hoffs, EntryHeaderData& hd, string& dic, string* data) { off_t offs = hoffs + CIRCACHE_HEADER_SIZE; // This syscall could be avoided in some cases if we saved the offset // at each seek. In most cases, we just read the header and we are // at the right position if (lseek(m_fd, offs, 0) != offs) { m_reason << "CirCache::get: lseek(" << offs << ") failed: " << errno; return false; } char *bf = 0; if (hd.dicsize) { bf = buf(hd.dicsize); if (bf == 0) return false; if (read(m_fd, bf, hd.dicsize) != int(hd.dicsize)) { m_reason << "CirCache::get: read() failed: errno " << errno; return false; } dic.assign(bf, hd.dicsize); } else { dic.erase(); } if (data == 0) return true; if (hd.datasize) { bf = buf(hd.datasize); if (bf == 0) return false; if (read(m_fd, bf, hd.datasize) != int(hd.datasize)){ m_reason << "CirCache::get: read() failed: errno " << errno; return false; } if (hd.flags & EFDataCompressed) { LOGDEB1(("Circache:readdicdata: data compressed\n")); void *uncomp; unsigned int uncompsize; if (!inflateToDynBuf(bf, hd.datasize, &uncomp, &uncompsize)) { m_reason << "CirCache: decompression failed "; return false; } data->assign((char *)uncomp, uncompsize); free(uncomp); } else { LOGDEB1(("Circache:readdicdata: data NOT compressed\n")); data->assign(bf, hd.datasize); } } else { data->erase(); } return true; } }; CirCache::CirCache(const string& dir) : m_dir(dir) { m_d = new CirCacheInternal; LOGDEB0(("CirCache: [%s]\n", m_dir.c_str())); } CirCache::~CirCache() { delete m_d; m_d = 0; } string CirCache::getReason() { return m_d ? m_d->m_reason.str() : "Not initialized"; } bool CirCache::create(off_t m_maxsize, int flags) { LOGDEB(("CirCache::create: [%s] flags 0x%x\n", m_dir.c_str(), flags)); assert(m_d != 0); struct stat st; if (stat(m_dir.c_str(), &st) < 0) { if (mkdir(m_dir.c_str(), 0777) < 0) { m_d->m_reason << "CirCache::create: mkdir(" << m_dir << ") failed" << " errno " << errno; return false; } } else { if (!(flags & CC_CRTRUNCATE)) return open(CC_OPWRITE); } if ((m_d->m_fd = ::open(m_d->datafn(m_dir).c_str(), O_CREAT | O_RDWR | O_TRUNC, 0666)) < 0) { m_d->m_reason << "CirCache::create: open/creat(" << m_d->datafn(m_dir) << ") failed " << "errno " << errno; return false; } m_d->m_maxsize = m_maxsize; m_d->m_oheadoffs = CIRCACHE_FIRSTBLOCK_SIZE; m_d->m_uniquentries = ((flags & CC_CRUNIQUE) != 0); char buf[CIRCACHE_FIRSTBLOCK_SIZE]; memset(buf, 0, CIRCACHE_FIRSTBLOCK_SIZE); if (::write(m_d->m_fd, buf, CIRCACHE_FIRSTBLOCK_SIZE) != CIRCACHE_FIRSTBLOCK_SIZE) { m_d->m_reason << "CirCache::create: write header failed, errno " << errno; return false; } return m_d->writefirstblock(); } bool CirCache::open(OpMode mode) { assert(m_d != 0); if (m_d->m_fd >= 0) ::close(m_d->m_fd); if ((m_d->m_fd = ::open(m_d->datafn(m_dir).c_str(), mode == CC_OPREAD ? O_RDONLY : O_RDWR)) < 0) { m_d->m_reason << "CirCache::open: open(" << m_d->datafn(m_dir) << ") failed " << "errno " << errno; return false; } return m_d->readfirstblock(); } class CCScanHookDump : public CCScanHook { public: virtual status takeone(off_t offs, const string& udi, const EntryHeaderData& d) { cout << "Scan: offs " << offs << " dicsize " << d.dicsize << " datasize " << d.datasize << " padsize " << d.padsize << " flags " << d.flags << " udi [" << udi << "]" << endl; return Continue; } }; bool CirCache::dump() { CCScanHookDump dumper; // Start at oldest header. This is eof while the file is growing, scan will // fold to bot at once. off_t start = m_d->m_oheadoffs; switch (m_d->scan(start, &dumper, true)) { case CCScanHook::Stop: cout << "Scan returns Stop??" << endl; return false; case CCScanHook::Continue: cout << "Scan returns Continue ?? " << CCScanHook::Continue << " " << getReason() << endl; return false; case CCScanHook::Error: cout << "Scan returns Error: " << getReason() << endl; return false; case CCScanHook::Eof: cout << "Scan returns Eof (ok)" << endl; return true; default: cout << "Scan returns Unknown ??" << endl; return false; } } class CCScanHookGetter : public CCScanHook { public: string m_udi; int m_targinstance; int m_instance; off_t m_offs; EntryHeaderData m_hd; CCScanHookGetter(const string &udi, int ti) : m_udi(udi), m_targinstance(ti), m_instance(0), m_offs(0){} virtual status takeone(off_t offs, const string& udi, const EntryHeaderData& d) { LOGDEB2(("Circache:Scan: off %ld udi [%s] dcsz %u dtsz %u pdsz %u " " flgs %hu\n", long(offs), udi.c_str(), (UINT)d.dicsize, (UINT)d.datasize, (UINT)d.padsize, d.flags)); if (!m_udi.compare(udi)) { m_instance++; m_offs = offs; m_hd = d; if (m_instance == m_targinstance) return Stop; } return Continue; } }; // instance == -1 means get latest. Otherwise specify from 1+ bool CirCache::get(const string& udi, string& dic, string& data, int instance) { Chrono chron; assert(m_d != 0); if (m_d->m_fd < 0) { m_d->m_reason << "CirCache::get: not open"; return false; } LOGDEB0(("CirCache::get: udi [%s], instance %d\n", udi.c_str(), instance)); // If memory map is up to date, use it: if (m_d->m_ofskhcplt) { LOGDEB1(("CirCache::get: using ofskh\n")); //m_d->khDump(); vector ofss; if (m_d->khFind(udi, ofss)) { LOGDEB1(("Circache::get: h found, colls %d\n", ofss.size())); int finst = 1; EntryHeaderData d_good; off_t o_good = 0; for (vector::iterator it = ofss.begin(); it != ofss.end(); it++) { LOGDEB1(("Circache::get: trying offs %lu\n", (ULONG)*it)); EntryHeaderData d; string fudi; if (!m_d->readHUdi(*it, d, fudi)) return false; if (!fudi.compare(udi)) { // Found one, memorize offset. Done if instance // matches, else go on. If instance is -1 need to // go to the end of the list anyway d_good = d; o_good = *it; if (finst == instance) { break; } else { finst++; } } } // Did we read an appropriate entry ? if (o_good != 0 && (instance == -1 || instance == finst)) { bool ret = m_d->readDicData(o_good, d_good, dic, &data); LOGDEB0(("Circache::get: hfound, %d mS\n", chron.millis())); return ret; } // Else try to scan anyway. } } CCScanHookGetter getter(udi, instance); off_t start = m_d->m_oheadoffs; CCScanHook::status ret = m_d->scan(start, &getter, true); if (ret == CCScanHook::Eof) { if (getter.m_instance == 0) return false; } else if (ret != CCScanHook::Stop) { return false; } bool bret = m_d->readDicData(getter.m_offs, getter.m_hd, dic, &data); LOGDEB0(("Circache::get: scanfound, %d mS\n", chron.millis())); return bret; } bool CirCache::erase(const string& udi) { assert(m_d != 0); if (m_d->m_fd < 0) { m_d->m_reason << "CirCache::erase: not open"; return false; } LOGDEB0(("CirCache::erase: udi [%s]\n", udi.c_str())); // If the mem cache is not up to date, update it, we're too lazy // to do a scan if (!m_d->m_ofskhcplt) { string dic, data; get("nosuchudi probably exists", dic, data); if (!m_d->m_ofskhcplt) { LOGERR(("CirCache::erase : cache not updated after get\n")); return false; } } vector ofss; if (!m_d->khFind(udi, ofss)) { // Udi not in there, erase ok LOGDEB(("CirCache::erase: khFind returns none\n")); return true; } for (vector::iterator it = ofss.begin(); it != ofss.end(); it++) { LOGDEB(("CirCache::erase: reading at %lu\n", (unsigned long)*it)); EntryHeaderData d; string fudi; if (!m_d->readHUdi(*it, d, fudi)) return false; LOGDEB(("CirCache::erase: found fudi [%s]\n", fudi.c_str())); if (!fudi.compare(udi)) { EntryHeaderData nd; nd.padsize = d.dicsize + d.datasize + d.padsize; LOGDEB(("CirCache::erase: rewriting at %lu\n", (unsigned long)*it)); if (*it == m_d->m_nheadoffs) m_d->m_npadsize = nd.padsize; if(!m_d->writeEntryHeader(*it, nd)) { LOGERR(("CirCache::erase: write header failed\n")); return false; } } } m_d->khClear(udi); return true; } // Used to scan the file ahead until we accumulated enough space for the new // entry. class CCScanHookSpacer : public CCScanHook { public: UINT sizewanted; UINT sizeseen; list > squashed_udis; CCScanHookSpacer(int sz) : sizewanted(sz), sizeseen(0) {assert(sz > 0);} virtual status takeone(off_t offs, const string& udi, const EntryHeaderData& d) { LOGDEB2(("Circache:ScanSpacer:off %u dcsz %u dtsz %u pdsz %u udi[%s]\n", (UINT)offs, d.dicsize, d.datasize, d.padsize, udi.c_str())); sizeseen += CIRCACHE_HEADER_SIZE + d.dicsize + d.datasize + d.padsize; squashed_udis.push_back(make_pair(udi, offs)); if (sizeseen >= sizewanted) return Stop; return Continue; } }; bool CirCache::put(const string& udi, const ConfSimple *iconf, const string& data, unsigned int iflags) { assert(m_d != 0); if (m_d->m_fd < 0) { m_d->m_reason << "CirCache::put: not open"; return false; } // We need the udi in input metadata string dic; if (!iconf || !iconf->get("udi", dic) || dic.empty() || dic.compare(udi)) { m_d->m_reason << "No/bad 'udi' entry in input dic"; LOGERR(("Circache::put: no/bad udi: DIC:[%s] UDI [%s]\n", dic.c_str(), udi.c_str())); return false; } // Possibly erase older entries. Need to do this first because we may be // able to reuse the space if the same udi was last written if (m_d->m_uniquentries && !erase(udi)) { LOGERR(("CirCache::put: can't erase older entries\n")); return false; } ostringstream s; iconf->write(s); dic = s.str(); // Data compression ? const char *datap = data.c_str(); unsigned int datalen = data.size(); unsigned short flags = 0; TempBuf compbuf; if (!(iflags & NoCompHint)) { ULONG len = compressBound(data.size()); char *bf = compbuf.setsize(len); if (bf != 0 && compress((Bytef*)bf, &len, (Bytef*)data.c_str(), data.size()) == Z_OK) { if (float(len) < 0.9 * float(data.size())) { // bf is local but it's our static buffer address datap = bf; datalen = len; flags |= EFDataCompressed; } } } struct stat st; if (fstat(m_d->m_fd, &st) < 0) { m_d->m_reason << "CirCache::put: fstat failed. errno " << errno; return false; } // Characteristics for the new entry. int nsize = CIRCACHE_HEADER_SIZE + dic.size() + datalen; int nwriteoffs = m_d->m_oheadoffs; int npadsize = 0; bool extending = false; LOGDEB(("CirCache::put: nsz %d oheadoffs %d\n", nsize, m_d->m_oheadoffs)); // Check if we can recover some pad space from the (physically) previous // entry. int recovpadsize = m_d->m_oheadoffs == CIRCACHE_FIRSTBLOCK_SIZE ? 0 : m_d->m_npadsize; if (recovpadsize != 0) { // Need to read the latest entry's header, to rewrite it with a // zero pad size EntryHeaderData pd; if (m_d->readEntryHeader(m_d->m_nheadoffs, pd) != CCScanHook::Continue){ return false; } assert(int(pd.padsize) == m_d->m_npadsize); if (pd.dicsize == 0) { // erased entry. Also recover the header space, no need to rewrite // the header, we're going to write on it. recovpadsize += CIRCACHE_HEADER_SIZE; } else { LOGDEB(("CirCache::put: recov. prev. padsize %d\n", pd.padsize)); pd.padsize = 0; if (!m_d->writeEntryHeader(m_d->m_nheadoffs, pd)) return false; // If we fail between here and the end, the file is broken. } nwriteoffs = m_d->m_oheadoffs - recovpadsize; } if (nsize <= recovpadsize) { // If the new entry fits entirely in the pad area from the // latest one, no need to recycle stuff LOGDEB(("CirCache::put: new fits in old padsize %d\n", recovpadsize)); npadsize = recovpadsize - nsize; } else if (st.st_size < m_d->m_maxsize) { // Still growing the file. npadsize = 0; extending = true; } else { // Scan the file until we have enough space for the new entry, // and determine the pad size up to the 1st preserved entry int scansize = nsize - recovpadsize; LOGDEB(("CirCache::put: scanning for size %d from offs %u\n", scansize, (UINT)m_d->m_oheadoffs)); CCScanHookSpacer spacer(scansize); switch (m_d->scan(m_d->m_oheadoffs, &spacer)) { case CCScanHook::Stop: LOGDEB(("CirCache::put: Scan ok, sizeseen %d\n", spacer.sizeseen)); npadsize = spacer.sizeseen - scansize; break; case CCScanHook::Eof: npadsize = 0; extending = true; break; case CCScanHook::Continue: case CCScanHook::Error: return false; } // Take the recycled entries off the multimap m_d->khClear(spacer.squashed_udis); } LOGDEB(("CirCache::put: writing %d at %d padsize %d\n", nsize, nwriteoffs, npadsize)); if (lseek(m_d->m_fd, nwriteoffs, 0) != nwriteoffs) { m_d->m_reason << "CirCache::put: lseek failed: " << errno; return false; } char head[CIRCACHE_HEADER_SIZE]; memset(head, 0, CIRCACHE_HEADER_SIZE); snprintf(head, CIRCACHE_HEADER_SIZE, headerformat, dic.size(), datalen, npadsize, flags); struct iovec vecs[3]; vecs[0].iov_base = head; vecs[0].iov_len = CIRCACHE_HEADER_SIZE; vecs[1].iov_base = (void *)dic.c_str(); vecs[1].iov_len = dic.size(); vecs[2].iov_base = (void *)datap; vecs[2].iov_len = datalen; if (writev(m_d->m_fd, vecs, 3) != nsize) { m_d->m_reason << "put: write failed. errno " << errno; if (extending) if (ftruncate(m_d->m_fd, m_d->m_oheadoffs) == -1) { m_d->m_reason << "put: ftruncate failed. errno " << errno; } return false; } m_d->khEnter(udi, nwriteoffs); // Update first block information m_d->m_nheadoffs = nwriteoffs; m_d->m_npadsize = npadsize; // New oldest header is the one just after the one we just wrote. m_d->m_oheadoffs = nwriteoffs + nsize + npadsize; if (nwriteoffs + nsize >= m_d->m_maxsize) { // Max size or top of file reached, next write at BOT. m_d->m_oheadoffs = CIRCACHE_FIRSTBLOCK_SIZE; } return m_d->writefirstblock(); } bool CirCache::rewind(bool& eof) { assert(m_d != 0); eof = false; // Read oldest header m_d->m_itoffs = m_d->m_oheadoffs; CCScanHook::status st = m_d->readEntryHeader(m_d->m_itoffs, m_d->m_ithd); switch(st) { case CCScanHook::Eof: eof = true; return false; case CCScanHook::Continue: return true; default: return false; } } bool CirCache::next(bool& eof) { assert(m_d != 0); eof = false; // Skip to next header, using values stored from previous one m_d->m_itoffs += CIRCACHE_HEADER_SIZE + m_d->m_ithd.dicsize + m_d->m_ithd.datasize + m_d->m_ithd.padsize; // Looped back ? if (m_d->m_itoffs == m_d->m_oheadoffs) { eof = true; return false; } // Read. If we hit physical eof, fold. CCScanHook::status st = m_d->readEntryHeader(m_d->m_itoffs, m_d->m_ithd); if (st == CCScanHook::Eof) { m_d->m_itoffs = CIRCACHE_FIRSTBLOCK_SIZE; if (m_d->m_itoffs == m_d->m_oheadoffs) { // Then the file is not folded yet (still growing) eof = true; return false; } st = m_d->readEntryHeader(m_d->m_itoffs, m_d->m_ithd); } if (st == CCScanHook::Continue) return true; return false; } bool CirCache::getCurrentUdi(string& udi) { assert(m_d != 0); if (!m_d->readHUdi(m_d->m_itoffs, m_d->m_ithd, udi)) return false; return true; } bool CirCache::getCurrent(string& udi, string& dic, string& data) { assert(m_d != 0); if (!m_d->readDicData(m_d->m_itoffs, m_d->m_ithd, dic, &data)) return false; ConfSimple conf(dic, 1); conf.get("udi", udi, cstr_null); return true; } static void *allocmem( void *cp, /* The array to grow. may be NULL */ int sz, /* Unit size in bytes */ int *np, /* Pointer to current allocation number */ int min, /* Number to allocate the first time */ int maxinc) /* Maximum increment */ { if (cp == 0) { cp = malloc(min * sz); *np = cp ? min : 0; return cp; } int inc = (*np > maxinc) ? maxinc : *np; if ((cp = realloc(cp, (*np + inc) * sz)) != 0) *np += inc; return cp; } static bool inflateToDynBuf(void* inp, UINT inlen, void **outpp, UINT *outlenp) { z_stream d_stream; /* decompression stream */ LOGDEB0(("inflateToDynBuf: inlen %u\n", inlen)); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; // Compression works well on html files, 4-6 is quite common, Otoh we // maybe passed a big, little if at all compressed image or pdf file, // So we set the initial allocation at 3 times the input size const int imul = 3; const int mxinc = 20; char *outp = 0; int alloc = 0; d_stream.next_in = (Bytef*)inp; d_stream.avail_in = inlen; d_stream.next_out = 0; d_stream.avail_out = 0; int err; if ((err = inflateInit(&d_stream)) != Z_OK) { LOGERR(("Inflate: inflateInit: err %d msg %s\n", err, d_stream.msg)); free(outp); return false; } for (;;) { LOGDEB2(("InflateToDynBuf: avail_in %d total_in %d avail_out %d " "total_out %d\n", d_stream.avail_in, d_stream.total_in, d_stream.avail_out, d_stream.total_out)); if (d_stream.avail_out == 0) { if ((outp = (char*)allocmem(outp, inlen, &alloc, imul, mxinc)) == 0) { LOGERR(("Inflate: out of memory, current alloc %d\n", alloc*inlen)); inflateEnd(&d_stream); return false; } else { LOGDEB2(("inflateToDynBuf: realloc(%d) ok\n", alloc * inlen)); } d_stream.avail_out = alloc * inlen - d_stream.total_out; d_stream.next_out = (Bytef*)(outp + d_stream.total_out); } err = inflate(&d_stream, Z_NO_FLUSH); if (err == Z_STREAM_END) break; if (err != Z_OK) { LOGERR(("Inflate: error %d msg %s\n", err, d_stream.msg)); inflateEnd(&d_stream); free(outp); return false; } } *outlenp = d_stream.total_out; *outpp = (Bytef *)outp; if ((err = inflateEnd(&d_stream)) != Z_OK) { LOGERR(("Inflate: inflateEnd error %d msg %s\n", err, d_stream.msg)); return false; } LOGDEB0(("inflateToDynBuf: ok, output size %d\n", d_stream.total_out)); return true; } #else // TEST -> #include "autoconfig.h" #include #include #include #include #include #include #include #include "circache.h" #include "fileudi.h" #include "conftree.h" #include "readfile.h" #include "debuglog.h" using namespace std; static char *thisprog; static char usage [] = " -c [-u] : create\n" " -p [apath ...] : put files\n" " -d : dump\n" " -g [-i instance] [-D] : get\n" " -D: also dump data\n" " -e : erase\n" ; static void Usage(FILE *fp = stderr) { fprintf(fp, "%s: usage:\n%s", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_c 0x2 #define OPT_p 0x8 #define OPT_g 0x10 #define OPT_d 0x20 #define OPT_i 0x40 #define OPT_D 0x80 #define OPT_u 0x100 #define OPT_e 0x200 int main(int argc, char **argv) { int instance = -1; 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 'e': op_flags |= OPT_e; break; case 'p': op_flags |= OPT_p; break; case 'g': op_flags |= OPT_g; break; case 'd': op_flags |= OPT_d; break; case 'D': op_flags |= OPT_D; break; case 'u': op_flags |= OPT_u; break; case 'i': op_flags |= OPT_i; if (argc < 2) Usage(); if ((sscanf(*(++argv), "%d", &instance)) != 1) Usage(); argc--; goto b1; default: Usage(); break; } b1: argc--; argv++; } DebugLog::getdbl()->setloglevel(DEBDEB1); DebugLog::setfilename("stderr"); if (argc < 1) Usage(); string dir = *argv++;argc--; CirCache cc(dir); if (op_flags & OPT_c) { int flags = 0; if (op_flags & OPT_u) flags |= CirCache::CC_CRUNIQUE; if (!cc.create(100*1024, flags)) { cerr << "Create failed:" << cc.getReason() << endl; exit(1); } } else if (op_flags & OPT_p) { if (argc < 1) Usage(); if (!cc.open(CirCache::CC_OPWRITE)) { cerr << "Open failed: " << cc.getReason() << endl; exit(1); } while (argc) { string fn = *argv++;argc--; char dic[1000]; string data, reason; if (!file_to_string(fn, data, &reason)) { cerr << "File_to_string: " << reason << endl; exit(1); } string udi; make_udi(fn, "", udi); sprintf(dic, "#whatever...\nmimetype = text/plain\nudi=%s\n", udi.c_str()); string sdic; sdic.assign(dic, strlen(dic)); ConfSimple conf(sdic); if (!cc.put(udi, &conf, data, 0)) { cerr << "Put failed: " << cc.getReason() << endl; cerr << "conf: ["; conf.write(cerr); cerr << "]" << endl; exit(1); } } cc.open(CirCache::CC_OPREAD); } else if (op_flags & OPT_g) { if (!cc.open(CirCache::CC_OPREAD)) { cerr << "Open failed: " << cc.getReason() << endl; exit(1); } while (argc) { string udi = *argv++;argc--; string dic, data; if (!cc.get(udi, dic, data, instance)) { cerr << "Get failed: " << cc.getReason() << endl; exit(1); } cout << "Dict: [" << dic << "]" << endl; if (op_flags & OPT_D) cout << "Data: [" << data << "]" << endl; } } else if (op_flags & OPT_e) { if (!cc.open(CirCache::CC_OPWRITE)) { cerr << "Open failed: " << cc.getReason() << endl; exit(1); } while (argc) { string udi = *argv++;argc--; string dic, data; if (!cc.erase(udi)) { cerr << "Erase failed: " << cc.getReason() << endl; exit(1); } } } else if (op_flags & OPT_d) { if (!cc.open(CirCache::CC_OPREAD)) { cerr << "Open failed: " << cc.getReason() << endl; exit(1); } cc.dump(); } else Usage(); exit(0); } #endif recoll-1.17.3/utils/circache.h000644 001750 000000 00000006374 11740755063 016560 0ustar00dockeswheel000000 000000 /* 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 _circache_h_included_ #define _circache_h_included_ /** * A data cache implemented as a circularly managed file * * A single file is used to stored objects. The file grows to a * specified maximum size, then is rewritten from the start, * overwriting older entries. * * Data objects inside the cache each have two parts: a data segment and an * attribute (metadata) dictionary. * They are named using the same identifiers that are used inside the Recoll * index (the UDI). * * Inside the file. the UDIs are stored inside the entry dictionary * under the key "udi". * * It is assumed that the dictionary are small (they are routinely read/parsed) * */ #include #include #ifndef NO_NAMESPACES using std::string; #endif class ConfSimple; class CirCacheInternal; class CirCache { public: CirCache(const string& dir); virtual ~CirCache(); virtual string getReason(); enum CreateFlags {CC_CRNONE=0, // Unique entries: erase older instances when same udi // is stored. CC_CRUNIQUE=1, // Truncate file (restart from scratch). CC_CRTRUNCATE = 2}; virtual bool create(off_t maxsize, int flags); enum OpMode {CC_OPREAD, CC_OPWRITE}; virtual bool open(OpMode mode); virtual bool get(const string& udi, string& dic, string& data, int instance = -1); // Note: the dicp MUST have an udi entry enum PutFlags {NoCompHint = 1}; virtual bool put(const string& udi, const ConfSimple *dicp, const string& data, unsigned int flags = 0); virtual bool erase(const string& udi); /** Walk the archive. * * Maybe we'll have separate iterators one day, but this is good * enough for now. No put() operations should be performed while * using these. */ /** Back to oldest */ virtual bool rewind(bool& eof); /** Get entry under cursor */ virtual bool getCurrent(string& udi, string& dic, string& data); /** Get current entry udi only. Udi can be empty (erased empty), caller * should call again */ virtual bool getCurrentUdi(string& udi); /** Skip to next. (false && !eof) -> error, (false&&eof)->EOF. */ virtual bool next(bool& eof); /* Debug. This writes the entry headers to stdout */ virtual bool dump(); protected: CirCacheInternal *m_d; string m_dir; private: CirCache(const CirCache&) {} CirCache& operator=(const CirCache&) {return *this;} }; #endif /* _circache_h_included_ */ recoll-1.17.3/utils/closefrom.cpp000644 001750 000000 00000014667 11740755063 017347 0ustar00dockeswheel000000 000000 /* 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. */ /* * Close all file descriptors above a given value. * * A Unix execXX() call used to execute another program does not close open * file descriptors by default. * * The only descriptors closed are those on which the FD_CLOEXEC flag was * set. FD_CLOEXEC is not easily usable on files opened by external * libraries. * * There are many reasons for closing file descriptors before * an exec (security, pipe control, the possibility that a bug will trigger * an unwanted write, etc.) * * A process has currently no POSIX way to determine the list of open file * descriptors or at least the highest value. Closing all files (except a few), * thus implies performing a close() system call on each entry up to the * maximum, which can be both relatively difficult to determine, and quite * high (ie: several thousands), incurring a non-negligible cost. * * A number of systems have non-portable support for mitigating or solving * this problem. * * This module supplies a portable interface to this functionality. * * The initial data on system interfaces was obtained from: * http://stackoverflow.com/questions/899038/\ * getting-the-highest-allocated-file-descriptor * * System interfaces: * FreeBSD: * - Has a closefrom() system call as of release 7.x around Sep 2009 * - Has a /dev/fd, directory which lists the current process' open * descriptors. Only descriptors 0, 1, 2 are shown except if * fdescfs is mounted which it is not by default * * Interface: * int libclf_closefrom(fd) * @param fd All open file descriptors with equal or higher numeric * values will be closed. fd needs not be a valid descriptor. * @return 0 for success, -1 for error. */ #ifndef TEST_CLOSEFROM #include #include #include #include #include /* #define DEBUG_CLOSEFROM*/ #ifdef DEBUG_CLOSEFROM #define DPRINT(X) fprintf X #else #define DPRINT(X) #endif /* Note: sudo has a closefrom implementation, needs a lot of autoconfig, but * we could use it instead. It's quite close to this though */ /*************************************************************************/ /* closefrom() exists on Solaris, netbsd and openbsd, but someone will * have to provide me the appropriate macro to test */ #if (defined(__FreeBSD__) && __FreeBSD_version >= 702104) /* Use closefrom() system call */ int libclf_closefrom(int fd0) { DPRINT((stderr, "libclf_closefrom: using closefrom(2)\n")); closefrom(fd0); return 0; } /*************************************************************************/ #elif defined(F_CLOSEM) /* Use fcntl(fd, F_CLOSEM) */ int libclf_closefrom(int fd0) { DPRINT((stderr, "libclf_closefrom: using fcntl(F_CLOSEM)\n")); // We need a valid descriptor for this to work. Try to dup stdin, else // go wild if (fcntl(0, F_GETFL) != -1) { if (fd0 != 0) dup2(0, fd0); } else { int fd = open("/etc/group", 0); // yes i am a unix man if (fd >= 0 && fd != fd0) { dup2(fd, fd0); close(fd); } } return fcntl(fd0, F_CLOSEM, 0); } /*************************************************************************/ #elif (defined(linux) || defined(__linux)) /* Use /proc/self/fd directory */ #include #include int libclf_closefrom(int fd0) { DIR *dirp; struct dirent *ent; DPRINT((stderr, "libclf_closefrom: using /proc\n")); dirp = opendir("/proc/self/fd"); if (dirp == 0) return -1; while ((ent = readdir(dirp)) != 0) { int fd; if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) continue; if (sscanf(ent->d_name, "%d", &fd) == 1 && fd >= fd0 && fd != dirfd(dirp)) { close(fd); } } closedir(dirp); return 0; } /*************************************************************************/ #else /* System has no native support for this functionality whatsoever. * * Close all descriptors up to compiled/configured maximum. * The caller will usually have an idea of a reasonable maximum, else * we retrieve a value from the system. */ static int closefrom_maxfd = -1; void libclf_setmaxfd(int max) { closefrom_maxfd = max; } #ifdef sun #include #endif int libclf_closefrom(int fd0) { int i, maxfd = closefrom_maxfd; if (maxfd < 0) { #ifdef _SC_OPEN_MAX maxfd = sysconf(_SC_OPEN_MAX); DPRINT((stderr, "Maxfd is %d after sysconf()\n", maxfd)); #else maxfd = getdtablesize(); DPRINT((stderr, "Maxfd is %d after getdtablesize()\n", maxfd)); #endif } if (maxfd < 0) maxfd = OPEN_MAX; DPRINT((stderr, "libclf_closefrom: using loop to %d\n", maxfd)); for (i = fd0; i < maxfd; i++) { (void)close(i); } return 0; } #endif #else /* TEST_CLOSEFROM */ #include #include #include #include #include "closefrom.h" int main(int argc, char **argv) { int i; int fd0 = open("/etc/group", 0); if (fd0 < 0) { perror("open /etc/group"); exit(1); } if (dup2(fd0, 11) < 0) { perror("dup2->11"); exit(1); } if (dup2(fd0, 19) < 0) { perror("dup2->19"); exit(1); } if (dup2(fd0, 99)< 0) { perror("dup2->99 (ok)"); } if (dup2(fd0, 999) < 0) { perror("dup3->999 (ok)"); } libclf_closefrom(11); for (i = 0; i < 10000; i++) { if (fcntl(i, F_GETFL) != -1) { fprintf(stderr, "Descriptor %d is still open", i); if (i < 11) fprintf(stderr, " (OK)\n"); else fprintf(stderr, " (BAD)\n"); } } exit(0); } #endif recoll-1.17.3/utils/closefrom.h000644 001750 000000 00000001667 11740755063 017010 0ustar00dockeswheel000000 000000 #ifndef _closefrom_h_included_ #define _closefrom_h_included_ /* 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. */ /* Close all descriptors >= fd */ extern int libclf_closefrom(int fd); #endif /* _closefrom_h_included_ */ recoll-1.17.3/utils/conftree.cpp000644 001750 000000 00000062232 11740755063 017152 0ustar00dockeswheel000000 000000 /* Copyright (C) 2003 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 "config.h" #endif #ifndef TEST_CONFTREE #include // for access(2) #include #include #include #include #include #include #include #include #include "conftree.h" #include "pathut.h" #include "smallut.h" #ifndef NO_NAMESPACES using namespace std; using std::list; #endif // NO_NAMESPACES #ifndef MIN #define MIN(A,B) ((A)<(B) ? (A) : (B)) #endif #undef DEBUG #ifdef DEBUG #define LOGDEB(X) fprintf X #else #define LOGDEB(X) #endif #define LL 1024 void ConfSimple::parseinput(istream &input) { string submapkey; char cline[LL]; bool appending = false; string line; bool eof = false; for (;;) { cline[0] = 0; input.getline(cline, LL-1); LOGDEB((stderr, "Parse:line: [%s] status %d\n", cline, int(status))); if (!input.good()) { if (input.bad()) { LOGDEB((stderr, "Parse: input.bad()\n")); status = STATUS_ERROR; return; } LOGDEB((stderr, "Parse: eof\n")); // 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; } { int 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; m_order.push_back(ConfLine(ConfLine::CFL_COMMENT, line)); continue; } if (line[line.length() - 1] == '\\') { line.erase(line.length() - 1); appending = true; continue; } appending = false; if (line[0] == '[') { trimstring(line, "[]"); if (dotildexpand) submapkey = path_tildexpand(line); else submapkey = line; // No need for adding sk to order, will be done with first // variable insert. Also means that empty section are // expandable (won't be output when rewriting) // Another option would be to add the subsec to m_order here // and not do it inside i_set() if init is true continue; } // Look for first equal sign string::size_type eqpos = line.find("="); if (eqpos == string::npos) { m_order.push_back(ConfLine(ConfLine::CFL_COMMENT, line)); continue; } // Compute name and value, trim white space string nm, val; nm = line.substr(0, eqpos); trimstring(nm); val = line.substr(eqpos+1, string::npos); trimstring(val); if (nm.length() == 0) { m_order.push_back(ConfLine(ConfLine::CFL_COMMENT, line)); continue; } i_set(nm, val, submapkey, true); if (eof) break; } } ConfSimple::ConfSimple(int readonly, bool tildexp) : dotildexpand(tildexp), m_fmtime(0), m_holdWrites(false) { status = readonly ? STATUS_RO : STATUS_RW; } ConfSimple::ConfSimple(const string& d, int readonly, bool tildexp) : dotildexpand(tildexp), m_fmtime(0), m_holdWrites(false) { status = readonly ? STATUS_RO : STATUS_RW; stringstream input(d, ios::in); parseinput(input); } ConfSimple::ConfSimple(const char *fname, int readonly, bool tildexp) : dotildexpand(tildexp), m_filename(fname), m_fmtime(0), m_holdWrites(false) { status = readonly ? STATUS_RO : STATUS_RW; ifstream input; if (readonly) { input.open(fname, ios::in); } else { ios::openmode mode = ios::in|ios::out; // It seems that there is no separate 'create if not exists' // open flag. Have to truncate to create, but dont want to do // this to an existing file ! if (access(fname, 0) < 0) { mode |= ios::trunc; } input.open(fname, mode); if (input.is_open()) { status = STATUS_RW; } else { input.clear(); input.open(fname, ios::in); if (input.is_open()) { status = STATUS_RO; } } } if (!input.is_open()) { status = STATUS_ERROR; return; } parseinput(input); i_changed(true); } ConfSimple::StatusCode ConfSimple::getStatus() const { switch (status) { case STATUS_RO: return STATUS_RO; case STATUS_RW: return STATUS_RW; default: return STATUS_ERROR; } } bool ConfSimple::sourceChanged() { return i_changed(false); } bool ConfSimple::i_changed(bool upd) { if (!m_filename.empty()) { struct stat st; if (stat(m_filename.c_str(), &st) == 0) { if (m_fmtime != st.st_mtime) { if (upd) m_fmtime = st.st_mtime; return true; } } } return false; } int ConfSimple::get(const string &nm, string &value, const string &sk) const { if (!ok()) return 0; // Find submap map >::const_iterator ss; if ((ss = m_submaps.find(sk)) == m_submaps.end()) return 0; // Find named value map::const_iterator s; if ((s = ss->second.find(nm)) == ss->second.end()) return 0; value = s->second; return 1; } // Appropriately output a subkey (nm=="") or variable line. // Splits long lines static ConfSimple::WalkerCode varprinter(void *f, const string &nm, const string &value) { ostream *output = (ostream *)f; if (nm.empty()) { *output << "\n[" << value << "]\n"; } else { string value1; if (value.length() < 60) { value1 = value; } else { string::size_type pos = 0; while (pos < value.length()) { string::size_type len = MIN(60, value.length() - pos); value1 += value.substr(pos, len); pos += len; if (pos < value.length()) value1 += "\\\n"; } } *output << nm << " = " << value1 << "\n"; } return ConfSimple::WALK_CONTINUE; } // Set variable and rewrite data int ConfSimple::set(const std::string &nm, const std::string &value, const string &sk) { if (status != STATUS_RW) return 0; if (!i_set(nm, value, sk)) return 0; return write(); } // Internal set variable: no rw checking or file rewriting. If init is // set, we're doing initial parsing, else we are changing a parsed // tree (changes the way we update the order data) int ConfSimple::i_set(const std::string &nm, const std::string &value, const string &sk, bool init) { LOGDEB((stderr, "ConfSimple::i_set: nm[%s] val[%s] key[%s], init %d\n", nm.c_str(), value.c_str(), sk.c_str(), init)); // Values must not have embedded newlines if (value.find_first_of("\n\r") != string::npos) { LOGDEB((stderr, "ConfSimple::i_set: LF in value\n")); return 0; } bool existing = false; map >::iterator ss; // Test if submap already exists, else create it, and insert variable: if ((ss = m_submaps.find(sk)) == m_submaps.end()) { LOGDEB((stderr, "ConfSimple::i_set: new submap\n")); map submap; submap[nm] = value; m_submaps[sk] = submap; // Maybe add sk entry to m_order data: if (!sk.empty()) { ConfLine nl(ConfLine::CFL_SK, sk); // Append SK entry only if it's not already there (erase // does not remove entries from the order data, adn it may // be being recreated after deletion) if (find(m_order.begin(), m_order.end(), nl) == m_order.end()) { m_order.push_back(nl); } } } else { // Insert or update variable in existing map. map::iterator it; it = ss->second.find(nm); if (it == ss->second.end()) { ss->second.insert(pair(nm, value)); } else { it->second = value; existing = true; } } // If the variable already existed, no need to change the m_order data if (existing) { LOGDEB((stderr, "ConfSimple::i_set: existing var: no order update\n")); return 1; } // Add the new variable at the end of its submap in the order data. if (init) { // During the initial construction, just append: LOGDEB((stderr, "ConfSimple::i_set: init true: append\n")); m_order.push_back(ConfLine(ConfLine::CFL_VAR, nm)); return 1; } // Look for the start and end of the subkey zone. Start is either // at begin() for a null subkey, or just behind the subkey // entry. End is either the next subkey entry, or the end of // list. We insert the new entry just before end. list::iterator start, fin; if (sk.empty()) { start = m_order.begin(); LOGDEB((stderr,"ConfSimple::i_set: null sk, start at top of order\n")); } else { start = find(m_order.begin(), m_order.end(), ConfLine(ConfLine::CFL_SK, sk)); if (start == m_order.end()) { // This is not logically possible. The subkey must // exist. We're doomed std::cerr << "Logical failure during configuration variable " "insertion" << endl; abort(); } } fin = m_order.end(); if (start != m_order.end()) { // The null subkey has no entry (maybe it should) if (!sk.empty()) start++; for (list::iterator it = start; it != m_order.end(); it++) { if (it->m_kind == ConfLine::CFL_SK) { fin = it; break; } } } // It may happen that the order entry already exists because erase doesnt // update m_order if (find(start, fin, ConfLine(ConfLine::CFL_VAR, nm)) == fin) { m_order.insert(fin, ConfLine(ConfLine::CFL_VAR, nm)); } return 1; } int ConfSimple::erase(const string &nm, const string &sk) { if (status != STATUS_RW) return 0; map >::iterator ss; if ((ss = m_submaps.find(sk)) == m_submaps.end()) { return 0; } ss->second.erase(nm); if (ss->second.empty()) { m_submaps.erase(ss); } return write(); } int ConfSimple::eraseKey(const string &sk) { listnms = getNames(sk); for (list::iterator it = nms.begin(); it != nms.end(); it++) { erase(*it, sk); } return write(); } // Walk the tree, calling user function at each node ConfSimple::WalkerCode ConfSimple::sortwalk(WalkerCode (*walker)(void *,const string&,const string&), void *clidata) { if (!ok()) return WALK_STOP; // For all submaps: for (map >::iterator sit = m_submaps.begin(); sit != m_submaps.end(); sit++) { // Possibly emit submap name: if (!sit->first.empty() && walker(clidata, string(), sit->first.c_str()) == WALK_STOP) return WALK_STOP; // Walk submap map &sm = sit->second; for (map::iterator it = sm.begin();it != sm.end(); it++) { if (walker(clidata, it->first, it->second) == WALK_STOP) return WALK_STOP; } } return WALK_CONTINUE; } // Write to default output. This currently only does something if output is // a file bool ConfSimple::write() { if (!ok()) return false; if (m_holdWrites) return true; if (m_filename.length()) { ofstream output(m_filename.c_str(), ios::out|ios::trunc); if (!output.is_open()) return 0; return write(output); } else { // No backing store, no writing. Maybe one day we'll need it with // some kind of output string. This can't be the original string which // is currently readonly. //ostringstream output(m_ostring, ios::out | ios::trunc); return 1; } } // Write out the tree in configuration file format: // This does not check holdWrites, this is done by write(void), which // lets ie: listall work even when holdWrites is set bool ConfSimple::write(ostream& out) const { if (!ok()) return false; string sk; for (list::const_iterator it = m_order.begin(); it != m_order.end(); it++) { switch(it->m_kind) { case ConfLine::CFL_COMMENT: out << it->m_data << endl; if (!out.good()) return false; break; case ConfLine::CFL_SK: sk = it->m_data; LOGDEB((stderr, "ConfSimple::write: SK [%s]\n", sk.c_str())); // Check that the submap still exists, and only output it if it // does if (m_submaps.find(sk) != m_submaps.end()) { out << "[" << it->m_data << "]" << endl; if (!out.good()) return false; } break; case ConfLine::CFL_VAR: string nm = it->m_data; LOGDEB((stderr, "ConfSimple::write: VAR [%s], sk [%s]\n", nm.c_str(), sk.c_str())); // As erase() doesnt update m_order we can find unexisting // variables, and must not output anything for them. Have // to use a ConfSimple::get() to check here, because // ConfTree's could retrieve from an ancestor even if the // local var is gone. string value; if (ConfSimple::get(nm, value, sk)) { varprinter(&out, nm, value); if (!out.good()) return false; break; } LOGDEB((stderr, "ConfSimple::write: no value: nm[%s] sk[%s]\n", nm.c_str(), sk.c_str())); break; } } return true; } void ConfSimple::listall() { if (!ok()) return; write(std::cout); } list ConfSimple::getNames(const string &sk, const char *pattern) { std::list mylist; if (!ok()) return mylist; map >::iterator ss; if ((ss = m_submaps.find(sk)) == m_submaps.end()) { return mylist; } map::const_iterator it; for (it = ss->second.begin();it != ss->second.end();it++) { if (pattern && FNM_NOMATCH == fnmatch(pattern, it->first.c_str(), 0)) continue; mylist.push_back(it->first); } mylist.sort(); mylist.unique(); return mylist; } list ConfSimple::getSubKeys() { std::list mylist; if (!ok()) return mylist; map >::iterator ss; for (ss = m_submaps.begin(); ss != m_submaps.end(); ss++) { mylist.push_back(ss->first); } return mylist; } bool ConfSimple::hasNameAnywhere(const string& nm) { listkeys = getSubKeys(); for (list::const_iterator it = keys.begin(); it != keys.end(); it++) { string val; if (get(nm, val, *it)) return true; } return false; } // ////////////////////////////////////////////////////////////////////////// // ConfTree Methods: conftree interpret keys like a hierarchical file tree // ////////////////////////////////////////////////////////////////////////// int ConfTree::get(const std::string &name, string &value, const string &sk) const { if (sk.empty() || sk[0] != '/') { // LOGDEB((stderr, "ConfTree::get: looking in global space\n")); return ConfSimple::get(name, value, sk); } // Get writable copy of subkey path string msk = sk; // Handle the case where the config file path has an ending / and not // the input sk path_catslash(msk); // Look in subkey and up its parents until root ('') for (;;) { // LOGDEB((stderr,"ConfTree::get: looking for '%s' in '%s'\n", // name.c_str(), msk.c_str())); if (ConfSimple::get(name, value, msk)) return 1; string::size_type pos = msk.rfind("/"); if (pos != string::npos) { msk.replace(pos, string::npos, string()); } else break; } return 0; } #else // TEST_CONFTREE #include #include #include #include #include #include #include #include #include "conftree.h" #include "smallut.h" #include "readfile.h" using namespace std; static char *thisprog; bool complex_updates(const string& fn) { int fd; if ((fd = open(fn.c_str(), O_RDWR|O_TRUNC|O_CREAT, 0666)) < 0) { perror("open/create"); return false; } close(fd); ConfTree conf(fn.c_str()); if (!conf.ok()) { cerr << "Config init failed" << endl; return false; } conf.set("nm-1", "val-1", ""); conf.set("nm-2", "val-2", ""); conf.set("nm-1", "val1-1", "/dir1"); conf.set("nm-2", "val1-2", "/dir1"); conf.set("nm-1", "val2-1", "/dir2"); conf.set("nm-2", "val2-2", "/dir2"); conf.set("nm-1", "val11-1", "/dir1/dir1"); conf.set("nm-2", "val11-2", "/dir1/dir1"); conf.eraseKey("/dir2"); conf.set("nm-1", "val2-1", "/dir2"); conf.set("nm-2", "val2-2", "/dir2"); conf.erase("nm-1", ""); conf.erase("nm-2", ""); conf.eraseKey("/dir1"); conf.eraseKey("/dir2"); conf.eraseKey("/dir1/dir1"); conf.set("nm-1", "val1-1", "/dir1"); conf.set("nm-2", "val1-2", "/dir1"); conf.set("nm-1", "val-1", ""); conf.set("nm-1", "val2-1", "/dir2"); conf.set("nm-2", "val2-2", "/dir2"); conf.set("nm-1", "val11-1", "/dir1/dir1"); conf.set("nm-2", "val11-2", "/dir1/dir1"); conf.erase("nm-1", "/dir2"); conf.erase("nm-2", "/dir2"); conf.erase("nm-1", "/dir1/dir1"); conf.erase("nm-2", "/dir1/dir1"); string data; file_to_string(fn, data, 0); const string ref = "nm-1 = val-1\n" "[/dir1]\n" "nm-1 = val1-1\n" "nm-2 = val1-2\n" ; if (data.compare(ref)) { cerr << "Final file:" << endl << data << endl << "Differs from ref:" << endl << ref << endl; return false; } else { cout << "Updates test Ok" << endl; } return true; } ConfSimple::WalkerCode mywalker(void *, const string &nm, const string &value) { if (nm.empty()) printf("\n[%s]\n", value.c_str()); else printf("'%s' -> '%s'\n", nm.c_str(), value.c_str()); return ConfSimple::WALK_CONTINUE; } const char *longvalue = "Donnees012345678901234567890123456789012345678901234567890123456789AA" "0123456789012345678901234567890123456789012345678901234567890123456789FIN" ; void memtest(ConfSimple &c) { cout << "Initial:" << endl; c.listall(); if (c.set("nom", "avec nl \n 2eme ligne", "")) { fprintf(stderr, "set with embedded nl succeeded !\n"); exit(1); } if (!c.set(string("parm1"), string("1"), string("subkey1"))) { fprintf(stderr, "Set error"); exit(1); } if (!c.set("sparm", "Parametre \"string\" bla", "s2")) { fprintf(stderr, "Set error"); exit(1); } if (!c.set("long", longvalue, "")) { fprintf(stderr, "Set error"); exit(1); } cout << "Final:" << endl; c.listall(); } bool readwrite(ConfNull *conf) { if (conf->ok()) { // It's ok for the file to not exist here string value; if (conf->get("mypid", value)) { cout << "Value for mypid is [" << value << "]" << endl; } else { cout << "mypid not set" << endl; } if (conf->get("unstring", value)) { cout << "Value for unstring is ["<< value << "]" << endl; } else { cout << "unstring not set" << endl; } } char spid[100]; sprintf(spid, "%d", getpid()); if (!conf->set("mypid", spid)) { cerr << "Set mypid failed" << endl; } ostringstream ost; ost << "mypid" << getpid(); if (!conf->set(ost.str(), spid, "")) { cerr << "Set mypid failed (2)" << endl; } if (!conf->set("unstring", "Une jolie phrase pour essayer")) { cerr << "Set unstring failed" << endl; } return true; } bool query(ConfNull *conf, const string& nm, const string& sub) { if (!conf->ok()) { cerr << "Error opening or parsing file\n" << endl; return false; } string value; if (!conf->get(nm, value, sub)) { cerr << "name [" << nm << "] not found in [" << sub << "]" << endl; return false; } cout << "[" << sub << "] " << nm << " " << value << endl; return true; } bool erase(ConfNull *conf, const string& nm, const string& sub) { if (!conf->ok()) { cerr << "Error opening or parsing file\n" << endl; return false; } if (!conf->erase(nm, sub)) { cerr << "delete name [" << nm << "] in ["<< sub << "] failed" << endl; return false; } return true; } bool eraseKey(ConfNull *conf, const string& sub) { if (!conf->ok()) { cerr << "Error opening or parsing file\n" << endl; return false; } if (!conf->eraseKey(sub)) { cerr << "delete key [" << sub << "] failed" << endl; return false; } return true; } bool setvar(ConfNull *conf, const string& nm, const string& value, const string& sub) { if (!conf->ok()) { cerr << "Error opening or parsing file\n" << endl; return false; } if (!conf->set(nm, value, sub)) { cerr << "Set error\n" << endl; return false; } return true; } static char usage [] = "testconftree [opts] filename\n" "[-w] : read/write test.\n" "[-s] : string parsing test. Filename must hold parm 'strings'\n" "-a nm value sect : add/set nm,value in 'sect' which can be ''\n" "-q nm sect : subsection test: look for nm in 'sect' which can be ''\n" "-d nm sect : delete nm in 'sect' which can be ''\n" "-E sect : erase key (and all its names)\n" "-S : string io test. No filename in this case\n" "-V : volatile config test. No filename in this case\n" "-U : complex update test. Will erase the named file parameter\n" ; void Usage() { fprintf(stderr, "%s:%s\n", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_w 0x2 #define OPT_q 0x4 #define OPT_s 0x8 #define OPT_S 0x10 #define OPT_d 0x20 #define OPT_V 0x40 #define OPT_a 0x80 #define OPT_k 0x100 #define OPT_E 0x200 #define OPT_U 0x400 int main(int argc, char **argv) { const char *nm = 0; const char *sub = 0; const char *value = 0; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'a': op_flags |= OPT_a; if (argc < 4) Usage(); nm = *(++argv);argc--; value = *(++argv);argc--; sub = *(++argv);argc--; goto b1; case 'd': op_flags |= OPT_d; if (argc < 3) Usage(); nm = *(++argv);argc--; sub = *(++argv);argc--; goto b1; case 'E': op_flags |= OPT_E; if (argc < 2) Usage(); sub = *(++argv);argc--; goto b1; case 'k': op_flags |= OPT_k; break; case 'q': op_flags |= OPT_q; if (argc < 3) Usage(); nm = *(++argv);argc--; sub = *(++argv);argc--; goto b1; case 's': op_flags |= OPT_s; break; case 'S': op_flags |= OPT_S; break; case 'V': op_flags |= OPT_V; break; case 'U': op_flags |= OPT_U; break; case 'w': op_flags |= OPT_w; break; default: Usage(); break; } b1: argc--; argv++; } if ((op_flags & OPT_S)) { // String storage test if (argc != 0) Usage(); string s; ConfSimple c(s); memtest(c); exit(0); } else if ((op_flags & OPT_V)) { // No storage test if (argc != 0) Usage(); ConfSimple c; memtest(c); exit(0); } // Other tests use file(s) as backing store if (argc < 1) Usage(); if (op_flags & OPT_U) { exit(!complex_updates(argv[0])); } list flist; while (argc--) { flist.push_back(*argv++); } bool ro = !(op_flags & (OPT_w|OPT_a|OPT_d|OPT_E)); ConfNull *conf = 0; switch (flist.size()) { case 0: Usage(); break; case 1: conf = new ConfTree(flist.front().c_str(), ro); break; default: conf = new ConfStack(flist, ro); break; } if (op_flags & OPT_w) { exit(!readwrite(conf)); } else if (op_flags & OPT_q) { exit(!query(conf, nm, sub)); } else if (op_flags & OPT_k) { if (!conf->ok()) { cerr << "conf init error" << endl; exit(1); } listlst = conf->getSubKeys(); for (list::const_iterator it = lst.begin(); it != lst.end(); it++) { cout << *it << endl; } exit(0); } else if (op_flags & OPT_a) { exit(!setvar(conf, nm, value, sub)); } else if (op_flags & OPT_d) { exit(!erase(conf, nm, sub)); } else if (op_flags & OPT_E) { exit(!eraseKey(conf, sub)); } else if (op_flags & OPT_s) { if (!conf->ok()) { cerr << "Cant open /parse conf file " << endl; exit(1); } string source; if (!conf->get(string("strings"), source, "")) { cerr << "Cant get param 'strings'" << endl; exit(1); } cout << "source: [" << source << "]" << endl; list strings; if (!stringToStrings(source, strings)) { cerr << "parse failed" << endl; exit(1); } for (list::iterator it = strings.begin(); it != strings.end(); it++) { cout << "[" << *it << "]" << endl; } } else { if (!conf->ok()) { fprintf(stderr, "Open failed\n"); exit(1); } printf("LIST\n"); conf->listall(); //printf("WALK\n");conf->sortwalk(mywalker, 0); printf("\nNAMES in global space:\n"); list names = conf->getNames(""); for (list::iterator it = names.begin(); it!=names.end(); it++) cout << *it << " "; cout << endl; printf("\nNAMES in global space matching t* \n"); names = conf->getNames("", "t*"); for (list::iterator it = names.begin(); it!=names.end(); it++) cout << *it << " "; cout << endl; } } #endif recoll-1.17.3/utils/conftree.h000644 001750 000000 00000036457 11740755063 016631 0ustar00dockeswheel000000 000000 /* * 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 _CONFTREE_H_ #define _CONFTREE_H_ /** * A simple configuration file implementation. * * Configuration files have lines like 'name = value', and/or like '[subkey]' * * Lines like '[subkey]' in the file define subsections, with independant * configuration namespaces. Only subsections holding at least one variable are * significant (empty subsections may be deleted during an update, or not) * * Whitespace around name and value is insignificant. * * The names are case-sensitive but don't depend on it, this might change * * Values can be queried for, or set. * * Any line without a '=' is a comment (a line like #var = value * actually assigns a variable named '#var', which is not a big issue) * * A configuration object can be created empty or by reading from a file or * a string. * All 'set' calls cause an immediate rewrite of the backing object if any * (file or string) * * The ConfTree derived class interprets the subkeys as file paths and * lets subdir keys hierarchically inherit the properties from * parents. * * The ConfStack class stacks several Con(Simple/Tree) objects so that * parameters from the top of the stack override the values from lower * (useful to have central/personal config files) */ #include #include #include // rh7.3 likes iostream better... #if defined(__GNUC__) && __GNUC__ < 3 #include #else #include #include #endif #ifndef NO_NAMESPACES using std::string; using std::list; using std::map; using std::istream; using std::ostream; #endif // NO_NAMESPACES #include "pathut.h" /** Internal class used for storing presentation information */ class ConfLine { public: enum Kind {CFL_COMMENT, CFL_SK, CFL_VAR}; Kind m_kind; string m_data; ConfLine(Kind k, const string& d) : m_kind(k), m_data(d) { } bool operator==(const ConfLine& o) { return o.m_kind == m_kind && o.m_data == m_data; } }; /** * Virtual base class used to define an interface mostly useful for testing */ class ConfNull { public: enum StatusCode {STATUS_ERROR=0, STATUS_RO=1, STATUS_RW=2}; virtual ~ConfNull() {}; virtual int get(const string &name, string &value, const string &sk = string()) const = 0; virtual bool hasNameAnywhere(const string& nm) = 0; virtual int set(const string &nm, const string &val, const string &sk = string()) = 0; virtual bool ok() const = 0; virtual list getNames(const string &sk, const char* = 0) = 0; virtual int erase(const string &, const string &) = 0; virtual int eraseKey(const string &) = 0; virtual void listall() {}; virtual list getSubKeys() = 0; virtual list getSubKeys(bool) = 0; virtual bool holdWrites(bool) = 0; virtual bool sourceChanged() = 0; }; /** * Manages a simple configuration file with subsections. */ class ConfSimple : public ConfNull { public: /** * Build the object by reading content from file. * @param filename file to open * @param readonly if true open readonly, else rw * @param tildexp try tilde (home dir) expansion for subkey values */ ConfSimple(const char *fname, int readonly = 0, bool tildexp = false); /** * Build the object by reading content from a string * @param data points to the data to parse. * @param readonly if true open readonly, else rw * @param tildexp try tilde (home dir) expansion for subsection names */ ConfSimple(const string& data, int readonly = 0, bool tildexp = false); /** * Build an empty object. This will be memory only, with no backing store. * @param readonly if true open read only, else rw * @param tildexp try tilde (home dir) expansion for subsection names */ ConfSimple(int readonly = 0, bool tildexp = false); virtual ~ConfSimple() {}; /** Origin file changed. Only makes sense if we read the data from a file */ virtual bool sourceChanged(); /** * Decide if we actually rewrite the backing-store after modifying the * tree. */ virtual bool holdWrites(bool on) { m_holdWrites = on; if (on == false) { return write(); } else return true; } /** * Get value for named parameter, from specified subsection (looks in * global space if sk is empty). * @return 0 if name not found, 1 else */ virtual int get(const string &name, string &value, const string &sk = string()) const; /** * Set value for named parameter in specified subsection (or global) * @return 0 for error, 1 else */ virtual int set(const string &nm, const string &val, const string &sk = string()); /** * Remove name and value from config */ virtual int erase(const string &name, const string &sk); /** * Erase all names under given subkey (and subkey itself) */ virtual int eraseKey(const string &sk); virtual StatusCode getStatus() const; virtual bool ok() const {return getStatus() != STATUS_ERROR;} /** * Walk the configuration values, calling function for each. * The function is called with a null nm when changing subsections (the * value is then the new subsection name) * @return WALK_STOP when/if the callback returns WALK_STOP, * WALK_CONTINUE else (got to end of config) */ enum WalkerCode {WALK_STOP, WALK_CONTINUE}; virtual WalkerCode sortwalk(WalkerCode (*wlkr)(void *cldata, const string &nm, const string &val), void *clidata); /** List all values to stdout */ virtual void listall(); /** Return all names in given submap. */ virtual list getNames(const string &sk, const char *pattern = 0); /** Check if name is present in any submap. This is relatively expensive * but useful for saving further processing sometimes */ virtual bool hasNameAnywhere(const string& nm); /** * Return all subkeys */ virtual list getSubKeys(bool) {return getSubKeys();} virtual list getSubKeys(); /** Test for subkey existence */ virtual bool hasSubKey(const string& sk) { return m_submaps.find(sk) != m_submaps.end(); } virtual string getFilename() {return m_filename;} /** * Copy constructor. Expensive but less so than a full rebuild */ ConfSimple(const ConfSimple &rhs) : ConfNull() { if ((status = rhs.status) == STATUS_ERROR) return; m_filename = rhs.m_filename; m_submaps = rhs.m_submaps; } /** * Assignement. This is expensive */ ConfSimple& operator=(const ConfSimple &rhs) { if (this != &rhs && (status = rhs.status) != STATUS_ERROR) { m_filename = rhs.m_filename; m_submaps = rhs.m_submaps; } return *this; } /** * Write in file format to out */ bool write(ostream& out) const; protected: bool dotildexpand; StatusCode status; private: // Set if we're working with a file string m_filename; time_t m_fmtime; // Configuration data submaps (one per subkey, the main data has a // null subkey) map > m_submaps; // Presentation data. We keep the comments, empty lines and // variable and subkey ordering information in there (for // rewriting the file while keeping hand-edited information) list m_order; // Control if we're writing to the backing store bool m_holdWrites; void parseinput(istream& input); bool write(); // Internal version of set: no RW checking virtual int i_set(const string &nm, const string &val, const string &sk, bool init = false); bool i_changed(bool upd); }; /** * This is a configuration class which attaches tree-like signification to the * submap names. * * If a given variable is not found in the specified section, it will be * looked up the tree of section names, and in the global space. * * submap names should be '/' separated paths (ie: /sub1/sub2). No checking * is done, but else the class adds no functionality to ConfSimple. * * NOTE: contrary to common behaviour, the global or root space is NOT * designated by '/' but by '' (empty subkey). A '/' subkey will not * be searched at all. * * Note: getNames() : uses ConfSimple method, this does *not* inherit * names from englobing submaps. */ class ConfTree : public ConfSimple { public: /* The constructors just call ConfSimple's, asking for key tilde * expansion */ ConfTree(const char *fname, int readonly = 0) : ConfSimple(fname, readonly, true) {} ConfTree(const string &data, int readonly = 0) : ConfSimple(data, readonly, true) {} ConfTree(int readonly = 0) : ConfSimple(readonly, true) {} virtual ~ConfTree() {}; ConfTree(const ConfTree& r) : ConfSimple(r) {}; ConfTree& operator=(const ConfTree& r) { ConfSimple::operator=(r); return *this; } /** * Get value for named parameter, from specified subsection, or its * parents. * @return 0 if name not found, 1 else */ virtual int get(const string &name, string &value, const string &sk) const; }; /** * Use several config files, trying to get values from each in order. Used to * have a central config, with possible overrides from more specific * (ie personal) ones. * * Notes: it's ok for some of the files in the list to not exist, but the last * one must or we generate an error. We open all trees readonly, except the * topmost one if requested. All writes go to the topmost file. Note that * erase() won't work except for parameters only defined in the topmost * file (it erases only from there). */ template class ConfStack : public ConfNull { public: /// Construct from list of configuration file names. The earler /// files in have priority when fetching values. Only the first /// file will be updated if ro is false and set() is used. ConfStack(const list &fns, bool ro = true) { construct(fns, ro); } /// Construct out of single file name and list of directories ConfStack(const string& nm, const list& dirs, bool ro = true) { list fns; for (list::const_iterator it = dirs.begin(); it != dirs.end(); it++){ fns.push_back(path_cat(*it, nm)); } ConfStack::construct(fns, ro); } ConfStack(const ConfStack &rhs) : ConfNull() { init_from(rhs); } virtual ~ConfStack() { clear(); m_ok = false; } ConfStack& operator=(const ConfStack &rhs) { if (this != &rhs){ clear(); m_ok = rhs.m_ok; if (m_ok) init_from(rhs); } return *this; } virtual bool sourceChanged() { typename list::const_iterator it; for (it = m_confs.begin();it != m_confs.end();it++) { if ((*it)->sourceChanged()) return true; } return false; } virtual int get(const string &name, string &value, const string &sk) const { typename list::const_iterator it; for (it = m_confs.begin();it != m_confs.end();it++) { if ((*it)->get(name, value, sk)) return true; } return false; } virtual bool hasNameAnywhere(const string& nm) { typename list::iterator it; for (it = m_confs.begin();it != m_confs.end();it++) { if ((*it)->hasNameAnywhere(nm)) return true; } return false; } virtual int set(const string &nm, const string &val, const string &sk = string()) { if (!m_ok) return 0; // Avoid adding unneeded entries: if the new value matches the // one out from the deeper configs, erase or dont add it // from/to the topmost file typename list::iterator it = m_confs.begin(); it++; while (it != m_confs.end()) { string value; if ((*it)->get(nm, value, sk)) { // This file has value for nm/sk. If it is the same as the new // one, no need for an entry in the topmost file. Else, stop // looking and add the new entry if (value == val) { m_confs.front()->erase(nm, sk); return true; } else { break; } } it++; } return m_confs.front()->set(nm, val, sk); } virtual int erase(const string &nm, const string &sk) { return m_confs.front()->erase(nm, sk); } virtual int eraseKey(const string &sk) { return m_confs.front()->eraseKey(sk); } virtual bool holdWrites(bool on) { return m_confs.front()->holdWrites(on); } virtual list getNames(const string &sk, const char *pattern = 0) { return getNames1(sk, pattern, false); } virtual list getNamesShallow(const string &sk, const char *patt = 0) { return getNames1(sk, patt, true); } virtual list getNames1(const string &sk, const char *pattern, bool shallow) { list nms; typename list::iterator it; bool skfound = false; for (it = m_confs.begin();it != m_confs.end(); it++) { if ((*it)->hasSubKey(sk)) { skfound = true; list lst = (*it)->getNames(sk, pattern); nms.insert(nms.end(), lst.begin(), lst.end()); } if (shallow && skfound) break; } nms.sort(); nms.unique(); return nms; } virtual list getSubKeys(){return getSubKeys(false);} virtual list getSubKeys(bool shallow) { list sks; typename list::iterator it; for (it = m_confs.begin();it != m_confs.end(); it++) { list lst; lst = (*it)->getSubKeys(); sks.insert(sks.end(), lst.begin(), lst.end()); if (shallow) break; } sks.sort(); sks.unique(); return sks; } virtual bool ok() const {return m_ok;} private: bool m_ok; list m_confs; /// Reset to pristine void clear() { typename list::iterator it; for (it = m_confs.begin();it != m_confs.end();it++) { delete (*it); } m_confs.clear(); } /// Common code to initialize from existing object void init_from(const ConfStack &rhs) { if ((m_ok = rhs.m_ok)) { typename list::const_iterator it; for (it = rhs.m_confs.begin();it != rhs.m_confs.end();it++) { m_confs.push_back(new T(**it)); } } } /// Common construct from file list code void construct(const list &fns, bool ro) { list::const_iterator it; bool lastok = false; for (it = fns.begin(); it != fns.end(); it++) { T* p = new T(it->c_str(), ro); if (p && p->ok()) { m_confs.push_back(p); lastok = true; } else { delete p; lastok = false; if (!ro) { // For rw acccess, the topmost file needs to be ok // (ro is set to true after the first file) break; } } ro = true; } m_ok = lastok; } }; #endif /*_CONFTREE_H_ */ recoll-1.17.3/utils/copyfile.cpp000644 001750 000000 00000011465 11740755063 017161 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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_COPYFILE #include #include #include #include #include #include #include #include #include #include "copyfile.h" #include "debuglog.h" #define CPBSIZ 8192 #define COPYFILE_NOERRUNLINK 1 bool copyfile(const char *src, const char *dst, string &reason, int flags) { int sfd = -1; int dfd = -1; bool ret = false; char buf[CPBSIZ]; LOGDEB(("copyfile: %s to %s\n", src, dst)); if ((sfd = open(src, O_RDONLY)) < 0) { reason += string("open ") + src + ": " + strerror(errno); goto out; } if ((dfd = open(dst, O_WRONLY|O_CREAT|O_TRUNC, 0644)) < 0) { reason += string("open/creat ") + dst + ": " + strerror(errno); // If we fail because of an open/truncate error, we do not want to unlink // the file, we might succeed... flags |= COPYFILE_NOERRUNLINK; goto out; } for (;;) { int didread; didread = read(sfd, buf, CPBSIZ); if (didread < 0) { reason += string("read src ") + src + ": " + strerror(errno); goto out; } if (didread == 0) break; if (write(dfd, buf, didread) != didread) { reason += string("write dst ") + src + ": " + strerror(errno); goto out; } } ret = true; out: if (ret == false && !(flags©FILE_NOERRUNLINK)) unlink(dst); if (sfd >= 0) close(sfd); if (dfd >= 0) close(dfd); return ret; } bool renameormove(const char *src, const char *dst, string &reason) { // First try rename(2). If this succeeds we're done. If this fails // with EXDEV, try to copy. Unix really should have a library function // for this. if (rename(src, dst) == 0) { return true; } if (errno != EXDEV) { reason += string("rename(2) failed: ") + strerror(errno); return false; } struct stat st; if (stat(src, &st) < 0) { reason += string("Can't stat ") + src + " : " + strerror(errno); return false; } if (!copyfile(src, dst, reason)) return false; struct stat st1; if (stat(dst, &st1) < 0) { reason += string("Can't stat ") + dst + " : " + strerror(errno); return false; } // Try to preserve modes, owner, times. This may fail for a number // of reasons if ((st1.st_mode & 0777) != (st.st_mode & 0777)) { chmod(dst, st.st_mode&0777); } if (st.st_uid != st1.st_uid || st.st_gid != st1.st_gid) { chown(dst, st.st_uid, st.st_gid); } struct timeval times[2]; times[0].tv_sec = st.st_atime; times[0].tv_usec = 0; times[1].tv_sec = st.st_mtime; times[1].tv_usec = 0; utimes(dst, times); // All ok, get rid of origin if (unlink(src) < 0) { reason += string("Can't unlink ") + src + "Error : " + strerror(errno); } return true; } #else #include #include #include #include #include using namespace std; #include "copyfile.h" static int op_flags; #define OPT_MOINS 0x1 #define OPT_m 0x2 static const char *thisprog; static char usage [] = "trcopyfile [-m] src dst\n" " -m : move instead of copying\n" "\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } int main(int argc, const char **argv) { thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'm': op_flags |= OPT_m; break; default: Usage(); break; } argc--; argv++; } if (argc != 2) Usage(); string src = *argv++;argc--; string dst = *argv++;argc--; bool ret; string reason; if (op_flags & OPT_m) { ret = renameormove(src.c_str(), dst.c_str(), reason); } else { ret = copyfile(src.c_str(), dst.c_str(), reason); } if (!ret) { cerr << reason << endl; exit(1); } exit(0); } #endif recoll-1.17.3/utils/copyfile.h000644 001750 000000 00000002304 11740755063 016616 0ustar00dockeswheel000000 000000 /* 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 _COPYFILE_H_INCLUDED_ #define _COPYFILE_H_INCLUDED_ #include using std::string; enum CopyfileFlags {COPYFILE_NONE = 0, COPYFILE_NOERRUNLINK = 1}; extern bool copyfile(const char *src, const char *dst, string &reason, int flags = 0); // Try to rename, copy/unlink source if this fails (different devs) extern bool renameormove(const char *src, const char *dst, string &reason); #endif /* _COPYFILE_H_INCLUDED_ */ recoll-1.17.3/utils/debuglog.cpp000644 001750 000000 00000023074 11740755063 017136 0ustar00dockeswheel000000 000000 /* 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 TEST_DEBUGLOG #define __USE_GNU #include #include #include #include #ifdef INCLUDE_NEW_H #include #endif #include #include #include using std::set; using std::string; using std::list; #include "debuglog.h" #include "pathut.h" #include "smallut.h" #ifndef freeZ #define freeZ(X) {if (X) {free(X);X=0;}} #endif #ifndef NO_NAMESPACES using namespace std; namespace DebugLog { #endif // NO_NAMESPACES bool DebugLog::isspecialname(const char *logname) { return !strcmp(logname, "stdout") || !strcmp(logname, "stderr"); } class DebugLogWriter { public: virtual ~DebugLogWriter() {} virtual int put(const char *s) = 0; }; class DLFWImpl; class DebugLogFileWriter : public DebugLogWriter { DLFWImpl *impl; public: DebugLogFileWriter(); ~DebugLogFileWriter(); virtual const char *getfilename(); virtual int setfilename(const char *fname, int trnc = 1); virtual int put(const char *s); }; class DLFWImpl { char *filename; FILE *fp; int truncate; public: // Open output file if needed, return 0 if ok void maybeopenfp() { if (fp) return; if (filename == 0) return; if (!strcmp(filename, "stdout")) { fp = stdout; } else if (!strcmp(filename, "stderr")) { fp = stderr; } else { fp = fopen(filename, (truncate) ? "w" : "a"); if (fp) setvbuf(fp, 0, _IOLBF, 0); } return; } void maybeclosefp() { #ifdef DEBUGDEBUG fprintf(stderr, "DebugLogImpl::maybeclosefp: filename %p, fp %p\n", filename, fp); #endif // Close current file if open, and not stdout/stderr if (fp && (filename == 0 || (strcmp(filename, "stdout") && strcmp(filename, "stderr")))) { fclose(fp); } fp = 0; freeZ(filename); } public: DLFWImpl() : filename(0), fp(0), truncate(1) { setfilename("stderr", 0); } ~DLFWImpl() { maybeclosefp(); } int setfilename(const char *fn, int trnc) { maybeclosefp(); filename = strdup(fn); truncate = trnc; return 0; } const char *getfilename() { return filename; } int put(const char *s) { maybeopenfp(); if (fp) return fputs(s, fp); return -1; } }; DebugLogFileWriter::DebugLogFileWriter() { impl = new DLFWImpl; } DebugLogFileWriter::~DebugLogFileWriter() { delete impl; } int DebugLogFileWriter::setfilename(const char *fn, int trnc) { return impl ? impl->setfilename(fn, trnc) : -1; } const char *DebugLogFileWriter::getfilename() { return impl ? impl->getfilename() : 0; } int DebugLogFileWriter::put(const char *s) { return impl ? impl->put(s) : -1; }; static set yesfiles; static void initfiles() { const char *cp = getenv("DEBUGLOG_FILES"); if (!cp) return; vector files; stringToTokens(cp, files, ","); yesfiles.insert(files.begin(), files.end()); } static bool fileInFiles(const string& file) { string sf = path_getsimple(file); if (yesfiles.find(sf) != yesfiles.end()) { //fprintf(stderr, "Debug ON: %s \n", file.c_str()); return true; } //fprintf(stderr, "Debug OFF: %s \n", file.c_str()); return false; } #ifdef _WINDOWS #include static void datestring(char *d, int sz) { SYSTEMTIME buf; GetLocalTime(&buf); int year = buf.wYear % 100; snprintf(d, sz, "%02d%02d%02d%02d%02d%02d", year, int(buf.wMonth), int(buf.wDay), int(buf.wHour), int(buf.wMinute), int(buf.wSecond)); } #define vsnprintf _vsnprintf #else // !WINDOWS -> #include static void datestring(char *d, int sz) { struct tm *tmp; time_t tim = time((time_t)0); tmp = localtime(&tim); int year = tmp->tm_year % 100; snprintf(d, sz, "%02d%02d%02d%02d%02d%02d", year, tmp->tm_mon+1, tmp->tm_mday, tmp->tm_hour, tmp->tm_min, tmp->tm_sec); } #endif // !WINDOWS void DebugLog::prolog(int lev, const char *f, int line) { if (!writer) return; if (!yesfiles.empty() && !fileInFiles(f)) { fileyes = false; return; } else { fileyes = true; } if (dodate) { char dts[100]; datestring(dts, 100); writer->put(dts); } char buf[100]; sprintf(buf, ":%d:", lev); writer->put(buf); #if DEBUGLOG_SHOW_PID sprintf(buf, "%d:", getpid()); writer->put(buf); #endif #if DEBUGLOG_SHOW_THREAD sprintf(buf, "%lx:", (unsigned long)pthread_self()); writer->put(buf); #endif writer->put(f); sprintf(buf, ":%d:", line); writer->put(buf); } void DebugLog::log(const char *s ...) { if (!writer || !fileyes) return; va_list ap; va_start(ap,s); #ifdef HAVE_VASPRINTF_nono // not sure vasprintf is really such a great idea char *buf; vasprintf(&buf, s, ap); if (buf) { #else char buf[4096]; // It's possible that they also wouldn't have vsnprintf but what then ? vsnprintf(buf, 4096, s, ap); { #endif writer->put(buf); } #ifdef HAVE_VASPRINTF_nono if (buf) free(buf); #endif } void DebugLog::setloglevel(int lev) { debuglevel = lev; while (!levels.empty()) levels.pop(); pushlevel(lev); } void DebugLog::pushlevel(int lev) { debuglevel = lev; levels.push(lev); } void DebugLog::poplevel() { if (levels.empty()) debuglevel = 0; if (levels.size() > 1) levels.pop(); debuglevel = levels.top(); } //////////////////////////////////////////////////////////// // Global functions ////////////////////////////////////// static DebugLogFileWriter lwriter; static DebugLogFileWriter *theWriter = &lwriter; const char *getfilename() { return theWriter ? theWriter->getfilename() : 0; } int setfilename(const char *fname, int trnc) { return theWriter ? theWriter->setfilename(fname, trnc) : -1; } #if DEBUGLOG_USE_THREADS #include static pthread_key_t dbl_key; static pthread_once_t key_once = PTHREAD_ONCE_INIT; static void thrdatadel(void *data) { // fprintf(stderr, "DebugLog:: thrdatadel: %p\n", data); DebugLog *dbl = (DebugLog *)data; delete dbl; pthread_setspecific(dbl_key, 0); } static void once_routine(void) { int status; status = pthread_key_create(&dbl_key, thrdatadel); if (status != 0) { fprintf(stderr, "debuglog: cant initialize pthread " "thread private storage key\n"); abort(); } } DebugLog *getdbl() { int status = pthread_once(&key_once, once_routine); if (status != 0) { fprintf(stderr, "debuglog: cant initialize pthread " "thread private storage key (pthread_once)\n"); abort(); } DebugLog *dbl; if (!(dbl = (DebugLog *)pthread_getspecific(dbl_key))) { if ((dbl = new DebugLog) == 0) { fprintf(stderr, "debuglog: new DebugLog returned 0! "); abort(); } dbl->setwriter(theWriter); initfiles(); status = pthread_setspecific(dbl_key, dbl); if (status) { fprintf(stderr, "debuglog: cant initialize pthread " "thread private storage key (pthread_setspecific)\n"); abort(); } } return dbl; } #else // No threads -> static DebugLog *dbl; DebugLog *getdbl() { if (!dbl) { dbl = new DebugLog; dbl->setwriter(theWriter); initfiles(); } return dbl; } #endif #ifndef NO_NAMESPACES } #endif // NO_NAMESPACES ////////////////////////////////////////// TEST DRIVER ////////////////// #else /* TEST_DEBUGLOG */ #include #include "debuglog.h" #if DEBUGLOG_USE_THREADS #define TEST_THREADS #endif #ifdef TEST_THREADS #include #endif const int iloop = 5; void *thread_test(void *data) { const char *s = (const char *)data; int lev = atoi(s); DebugLog::getdbl()->setloglevel(DEBDEB); for (int i = 1; i < iloop;i++) { switch (lev) { case 1: LOGFATAL(("Thread: %s count: %d\n", s, i));break; case 2: LOGERR(("Thread: %s count: %d\n", s, i));break; default: case 3: LOGINFO(("Thread: %s count: %d\n", s, i));break; } sleep(1); } return 0; } int main(int argc, char **argv) { #ifdef TEST_THREADS pthread_t t1, t2, t3; char name1[20]; strcpy(name1, "1"); pthread_create(&t1, 0, thread_test, name1); char name2[20]; strcpy(name2, "2"); pthread_create(&t2, 0, thread_test, name2); char name3[20]; strcpy(name3, "3"); pthread_create(&t3, 0, thread_test, name3); DebugLog::getdbl()->setloglevel(DEBDEB); for (int i = 1; i < iloop;i++) { LOGINFO(("LOGGING FROM MAIN\n")); sleep(1); } sleep(2); exit(0); #else LOGFATAL(("FATAL\n","Val")); DebugLog::getdbl()->logdate(1); LOGERR(("ERR\n","Val")); LOGINFO(("INFO\n","Val")); LOGDEB0(("DEBUG %s\n","valeur")); int lev; printf("Testing push. Initial level: %d\n", DebugLog::getdbl()->getlevel()); for (lev = 0; lev < 4;lev++) { DebugLog::getdbl()->pushlevel(lev); printf("Lev now %d\n", DebugLog::getdbl()->getlevel()); } printf("Testing pop\n"); for (lev = 0; lev < 7;lev++) { DebugLog::getdbl()->poplevel(); printf("Lev now %d\n", DebugLog::getdbl()->getlevel()); } #endif } #endif /* TEST_DEBUGLOG */ recoll-1.17.3/utils/debuglog.h000644 001750 000000 00000007547 11740755063 016612 0ustar00dockeswheel000000 000000 /* * 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 _DEBUGLOG_H_ #define _DEBUGLOG_H_ /* Macros for log and debug messages */ #include #ifndef NO_NAMESPACES namespace DebugLog { using std::stack; #endif // NO_NAMESPACES #ifndef DEBUGLOG_USE_THREADS #define DEBUGLOG_USE_THREADS 1 #endif #define DEBFATAL 1 #define DEBERR 2 #define DEBINFO 3 #define DEBDEB 4 #define DEBDEB0 5 #define DEBDEB1 6 #define DEBDEB2 7 #define DEBDEB3 8 #ifndef STATICVERBOSITY #define STATICVERBOSITY DEBDEB0 #endif class DebugLogWriter; class DebugLog { stack levels; int debuglevel; int dodate; DebugLogWriter *writer; bool fileyes; public: DebugLog() : debuglevel(10), dodate(0), writer(0), fileyes(true) {} DebugLog(DebugLogWriter *w) : debuglevel(-1), dodate(0), writer(w), fileyes(true) {} virtual ~DebugLog() {} virtual void setwriter(DebugLogWriter *w) {writer = w;} virtual DebugLogWriter *getwriter() {return writer;} virtual void prolog(int lev, const char *srcfname, int line); virtual void log(const char *s ...); virtual void setloglevel(int lev); inline int getlevel() {return debuglevel;} virtual void pushlevel(int lev); virtual void poplevel(); virtual void logdate(int onoff) {dodate = onoff;} static bool isspecialname(const char *logname); }; extern DebugLog *getdbl(); extern const char *getfilename(); extern int setfilename(const char *fname, int trnc = 1); #if STATICVERBOSITY >= DEBFATAL #define LOGFATAL(X) {if (DebugLog::getdbl()->getlevel()>=DEBFATAL){DebugLog::getdbl()->prolog(DEBFATAL,__FILE__,__LINE__) ;DebugLog::getdbl()->log X;}} #else #define LOGFATAL(X) #endif #if STATICVERBOSITY >= DEBERR #define LOGERR(X) {if (DebugLog::getdbl()->getlevel()>=DEBERR){DebugLog::getdbl()->prolog(DEBERR,__FILE__,__LINE__) ;DebugLog::getdbl()->log X;}} #else #define LOGERR(X) #endif #if STATICVERBOSITY >= DEBINFO #define LOGINFO(X) {if (DebugLog::getdbl()->getlevel()>=DEBINFO){DebugLog::getdbl()->prolog(DEBINFO,__FILE__,__LINE__) ;DebugLog::getdbl()->log X;}} #else #define LOGINFO(X) #endif #if STATICVERBOSITY >= DEBDEB #define LOGDEB(X) {if (DebugLog::getdbl()->getlevel()>=DEBDEB){DebugLog::getdbl()->prolog(DEBDEB,__FILE__,__LINE__) ;DebugLog::getdbl()->log X;}} #else #define LOGDEB(X) #endif #if STATICVERBOSITY >= DEBDEB0 #define LOGDEB0(X) {if (DebugLog::getdbl()->getlevel()>=DEBDEB0){DebugLog::getdbl()->prolog(DEBDEB0,__FILE__,__LINE__) ;DebugLog::getdbl()->log X;}} #else #define LOGDEB0(X) #endif #if STATICVERBOSITY >= DEBDEB1 #define LOGDEB1(X) {if (DebugLog::getdbl()->getlevel()>=DEBDEB1){DebugLog::getdbl()->prolog(DEBDEB1,__FILE__,__LINE__) ;DebugLog::getdbl()->log X;}} #else #define LOGDEB1(X) #endif #if STATICVERBOSITY >= DEBDEB2 #define LOGDEB2(X) {if (DebugLog::getdbl()->getlevel()>=DEBDEB2){DebugLog::getdbl()->prolog(DEBDEB2,__FILE__,__LINE__) ;DebugLog::getdbl()->log X;}} #else #define LOGDEB2(X) #endif #if STATICVERBOSITY >= DEBDEB3 #define LOGDEB3(X) {if (DebugLog::getdbl()->getlevel()>=DEBDEB3){DebugLog::getdbl()->prolog(DEBDEB3,__FILE__,__LINE__) ;DebugLog::getdbl()->log X;}} #else #define LOGDEB3(X) #endif #ifndef NO_NAMESPACES } #endif // NO_NAMESPACES #endif /* _DEBUGLOG_H_ */ recoll-1.17.3/utils/ecrontab.cpp000644 001750 000000 00000015130 11740755063 017135 0ustar00dockeswheel000000 000000 /* 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_ECRONTAB #include "autoconfig.h" #include #include "ecrontab.h" #include "execmd.h" #include "smallut.h" #include "debuglog.h" // Read crontab file and split it into lines. static bool eCrontabGetLines(vector& lines) { string crontab; ExecCmd croncmd; list args; int status; // Retrieve current crontab contents. An error here means that no // crontab exists, and is not fatal, but we return a different // status than for an empty one args.push_back("-l"); if ((status = croncmd.doexec("crontab", args, 0, &crontab))) { lines.clear(); return false; } // Split crontab into lines stringToTokens(crontab, lines, "\n"); return true; } // Concatenate lines and write crontab static bool eCrontabWriteFile(const vector& lines, string& reason) { string crontab; ExecCmd croncmd; list args; int status; for (vector::const_iterator it = lines.begin(); it != lines.end(); it++) { crontab += *it + "\n"; } args.push_back("-"); if ((status = croncmd.doexec("crontab", args, &crontab, 0))) { char nbuf[30]; sprintf(nbuf, "0x%x", status); reason = string("Exec crontab -l failed: status: ") + nbuf; return false; } return true; } // Add / change / delete entry identified by marker and id bool editCrontab(const string& marker, const string& id, const string& sched, const string& cmd, string& reason) { vector lines; if (!eCrontabGetLines(lines)) { // Special case: cmd is empty, no crontab, don't create one if (cmd.empty()) return true; } // Remove old copy if any for (vector::iterator it = lines.begin(); it != lines.end(); it++) { // Skip comment if (it->find_first_of("#") == it->find_first_not_of(" \t")) continue; if (it->find(marker) != string::npos && it->find(id) != string::npos) { lines.erase(it); break; } } if (!cmd.empty()) { string nline = sched + " " + marker + " " + id + " " + cmd; lines.push_back(nline); } if (!eCrontabWriteFile(lines, reason)) return false; return true; } bool checkCrontabUnmanaged(const string& marker, const string& data) { vector lines; if (!eCrontabGetLines(lines)) { // No crontab, answer is no return false; } // Scan crontab for (vector::iterator it = lines.begin(); it != lines.end(); it++) { if (it->find(marker) == string::npos && it->find(data) != string::npos) { return true; } } return false; } /** Retrieve the scheduling for a crontab entry */ bool getCrontabSched(const string& marker, const string& id, vector& sched) { LOGDEB0(("getCrontabSched: marker[%s], id[%s]\n", marker.c_str(), id.c_str())); vector lines; if (!eCrontabGetLines(lines)) { // No crontab, answer is no sched.clear(); return false; } string line; for (vector::iterator it = lines.begin(); it != lines.end(); it++) { // Skip comment if (it->find_first_of("#") == it->find_first_not_of(" \t")) continue; if (it->find(marker) != string::npos && it->find(id) != string::npos) { line = *it; break; } } stringToTokens(line, sched); sched.resize(5); return true; } #else // TEST -> #include #include #include #include #include #include #include using namespace std; #include "ecrontab.h" static char *thisprog; static char usage [] = " -a add or replace crontab line \n" " -d delete crontab line \n" " -s get scheduling \n" " -c check for unmanaged lines for string\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_a 0x2 #define OPT_d 0x4 #define OPT_w 0x8 #define OPT_c 0x10 #define OPT_s 0x20 const string& marker("RCLCRON_RCLINDEX="); // Note of course the -w does not make sense for a cron entry const string& cmd0("recollindex -w "); const string& id("RECOLL_CONFDIR=\"/home/dockes/.recoll/\""); const string& sched("30 8 * 1 *"); int main(int argc, char **argv) { thisprog = argv[0]; argc--; argv++; string wt = "10"; string cmd; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'a': op_flags |= OPT_a; break; case 'c': op_flags |= OPT_c; if (argc < 2) Usage(); cmd = *(++argv); argc--; goto b1; case 'd': op_flags |= OPT_d; break; case 's': op_flags |= OPT_s; break; case 'w': op_flags |= OPT_w; if (argc < 2) Usage(); wt = *(++argv); argc--; goto b1; default: Usage(); break; } b1: argc--; argv++; } if (argc != 0) Usage(); string reason; bool status = false; if (op_flags & OPT_a) { cmd = cmd0 + wt; status = editCrontab(marker, id, sched, cmd, reason); } else if (op_flags & OPT_d) { status = editCrontab(marker, id, sched, "", reason); } else if (op_flags & OPT_s) { vector sched; if (!(status = getCrontabSched(marker, id, sched))) { cerr << "getCrontabSched failed: " << reason << endl; exit(1); } cout << "sched vec size " << sched.size() << endl; cout << "mins " << sched[0] << " hours " << sched[1] << " days of month " << sched[2] << " months " << sched[3] << " days of week " << sched[4] << endl; exit(0); } else if (op_flags & OPT_c) { if ((status = checkCrontabUnmanaged(marker, cmd))) { cerr << "crontab has unmanaged lines for " << cmd << endl; exit(1); } exit(0); } else { Usage(); } if (!status) { cerr << "editCrontab failed: " << reason << endl; exit(1); } exit(0); } #endif // TEST recoll-1.17.3/utils/ecrontab.h000644 001750 000000 00000005503 11740755063 016605 0ustar00dockeswheel000000 000000 /* 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 _ECRONTAB_H_INCLUDED_ #define _ECRONTAB_H_INCLUDED_ /** Utility function to manage lines inside a user crontab * * Lines managed by this routine are marked with a hopefuly unique marker * and discriminated by a selector, both environment variable settings. * Example: * 30 8 * * * RCLCRONTAB_RCLINDEX= RECOLL_CONFDIR=/path/to/dir recollindex ... * RCLCRONTAB_RCLINDEX is the line marker, and the RECOLL_CONFDIR value * allows selecting the affected line. * * This approach allows leaving alone lines which do have a * RECOLL_CONFDIR value but not managed by us. The marker and selector * values are chosen by the caller, which should apply some thought to * chosing sane values. */ #include #include using std::string; using std::vector; /** Add, replace or delete a command inside a crontab file * * @param marker selects lines managed by this module and should take the form * of a (possibly empty) environment variable assignement. * @param id selects the appropriate line to affect and will usually be an * actual variable assignment (see above) * @param sched is a standard cron schedule spec (ie: 30 8 * * *) * @param cmd is the command to execute (the last part of the line). * Set it to an empty string to delete the line from the crontab * @param reason error message * * "marker" and "id" should look like reasonable env variable assignements. * Only ascii capital letters, numbers and _ before the '=' */ bool editCrontab(const string& marker, const string& id, const string& sched, const string& cmd, string& reason ); /** * check crontab for unmanaged lines * @param marker same as above, typically RCLCRONTAB_RCLINDEX= * @param data string to look for on lines NOT marked, typically "recollindex" * @return true if unmanaged lines exist, false else. */ bool checkCrontabUnmanaged(const string& marker, const string& data); /** Retrieve the scheduling for a crontab entry */ bool getCrontabSched(const string& marker, const string& id, vector& sched); #endif /* _ECRONTAB_H_INCLUDED_ */ recoll-1.17.3/utils/execmd.cpp000644 001750 000000 00000050255 11740755063 016614 0ustar00dockeswheel000000 000000 /* 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_EXECMD #include "autoconfig.h" #include #include #include #include #include #include #include #include #include #include #if !defined(PUTENV_ARG_CONST) #include #endif #include #include #include #include #include #include "execmd.h" #include "pathut.h" #include "debuglog.h" #include "smallut.h" #include "netcon.h" #include "closefrom.h" #include "ptmutex.h" #ifndef NO_NAMESPACES using namespace std; #endif /* NO_NAMESPACES */ #ifndef MAX #define MAX(A,B) ((A) > (B) ? (A) : (B)) #endif #ifndef MIN #define MIN(A,B) ((A) < (B) ? (A) : (B)) #endif /* From FreeBSD's which command */ static bool exec_is_there(const char *candidate) { struct stat fin; /* XXX work around access(2) false positives for superuser */ if (access(candidate, X_OK) == 0 && stat(candidate, &fin) == 0 && S_ISREG(fin.st_mode) && (getuid() != 0 || (fin.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) != 0)) { return true; } return false; } bool ExecCmd::which(const string& cmd, string& exepath, const char* path) { if (cmd.empty()) return false; if (cmd[0] == '/') { if (exec_is_there(cmd.c_str())) { exepath = cmd; return true; } else { return false; } } const char *pp; if (path) { pp = path; } else { pp = getenv("PATH"); } if (pp == 0) return false; vector pels; stringToTokens(pp, pels, ":"); for (vector::iterator it = pels.begin(); it != pels.end(); it++) { if (it->empty()) *it = "."; string candidate = (it->empty() ? string(".") : *it) + "/" + cmd; if (exec_is_there(candidate.c_str())) { exepath = candidate; return true; } } return false; } void ExecCmd::putenv(const string &ea) { m_env.push_back(ea); } /** A resource manager to ensure that execcmd cleans up if an exception is * raised in the callback, or at different places on errors occurring * during method executions */ class ExecCmdRsrc { public: ExecCmdRsrc(ExecCmd *parent) : m_parent(parent), m_active(true) {} void inactivate() {m_active = false;} ~ExecCmdRsrc() { if (!m_active || !m_parent) return; LOGDEB1(("~ExecCmdRsrc: working. mypid: %d\n", (int)getpid())); // Better to close the descs first in case the child is waiting in read if (m_parent->m_pipein[0] >= 0) close(m_parent->m_pipein[0]); if (m_parent->m_pipein[1] >= 0) close(m_parent->m_pipein[1]); if (m_parent->m_pipeout[0] >= 0) close(m_parent->m_pipeout[0]); if (m_parent->m_pipeout[1] >= 0) close(m_parent->m_pipeout[1]); int status; if (m_parent->m_pid > 0) { pid_t grp = getpgid(m_parent->m_pid); LOGDEB(("ExecCmd: killpg(%d, SIGTERM)\n", grp)); int ret = killpg(grp, SIGTERM); if (ret == 0) { for (int i = 0; i < 3; i++) { (void)waitpid(m_parent->m_pid, &status, WNOHANG); if (kill(m_parent->m_pid, 0) != 0) break; sleep(1); if (i == 2) { LOGDEB(("ExecCmd: killpg(%d, SIGKILL)\n", grp)); killpg(grp, SIGKILL); (void)waitpid(m_parent->m_pid, &status, WNOHANG); } } } else { LOGERR(("ExecCmd: error killing process group %d: %d\n", grp, errno)); } } m_parent->m_tocmd.release(); m_parent->m_fromcmd.release(); pthread_sigmask(SIG_UNBLOCK, &m_parent->m_blkcld, 0); m_parent->reset(); } private: ExecCmd *m_parent; bool m_active; }; ExecCmd::~ExecCmd() { ExecCmdRsrc(this); } int ExecCmd::startExec(const string &cmd, const list& args, bool has_input, bool has_output) { { // Debug and logging string command = cmd + " "; for (list::const_iterator it = args.begin();it != args.end(); it++) { command += "{" + *it + "} "; } LOGDEB(("ExecCmd::startExec: (%d|%d) %s\n", has_input, has_output, command.c_str())); } // The resource manager ensures resources are freed if we return early ExecCmdRsrc e(this); if (has_input && pipe(m_pipein) < 0) { LOGERR(("ExecCmd::startExec: pipe(2) failed. errno %d\n", errno)); return -1; } if (has_output && pipe(m_pipeout) < 0) { LOGERR(("ExecCmd::startExec: pipe(2) failed. errno %d\n", errno)); return -1; } m_pid = fork(); if (m_pid < 0) { LOGERR(("ExecCmd::startExec: fork(2) failed. errno %d\n", errno)); return -1; } if (m_pid == 0) { e.inactivate(); // needed ? dochild(cmd, args, has_input, has_output); // dochild does not return. Just in case... _exit(1); } // Father process // Set the process group for the child. This is also done in the // child process see wikipedia(Process_group) if (setpgid(m_pid, m_pid)) { // This can fail with EACCES if the son has already done execve // (linux at least) LOGDEB(("ExecCmd: father setpgid(son)(%d,%d) errno %d (ok)\n", m_pid, m_pid, errno)); } sigemptyset(&m_blkcld); sigaddset(&m_blkcld, SIGCHLD); pthread_sigmask(SIG_BLOCK, &m_blkcld, 0); if (has_input) { close(m_pipein[0]); m_pipein[0] = -1; NetconCli *iclicon = new NetconCli(); iclicon->setconn(m_pipein[1]); m_tocmd = NetconP(iclicon); } if (has_output) { close(m_pipeout[1]); m_pipeout[1] = -1; NetconCli *oclicon = new NetconCli(); oclicon->setconn(m_pipeout[0]); m_fromcmd = NetconP(oclicon); } /* Don't want to undo what we just did ! */ e.inactivate(); return 0; } // Netcon callback. Send data to the command's input class ExecWriter : public NetconWorker { public: ExecWriter(const string *input, ExecCmdProvide *provide) : m_input(input), m_cnt(0), m_provide(provide) {} virtual int data(NetconData *con, Netcon::Event reason) { if (!m_input) return -1; LOGDEB1(("ExecWriter: input m_cnt %d input length %d\n", m_cnt, m_input->length())); if (m_cnt >= m_input->length()) { // Fd ready for more but we got none. if (m_provide) { m_provide->newData(); if (m_input->empty()) { return 0; } else { m_cnt = 0; } LOGDEB2(("ExecWriter: provide m_cnt %d input length %d\n", m_cnt, m_input->length())); } else { return 0; } } int ret = con->send(m_input->c_str() + m_cnt, m_input->length() - m_cnt); LOGDEB2(("ExecWriter: wrote %d to command\n", ret)); if (ret <= 0) { LOGERR(("ExecWriter: data: can't write\n")); return -1; } m_cnt += ret; return ret; } private: const string *m_input; unsigned int m_cnt; // Current offset inside m_input ExecCmdProvide *m_provide; }; // Netcon callback. Get data from the command output. class ExecReader : public NetconWorker { public: ExecReader(string *output, ExecCmdAdvise *advise) : m_output(output), m_advise(advise) {} virtual int data(NetconData *con, Netcon::Event reason) { char buf[8192]; int n = con->receive(buf, 8192); LOGDEB1(("ExecReader: got %d from command\n", n)); if (n < 0) { LOGERR(("ExecCmd::doexec: receive failed. errno %d\n", errno)); } else if (n > 0) { m_output->append(buf, n); if (m_advise) m_advise->newData(n); } // else n == 0, just return return n; } private: string *m_output; ExecCmdAdvise *m_advise; }; int ExecCmd::doexec(const string &cmd, const list& args, const string *input, string *output) { if (startExec(cmd, args, input != 0, output != 0) < 0) { return -1; } // Cleanup in case we return early ExecCmdRsrc e(this); SelectLoop myloop; int ret = 0; if (input || output) { // Setup output if (output) { NetconCli *oclicon = dynamic_cast(m_fromcmd.getptr()); if (!oclicon) { LOGERR(("ExecCmd::doexec: no connection from command\n")); return -1; } oclicon->setcallback(RefCntr (new ExecReader(output, m_advise))); myloop.addselcon(m_fromcmd, Netcon::NETCONPOLL_READ); // Give up ownership m_fromcmd.release(); } // Setup input if (input) { NetconCli *iclicon = dynamic_cast(m_tocmd.getptr()); if (!iclicon) { LOGERR(("ExecCmd::doexec: no connection from command\n")); return -1; } iclicon->setcallback(RefCntr (new ExecWriter(input, m_provide))); myloop.addselcon(m_tocmd, Netcon::NETCONPOLL_WRITE); // Give up ownership m_tocmd.release(); } // Do the actual reading/writing/waiting myloop.setperiodichandler(0, 0, m_timeoutMs); while ((ret = myloop.doLoop()) > 0) { LOGDEB(("ExecCmd::doexec: selectloop returned %d\n", ret)); if (m_advise) m_advise->newData(0); if (m_killRequest) { LOGINFO(("ExecCmd::doexec: cancel request\n")); break; } } LOGDEB0(("ExecCmd::doexec: selectloop returned %d\n", ret)); // Check for interrupt request: we won't want to waitpid() if (m_advise) m_advise->newData(0); // The netcons don't take ownership of the fds: we have to close them // (have to do it before wait, this may be the signal the child is // waiting for exiting). if (input) { close(m_pipein[1]); m_pipein[1] = -1; } if (output) { close(m_pipeout[0]); m_pipeout[0] = -1; } } // Normal return: deactivate cleaner, wait() will do the cleanup e.inactivate(); int ret1 = ExecCmd::wait(); if (ret) return -1; return ret1; } int ExecCmd::send(const string& data) { NetconCli *con = dynamic_cast(m_tocmd.getptr()); if (con == 0) { LOGERR(("ExecCmd::send: outpipe is closed\n")); return -1; } unsigned int nwritten = 0; while (nwritten < data.length()) { if (m_killRequest) break; int n = con->send(data.c_str() + nwritten, data.length() - nwritten); if (n < 0) { LOGERR(("ExecCmd::doexec: send failed\n")); return -1; } nwritten += n; } return nwritten; } int ExecCmd::receive(string& data, int cnt) { NetconCli *con = dynamic_cast(m_fromcmd.getptr()); if (con == 0) { LOGERR(("ExecCmd::receive: inpipe is closed\n")); return -1; } const int BS = 4096; char buf[BS]; int ntot = 0; do { int toread = cnt > 0 ? MIN(cnt - ntot, BS) : BS; int n = con->receive(buf, toread); if (n < 0) { LOGERR(("ExecCmd::receive: error\n")); return -1; } else if (n > 0) { ntot += n; data.append(buf, n); } else { LOGDEB(("ExecCmd::receive: got 0\n")); break; } } while (cnt > 0 && ntot < cnt); return ntot; } int ExecCmd::getline(string& data) { NetconCli *con = dynamic_cast(m_fromcmd.getptr()); if (con == 0) { LOGERR(("ExecCmd::receive: inpipe is closed\n")); return -1; } const int BS = 1024; char buf[BS]; int n = con->getline(buf, BS); if (n < 0) { LOGERR(("ExecCmd::getline: error\n")); } else if (n > 0) { data.append(buf, n); } else { LOGDEB(("ExecCmd::getline: got 0\n")); } return n; } // Wait for command status and clean up all resources. int ExecCmd::wait() { ExecCmdRsrc e(this); int status = -1; if (!m_killRequest && m_pid > 0) { if (waitpid(m_pid, &status, 0) < 0) { LOGERR(("ExecCmd::waitpid: returned -1 errno %d\n", errno)); status = -1; } LOGDEB(("ExecCmd::wait: got status 0x%x\n", status)); m_pid = -1; } // Let the ExecCmdRsrc cleanup return status; } bool ExecCmd::maybereap(int *status) { ExecCmdRsrc e(this); *status = -1; if (m_pid <= 0) { // Already waited for ?? return true; } pid_t pid = waitpid(m_pid, status, WNOHANG); if (pid < 0) { LOGERR(("ExecCmd::maybereap: returned -1 errno %d\n", errno)); m_pid = -1; return true; } else if (pid == 0) { LOGDEB1(("ExecCmd::maybereap: not exited yet\n")); e.inactivate(); return false; } else { LOGDEB(("ExecCmd::maybereap: got status 0x%x\n", status)); m_pid = -1; return true; } } // In child process. Set up pipes, environment, and exec command. // This must not return. exit() on error. void ExecCmd::dochild(const string &cmd, const list& args, bool has_input, bool has_output) { // Start our own process group if (setpgid(0, getpid())) { LOGINFO(("ExecCmd::dochild: setpgid(0, %d) failed: errno %d\n", getpid(), errno)); } // Restore SIGTERM to default. Really, signal handling should be // specified when creating the execmd. Help Recoll get rid of its // filter children though. To be fixed one day... Not sure that // all of this is needed. But an ignored sigterm and the masks are // normally inherited. if (signal(SIGTERM, SIG_DFL) == SIG_ERR) { LOGERR(("ExecCmd::dochild: signal() failed, errno %d\n", errno)); } sigset_t sset; sigfillset(&sset); pthread_sigmask(SIG_UNBLOCK, &sset, 0); sigprocmask(SIG_UNBLOCK, &sset, 0); if (has_input) { close(m_pipein[1]); m_pipein[1] = -1; if (m_pipein[0] != 0) { dup2(m_pipein[0], 0); close(m_pipein[0]); m_pipein[0] = -1; } } if (has_output) { close(m_pipeout[0]); m_pipeout[0] = -1; if (m_pipeout[1] != 1) { if (dup2(m_pipeout[1], 1) < 0) { LOGERR(("ExecCmd::doexec: dup2(2) failed. errno %d\n", errno)); } if (close(m_pipeout[1]) < 0) { LOGERR(("ExecCmd::doexec: close(2) failed. errno %d\n", errno)); } m_pipeout[1] = -1; } } // Do we need to redirect stderr ? if (!m_stderrFile.empty()) { int fd = open(m_stderrFile.c_str(), O_WRONLY|O_CREAT #ifdef O_APPEND |O_APPEND #endif , 0600); if (fd < 0) { close(2); } else { if (fd != 2) { dup2(fd, 2); } lseek(2, 0, 2); } } // Close all descriptors except 0,1,2 libclf_closefrom(3); // Allocate arg vector (2 more for arg0 + final 0) typedef const char *Ccharp; Ccharp *argv; argv = (Ccharp *)malloc((args.size()+2) * sizeof(char *)); if (argv == 0) { LOGERR(("ExecCmd::doexec: malloc() failed. errno %d\n", errno)); exit(1); } // Fill up argv argv[0] = cmd.c_str(); int i = 1; list::const_iterator it; for (it = args.begin(); it != args.end(); it++) { argv[i++] = it->c_str(); } argv[i] = 0; #if 0 {int i = 0;cerr << "cmd: " << cmd << endl << "ARGS: " << endl; while (argv[i]) cerr << argv[i++] << endl;} #endif for (vector::const_iterator it = m_env.begin(); it != m_env.end(); it++) { #ifdef PUTENV_ARG_CONST ::putenv(it->c_str()); #else ::putenv(strdup(it->c_str())); #endif } execvp(cmd.c_str(), (char *const*)argv); // Hu ho LOGERR(("ExecCmd::doexec: execvp(%s) failed. errno %d\n", cmd.c_str(), errno)); _exit(127); } ReExec::ReExec(int argc, char *args[]) { init(argc, args); } void ReExec::init(int argc, char *args[]) { for (int i = 0; i < argc; i++) { m_argv.push_back(args[i]); } m_cfd = open(".", 0); char *cd = getcwd(0, 0); if (cd) m_curdir = cd; free(cd); } // Reexecute myself, as close as possible to the initial exec void ReExec::reexec() { #if 0 char *cwd; cwd = getcwd(0,0); FILE *fp = stdout; //fopen("/tmp/exectrace", "w"); if (fp) { fprintf(fp, "reexec: pwd: [%s] args: ", cwd?cwd:"getcwd failed"); for (vector::const_iterator it = m_argv.begin(); it != m_argv.end(); it++) { fprintf(fp, "[%s] ", it->c_str()); } fprintf(fp, "\n"); } #endif // Execute the atexit funcs while (!m_atexitfuncs.empty()) { (m_atexitfuncs.top())(); m_atexitfuncs.pop(); } // Try to get back to the initial working directory if (m_cfd < 0 || fchdir(m_cfd) < 0) { LOGINFO(("ReExec::reexec: fchdir failed, trying chdir\n")); if (!m_curdir.empty() && chdir(m_curdir.c_str())) { LOGERR(("ReExec::reexec: chdir failed\n")); } } // Close all descriptors except 0,1,2 libclf_closefrom(3); // Allocate arg vector (1 more for final 0) typedef const char *Ccharp; Ccharp *argv; argv = (Ccharp *)malloc((m_argv.size()+1) * sizeof(char *)); if (argv == 0) { LOGERR(("ExecCmd::doexec: malloc() failed. errno %d\n", errno)); return; } // Fill up argv int i = 0; vector::const_iterator it; for (it = m_argv.begin(); it != m_argv.end(); it++) { argv[i++] = it->c_str(); } argv[i] = 0; execvp(m_argv[0].c_str(), (char *const*)argv); } //////////////////////////////////////////////////////////////////// #else // TEST #include #include #include #include #include #include "debuglog.h" #include "cancelcheck.h" using namespace std; #include "execmd.h" static int op_flags; #define OPT_MOINS 0x1 #define OPT_b 0x4 #define OPT_w 0x8 #define OPT_c 0x10 #define OPT_r 0x20 const char *data = "Une ligne de donnees\n"; class MEAdv : public ExecCmdAdvise { public: ExecCmd *cmd; void newData(int cnt) { if (op_flags & OPT_c) { static int callcnt; if (callcnt++ == 3) { throw CancelExcept(); } } cerr << "newData(" << cnt << ")" << endl; // CancelCheck::instance().setCancel(); // CancelCheck::instance().checkCancel(); // cmd->setCancel(); } }; class MEPv : public ExecCmdProvide { public: FILE *m_fp; string *m_input; MEPv(string *i) : m_input(i) { m_fp = fopen("/etc/group", "r"); } ~MEPv() { if (m_fp) fclose(m_fp); } void newData() { char line[1024]; if (m_fp && fgets(line, 1024, m_fp)) { m_input->assign((const char *)line); } else { m_input->erase(); } } }; static char *thisprog; static char usage [] = "trexecmd [-c|-r] cmd [arg1 arg2 ...]\n" " -c : test cancellation (ie: trexecmd -c sleep 1000)\n" " -r : test reexec\n" "trexecmd -w cmd : do the which thing\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } ReExec reexec; int main(int argc, char *argv[]) { reexec.init(argc, argv); 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 'r': op_flags |= OPT_r; break; case 'w': op_flags |= OPT_w; break; default: Usage(); break; } b1: argc--; argv++; } if (argc < 1) Usage(); string cmd = *argv++; argc--; list l; while (argc > 0) { l.push_back(*argv++); argc--; } DebugLog::getdbl()->setloglevel(DEBDEB1); DebugLog::setfilename("stderr"); signal(SIGPIPE, SIG_IGN); if (op_flags & OPT_r) { chdir("/"); argv[0] = strdup(""); sleep(1); reexec.reexec(); } if (op_flags & OPT_w) { string path; if (ExecCmd::which(cmd, path)) { cout << path << endl; exit(0); } exit(1); } ExecCmd mexec; MEAdv adv; adv.cmd = &mexec; mexec.setAdvise(&adv); mexec.setTimeout(5); mexec.setStderr("/tmp/trexecStderr"); mexec.putenv("TESTVARIABLE1=TESTVALUE1"); mexec.putenv("TESTVARIABLE2=TESTVALUE2"); mexec.putenv("TESTVARIABLE3=TESTVALUE3"); string input, output; // input = data; string *ip = 0; ip = &input; MEPv pv(&input); mexec.setProvide(&pv); int status = -1; try { status = mexec.doexec(cmd, l, ip, &output); } catch (CancelExcept) { cerr << "CANCELLED" << endl; } fprintf(stderr, "Status: 0x%x\n", status); cout << output; exit (status >> 8); } #endif // TEST recoll-1.17.3/utils/execmd.h000644 001750 000000 00000021342 11740755063 016254 0ustar00dockeswheel000000 000000 /* 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 _EXECMD_H_INCLUDED_ #define _EXECMD_H_INCLUDED_ #include #include #include #include #include #ifndef NO_NAMESPACES using std::list; using std::string; using std::vector; using std::stack; #endif #include "netcon.h" /** * Callback function object to advise of new data arrival, or just periodic * heartbeat if cnt is 0. * * To interrupt the command, the code using ExecCmd should either * raise an exception inside newData() (and catch it in doexec's caller), or * call ExecCmd::setKill() * */ class ExecCmdAdvise { public: virtual ~ExecCmdAdvise() {} virtual void newData(int cnt) = 0; }; /** * Callback function object to get more input data. Data has to be provided * in the initial input string, set it to empty to signify eof. */ class ExecCmdProvide { public: virtual ~ExecCmdProvide() {} virtual void newData() = 0; }; /** * Execute command possibly taking both input and output (will do * asynchronous io as appropriate for things to work). * * Input to the command can be provided either once in a parameter to doexec * or provided in chunks by setting a callback which will be called to * request new data. In this case, the 'input' parameter to doexec may be * empty (but not null) * * Output from the command is normally returned in a single string, but a * callback can be set to be called whenever new data arrives, in which case * it is permissible to consume the data and erase the string. * * Note that SIGPIPE should be ignored and SIGCLD blocked when calling doexec, * else things might fail randomly. (This is not done inside the class because * of concerns with multithreaded programs). * */ class ExecCmd { public: /** * Add/replace environment variable before executing command. This must * be called before doexec() to have an effect (possibly multiple * times for several variables). * @param envassign an environment assignment string ("name=value") */ void putenv(const string &envassign); /** * Set function objects to call whenever new data is available or on * select timeout / whenever new data is needed to send. Must be called * before doexec() */ void setAdvise(ExecCmdAdvise *adv) {m_advise = adv;} void setProvide(ExecCmdProvide *p) {m_provide = p;} /** * Set select timeout in milliseconds. The default is 1 S. * This is NOT a time after which an error will occur, but the period of * the calls to the cancellation check routine. */ void setTimeout(int mS) {if (mS > 30) m_timeoutMs = mS;} /** * Set destination for stderr data. The default is to let it alone (will * usually go to the terminal or to wherever the desktop messages go). * There is currently no option to put stderr data into a program variable * If the parameter can't be opened for writing, the command's * stderr will be closed. */ void setStderr(const string &stderrFile) {m_stderrFile = stderrFile;} /** * Execute command. * * Both input and output can be specified, and asynchronous * io (select-based) is used to prevent blocking. This will not * work if input and output need to be synchronized (ie: Q/A), but * works ok for filtering. * The function is exception-safe. In case an exception occurs in the * advise callback, fds and pids will be cleaned-up properly. * * @param cmd the program to execute. This must be an absolute file name * or exist in the PATH. * @param args the argument list (NOT including argv[0]). * @param input Input to send TO the command. * @param output Output FROM the command. * @return the exec ouput status (0 if ok), or -1 */ int doexec(const string &cmd, const list& args, const string *input = 0, string *output = 0); /* * The next four methods can be used when a Q/A dialog needs to be * performed with the command */ int startExec(const string &cmd, const list& args, bool has_input, bool has_output); int send(const string& data); int receive(string& data, int cnt = -1); int getline(string& data); int wait(); /** Wait with WNOHANG set. @return true if process exited, false else. @param O: status, the wait(2) call's status value */ bool maybereap(int *status); pid_t getChildPid() {return m_pid;} /** * Cancel/kill command. This can be called from another thread or * from the advise callback, which could also raise an exception to * accomplish the same thing */ void setKill() {m_killRequest = true;} /** * Get rid of current process (become ready for start). */ void zapChild() {setKill(); (void)wait();} ExecCmd() : m_advise(0), m_provide(0), m_timeoutMs(1000) { reset(); } ~ExecCmd(); /** * Utility routine: check if/where a command is found according to the * current PATH (or the specified one * @param cmd command name * @param exe on return, executable path name if found * @param path exec seach path to use instead of getenv(PATH) * @return true if found */ static bool which(const string& cmd, string& exe, const char* path = 0); friend class ExecCmdRsrc; private: vector m_env; ExecCmdAdvise *m_advise; ExecCmdProvide *m_provide; bool m_killRequest; int m_timeoutMs; string m_stderrFile; // Pipe for data going to the command int m_pipein[2]; NetconP m_tocmd; // Pipe for data coming out int m_pipeout[2]; NetconP m_fromcmd; // Subprocess id pid_t m_pid; // Saved sigmask sigset_t m_blkcld; // Reset internal state indicators. Any resources should have been // previously freed void reset() { m_killRequest = false; m_pipein[0] = m_pipein[1] = m_pipeout[0] = m_pipeout[1] = -1; m_pid = -1; sigemptyset(&m_blkcld); } // Child process code void dochild(const string &cmd, const list& args, bool has_input, bool has_output); /* Copyconst and assignment private and forbidden */ ExecCmd(const ExecCmd &) {} ExecCmd& operator=(const ExecCmd &) {return *this;}; }; /** * Rexecute self process with the same arguments. * * Note that there are some limitations: * - argv[0] has to be valid: an executable name which will be found in * the path when exec is called in the initial working directory. This is * by no means guaranteed. The shells do this, but argv[0] could be an * arbitrary string. * - The initial working directory must be found and remain valid. * - We don't try to do anything with fd 0,1,2. If they were changed by the * program, their initial meaning won't be the same as at the moment of the * initial invocation. * - We don't restore the signals. Signals set to be blocked * or ignored by the program will remain ignored even if this was not their * initial state. * - The environment is also not restored. * - Others system aspects ? * - Other program state: application-dependant. Any external cleanup * (temp files etc.) must be performed by the application. ReExec() * duplicates the atexit() function to make this easier, but the * ReExec().atexit() calls must be done explicitely, this is not automatic * * In short, this is usable in reasonably controlled situations and if there * are no security issues involved, but this does not perform miracles. */ class ReExec { public: ReExec() {} ReExec(int argc, char *argv[]); void init(int argc, char *argv[]); int atexit(void (*function)(void)) { m_atexitfuncs.push(function); return 0; } void reexec(); const string& getreason() {return m_reason;} private: vector m_argv; string m_curdir; int m_cfd; string m_reason; stack m_atexitfuncs; }; #endif /* _EXECMD_H_INCLUDED_ */ recoll-1.17.3/utils/fileudi.cpp000644 001750 000000 00000007637 11740755063 016776 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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_FILEUDI #include #include #include "fileudi.h" #include "md5.h" #include "base64.h" using std::string; // Debug only #ifdef PATHHASH_HEX static void md5hexprint(const unsigned char hash[16], string &out) { out.erase(); out.reserve(33); static const char hex[]="0123456789abcdef"; for (int i = 0; i < 16; i++) { out.append(1, hex[hash[i] >> 4]); out.append(1, hex[hash[i] & 0x0f]); } } #endif // Size of the hashed result (base64 of 16 bytes of md5, minus 2 pad chars) #define HASHLEN 22 // Convert longish paths by truncating and appending hash of path // The full length of the base64-encoded (minus pad) of the md5 is 22 chars // We append this to the truncated path void pathHash(const std::string &path, std::string &phash, unsigned int maxlen) { if (maxlen < HASHLEN) { fprintf(stderr, "pathHash: internal error: requested len too small\n"); abort(); } if (path.length() <= maxlen) { phash = path; return; } // Compute the md5 unsigned char chash[16]; MD5_CTX ctx; MD5Init(&ctx); MD5Update(&ctx, (const unsigned char *)(path.c_str()+maxlen-HASHLEN), path.length() - (maxlen - HASHLEN)); MD5Final(chash, &ctx); #ifdef PATHHASH_HEX string hex; md5hexprint(chash, hex); printf("hex [%s]\n", hex.c_str()); #endif // Encode it to ascii. This shouldn't be strictly necessary as // xapian terms can be binary string hash; base64_encode(string((char *)chash, 16), hash); // We happen to know there will be 2 pad chars in there, that we // don't need as this won't ever be decoded. Resulting length is 22 hash.resize(hash.length() - 2); // Truncate path and append hash phash = path.substr(0, maxlen - HASHLEN) + hash; } // Maximum length for path/unique terms stored for each document. We truncate // longer paths and uniquize them by appending a hashed value. This // is done to avoid xapian max term length limitations, not // to gain space (we gain very little even with very short maxlens // like 30). The xapian max key length seems to be around 250. // The value for PATHHASHLEN includes the length of the hash part. #define PATHHASHLEN 150 // Compute the unique term used to link documents to their file-system source: // Hashed path + possible internal path void make_udi(const string& fn, const string& ipath, string &udi) { string s(fn); // Note that we append a "|" in all cases. Historical, could be removed s.append("|"); s.append(ipath); pathHash(s, udi, PATHHASHLEN); return; } #else // TEST_FILEUDI #include #include #include "fileudi.h" using namespace std; int main(int argc, char **argv) { string path="/usr/lib/toto.cpp"; string ipath = "1:2:3:4:5:10"; string udi; make_udi(path, ipath, udi); printf("udi [%s]\n", udi.c_str()); path = "/some/much/too/looooooooooooooong/path/bla/bla/bla" "/looooooooooooooong/path/bla/bla/bla/llllllllllllllllll" "/looooooooooooooong/path/bla/bla/bla/llllllllllllllllll"; ipath = "1:2:3:4:5:10" "1:2:3:4:5:10" "1:2:3:4:5:10"; make_udi(path, ipath, udi); printf("udi [%s]\n", udi.c_str()); } #endif // TEST_FILEUDI recoll-1.17.3/utils/fileudi.h000644 001750 000000 00000002523 11740755063 016430 0ustar00dockeswheel000000 000000 /* 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 _FILEUDI_H_INCLUDED_ #define _FILEUDI_H_INCLUDED_ #include using std::string; // Unique Document Ids for the file-based indexer (main Recoll // indexer). Document Ids are built from a concatenation of the file // path and the internal path (ie: email number inside // folder/attachment number/etc.) As the size of Xapian terms is // limited, the Id path is truncated to a maximum length, and completed // by a hash of the remainder (including the ipath) extern void make_udi(const string& fn, const string& ipath, string &udi); #endif /* _FILEUDI_H_INCLUDED_ */ recoll-1.17.3/utils/fstreewalk.cpp000644 001750 000000 00000040501 11740755063 017507 0ustar00dockeswheel000000 000000 /* 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. */ #ifdef HAVE_CONFIG_H #include "autoconfig.h" #endif #ifndef TEST_FSTREEWALK #include #include #include #include #include #include #include #include #include #include "cstr.h" #include "debuglog.h" #include "pathut.h" #include "fstreewalk.h" #ifndef NO_NAMESPACES using namespace std; #endif /* NO_NAMESPACES */ bool FsTreeWalker::o_useFnmPathname = true; const int FsTreeWalker::FtwTravMask = FtwTravNatural| FtwTravBreadth|FtwTravFilesThenDirs|FtwTravBreadthThenDepth; class DirId { public: dev_t dev; ino_t ino; DirId(dev_t d, ino_t i) : dev(d), ino(i) {} bool operator<(const DirId& r) const { return dev < r.dev || (dev == r.dev && ino < r.ino); } }; class FsTreeWalker::Internal { int options; int depthswitch; stringstream reason; list skippedNames; list skippedPaths; // When doing Breadth or FilesThenDirs traversal, we keep a list // of directory paths to be processed, and we do not recurse. list dirs; int errors; set donedirs; void logsyserr(const char *call, const string ¶m) { errors++; reason << call << "(" << param << ") : " << errno << " : " << strerror(errno) << endl; } friend class FsTreeWalker; }; FsTreeWalker::FsTreeWalker(int opts) { data = new Internal; if (data) { data->options = opts; data->depthswitch = 4; data->errors = 0; } } FsTreeWalker::~FsTreeWalker() { delete data; } void FsTreeWalker::setOpts(Options opts, int depthswitch) { if (data) { data->options = opts; data->depthswitch = depthswitch; } } string FsTreeWalker::getReason() { string reason = data->reason.str(); data->reason.str(string()); data->errors = 0; return reason; } int FsTreeWalker::getErrCnt() { return data->errors; } bool FsTreeWalker::addSkippedName(const string& pattern) { if (find(data->skippedNames.begin(), data->skippedNames.end(), pattern) == data->skippedNames.end()) data->skippedNames.push_back(pattern); return true; } bool FsTreeWalker::setSkippedNames(const list &patterns) { data->skippedNames = patterns; return true; } bool FsTreeWalker::inSkippedNames(const string& name) { list::const_iterator it; for (it = data->skippedNames.begin(); it != data->skippedNames.end(); it++) { if (fnmatch(it->c_str(), name.c_str(), 0) == 0) { return true; } } return false; } bool FsTreeWalker::addSkippedPath(const string& ipath) { string path = (data->options & FtwNoCanon) ? ipath : path_canon(ipath); if (find(data->skippedPaths.begin(), data->skippedPaths.end(), path) == data->skippedPaths.end()) data->skippedPaths.push_back(path); return true; } bool FsTreeWalker::setSkippedPaths(const list &paths) { data->skippedPaths = paths; for (list::iterator it = data->skippedPaths.begin(); it != data->skippedPaths.end(); it++) if (!(data->options & FtwNoCanon)) *it = path_canon(*it); return true; } bool FsTreeWalker::inSkippedPaths(const string& path, bool ckparents) { int fnmflags = o_useFnmPathname ? FNM_PATHNAME : 0; #ifdef FNM_LEADING_DIR if (ckparents) fnmflags |= FNM_LEADING_DIR; #endif list::const_iterator it; for (it = data->skippedPaths.begin(); it != data->skippedPaths.end(); it++) { #ifndef FNM_LEADING_DIR if (ckparents) { string mpath = path; while (mpath.length() > 2) { if (fnmatch(it->c_str(), mpath.c_str(), fnmflags) == 0) return true; mpath = path_getfather(mpath); } } else #endif /* FNM_LEADING_DIR */ if (fnmatch(it->c_str(), path.c_str(), fnmflags) == 0) { return true; } } return false; } static inline int slashcount(const string& p) { int n = 0; for (unsigned int i = 0; i < p.size(); i++) if (p[i] == '/') n++; return n; } FsTreeWalker::Status FsTreeWalker::walk(const string& _top, FsTreeWalkerCB& cb) { string top = (data->options & FtwNoCanon) ? _top : path_canon(_top); if ((data->options & FtwTravMask) == 0) { data->options |= FtwTravNatural; } int basedepth = slashcount(top); // Only used for breadthThenDepth struct stat st; // We always follow symlinks at this point. Makes more sense. if (stat(top.c_str(), &st) == -1) { // Note that we do not return an error if the stat call // fails. A temp file may have gone away. data->logsyserr("stat", top); return errno == ENOENT ? FtwOk : FtwError; } // Recursive version, using the call stack to store state. iwalk // will process files and recursively descend into subdirs in // physical order of the current directory. if ((data->options & FtwTravMask) == FtwTravNatural) { return iwalk(top, &st, cb); } // Breadth first of filesThenDirs semi-depth first order // Managing lists of directories to be visited later, in breadth or // depth order. Null marker are inserted in the list to indicate // father directory changes (avoids computing parents all the time). data->dirs.push_back(top); Status status; while (!data->dirs.empty()) { string dir, nfather; if (data->options & (FtwTravBreadth|FtwTravBreadthThenDepth)) { // Breadth first, pop and process an older dir at the // front of the list. This will add any child dirs at the // back dir = data->dirs.front(); data->dirs.pop_front(); if (dir.empty()) { // Father change marker. if (data->dirs.empty()) break; dir = data->dirs.front(); data->dirs.pop_front(); nfather = path_getfather(dir); if (data->options & FtwTravBreadthThenDepth) { // Check if new depth warrants switch to depth first // traversal (will happen on next loop iteration). int curdepth = slashcount(dir) - basedepth; if (curdepth >= data->depthswitch) { //fprintf(stderr, "SWITCHING TO DEPTH FIRST\n"); data->options &= ~FtwTravMask; data->options |= FtwTravFilesThenDirs; } } } } else { // Depth first, pop and process latest dir dir = data->dirs.back(); data->dirs.pop_back(); if (dir.empty()) { // Father change marker. if (data->dirs.empty()) break; dir = data->dirs.back(); data->dirs.pop_back(); nfather = path_getfather(dir); } } // If changing parent directory, advise our user. if (!nfather.empty()) { if (stat(nfather.c_str(), &st) == -1) { data->logsyserr("stat", nfather); return errno == ENOENT ? FtwOk : FtwError; } if ((status = cb.processone(nfather, &st, FtwDirReturn)) & (FtwStop|FtwError)) { return status; } } if (stat(dir.c_str(), &st) == -1) { data->logsyserr("stat", dir); return errno == ENOENT ? FtwOk : FtwError; } // iwalk will not recurse in this case, just process file entries // and append subdir entries to the list. status = iwalk(dir, &st, cb); if (status != FtwOk) return status; } return FtwOk; } // Note that the 'norecurse' flag is handled as part of the directory read. // This means that we always go into the top 'walk()' parameter if it is a // directory, even if norecurse is set. Bug or Feature ? FsTreeWalker::Status FsTreeWalker::iwalk(const string &top, struct stat *stp, FsTreeWalkerCB& cb) { Status status = FtwOk; bool nullpush = false; // Tell user to process the top entry itself if (S_ISDIR(stp->st_mode)) { if ((status = cb.processone(top, stp, FtwDirEnter)) & (FtwStop|FtwError)) { return status; } } else if (S_ISREG(stp->st_mode)) { return cb.processone(top, stp, FtwRegular); } else { return status; } // This is a directory, read it and process entries: // Detect if directory already seen. This could just be several // symlinks pointing to the same place (if FtwFollow is set), it // could also be some other kind of cycle. In any case, there is // no point in entering again. // For now, we'll ignore the "other kind of cycle" part and only monitor // this is FtwFollow is set if (data->options & FtwFollow) { DirId dirid(stp->st_dev, stp->st_ino); if (data->donedirs.find(dirid) != data->donedirs.end()) { LOGINFO(("Not processing [%s] (already seen as other path)\n", top.c_str())); return status; } data->donedirs.insert(dirid); } DIR *d = opendir(top.c_str()); if (d == 0) { data->logsyserr("opendir", top); switch (errno) { case EPERM: case EACCES: case ENOENT: goto out; default: status = FtwError; goto out; } } struct dirent *ent; while ((ent = readdir(d)) != 0) { string fn; struct stat st; // Skip . and .. if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) continue; // Skipped file names match ? if (!data->skippedNames.empty()) { if (inSkippedNames(ent->d_name)) continue; } fn = path_cat(top, ent->d_name); int statret = (data->options & FtwFollow) ? stat(fn.c_str(), &st) : lstat(fn.c_str(), &st); if (statret == -1) { data->logsyserr("stat", fn); continue; } if (!data->skippedPaths.empty()) { // We do not check the ancestors. This means that you can have // a topdirs member under a skippedPath, to index a portion of // an ignored area. This is the way it had always worked, but // this was broken by 1.13.00 and the systematic use of // FNM_LEADING_DIR if (inSkippedPaths(fn, false)) continue; } if (S_ISDIR(st.st_mode)) { if (data->options & FtwNoRecurse) { status = cb.processone(fn, &st, FtwDirEnter); } else { if (data->options & FtwTravNatural) { status = iwalk(fn, &st, cb); } else { // If first subdir, push marker to separate // from entries for other dir. This is to help // with generating DirReturn callbacks if (!nullpush) { if (!data->dirs.empty() && !data->dirs.back().empty()) data->dirs.push_back(cstr_null); nullpush = true; } data->dirs.push_back(fn); continue; } } // Note: only recursive case gets here. if (status & (FtwStop|FtwError)) goto out; if (!(data->options & FtwNoRecurse)) if ((status = cb.processone(top, &st, FtwDirReturn)) & (FtwStop|FtwError)) goto out; } else if (S_ISREG(st.st_mode)) { if ((status = cb.processone(fn, &st, FtwRegular)) & (FtwStop|FtwError)) { goto out; } } // We ignore other file types (devices etc...) } // readdir loop out: if (d) closedir(d); return status; } #else // TEST_FSTREEWALK #include #include #include #include #include "rclinit.h" #include "rclconfig.h" #include "fstreewalk.h" using namespace std; static int op_flags; #define OPT_MOINS 0x1 #define OPT_p 0x2 #define OPT_P 0x4 #define OPT_r 0x8 #define OPT_c 0x10 #define OPT_b 0x20 #define OPT_d 0x40 #define OPT_m 0x80 #define OPT_L 0x100 class myCB : public FsTreeWalkerCB { public: FsTreeWalker::Status processone(const string &path, const struct stat *st, FsTreeWalker::CbFlag flg) { if (flg == FsTreeWalker::FtwDirEnter) { if (op_flags & OPT_r) cout << path << endl; else cout << "[Entering " << path << "]" << endl; } else if (flg == FsTreeWalker::FtwDirReturn) { cout << "[Returning to " << path << "]" << endl; } else if (flg == FsTreeWalker::FtwRegular) { cout << path << endl; } return FsTreeWalker::FtwOk; } }; static const char *thisprog; // Note that breadth first sorting is relatively expensive: less inode // locality, more disk usage (and also more user memory usage, does // not appear here). Some typical results on a real tree with 2.6 // million entries (220MB of name data) // Recoll 1.13 // time trfstreewalk / > /data/tmp/old // real 13m32.839s user 0m4.443s sys 0m31.128s // // Recoll 1.14 // time trfstreewalk / > /data/tmp/nat; // real 13m28.685s user 0m4.430s sys 0m31.083s // time trfstreewalk -d / > /data/tmp/depth; // real 13m30.051s user 0m4.140s sys 0m33.862s // time trfstreewalk -m / > /data/tmp/mixed; // real 14m53.245s user 0m4.244s sys 0m34.494s // time trfstreewalk -b / > /data/tmp/breadth; // real 17m10.585s user 0m4.532s sys 0m35.033s static char usage [] = "trfstreewalk [-p pattern] [-P ignpath] [-r] [-c] [-L] topdir\n" " -r : norecurse\n" " -c : no path canonification\n" " -L : follow symbolic links\n" " -b : use breadth first walk\n" " -d : use almost depth first (dir files, then subdirs)\n" " -m : use breadth up to 4 deep then switch to -d\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } int main(int argc, const char **argv) { list patterns; list paths; 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; break; case 'd': op_flags |= OPT_d; break; case 'L': op_flags |= OPT_L; break; case 'm': op_flags |= OPT_m; break; case 'r': op_flags |= OPT_r; break; case 'p': op_flags |= OPT_p; if (argc < 2) Usage(); patterns.push_back(*(++argv)); argc--; goto b1; case 'P': op_flags |= OPT_P; if (argc < 2) Usage(); paths.push_back(*(++argv)); argc--; goto b1; default: Usage(); break; } b1: argc--; argv++; } if (argc != 1) Usage(); string topdir = *argv++;argc--; int opt = 0; if (op_flags & OPT_r) opt |= FsTreeWalker::FtwNoRecurse; if (op_flags & OPT_c) opt |= FsTreeWalker::FtwNoCanon; if (op_flags & OPT_L) opt |= FsTreeWalker::FtwFollow; if (op_flags & OPT_b) opt |= FsTreeWalker::FtwTravBreadth; else if (op_flags & OPT_d) opt |= FsTreeWalker::FtwTravFilesThenDirs; else if (op_flags & OPT_m) opt |= FsTreeWalker::FtwTravBreadthThenDepth; string reason; if (!recollinit(0, 0, reason)) { fprintf(stderr, "Init failed: %s\n", reason.c_str()); exit(1); } FsTreeWalker walker(opt); walker.setSkippedNames(patterns); walker.setSkippedPaths(paths); myCB cb; walker.walk(topdir, cb); if (walker.getErrCnt() > 0) cout << walker.getReason(); } #endif // TEST_FSTREEWALK recoll-1.17.3/utils/fstreewalk.h000644 001750 000000 00000011027 11740755063 017155 0ustar00dockeswheel000000 000000 /* 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 _FSTREEWALK_H_INCLUDED_ #define _FSTREEWALK_H_INCLUDED_ #include #include #ifndef NO_NAMESPACES using std::string; using std::list; #endif class FsTreeWalkerCB; struct stat; /** * Class implementing a unix directory recursive walk. * * A user-defined function object is called for every file or * directory. Patterns to be ignored can be set before starting the * walk. Options control whether we follow symlinks and whether we recurse * on subdirectories. */ class FsTreeWalker { public: // Global option to use FNM_PATHNAME when matching paths (for // skippedPaths). // We initially used FNM_PATHNAME, and we can't change it now // (because of all the config files around). So add global option // to not use the flag, which can be set from rclconfig by adding // a value to the config file (skippedPathsNoFnmPathname) static bool o_useFnmPathname; static void setNoFnmPathname() { o_useFnmPathname = false; } // Flags for call to processone(). FtwDirEnter is used when // entering a directory. FtwDirReturn is used when returning to it // after processing a subdirectory. enum CbFlag {FtwRegular, FtwDirEnter, FtwDirReturn}; enum Status {FtwOk=0, FtwError=1, FtwStop=2, FtwStatAll = FtwError|FtwStop}; enum Options {FtwOptNone = 0, FtwNoRecurse = 1, FtwFollow = 2, FtwNoCanon = 4, // Tree walking options. Natural is close to depth first: process // directory entries as we see them, recursing into subdirectories at // once // Breadth means we process all files and dirs at a given directory level // before going deeper. // // FilesThenDirs is close to Natural, except that we process all files in a // given directory before going deeper: allows keeping only a single // directory open // We don't do pure depth first (process subdirs before files), this does // not appear to make any sense. FtwTravNatural = 0x10000, FtwTravBreadth = 0x20000, FtwTravFilesThenDirs = 0x40000, FtwTravBreadthThenDepth = 0x80000 }; static const int FtwTravMask; FsTreeWalker(int opts = FtwTravNatural); ~FsTreeWalker(); void setOpts(Options opts, int depthswitch = 4); /** * Begin file system walk. * @param dir is not checked against the ignored patterns (this is * a feature and must not change. * @param cb the function object that will be called back for every * file-system object (called both at entry and exit for directories). */ Status walk(const string &dir, FsTreeWalkerCB& cb); /** Get explanation for error */ string getReason(); int getErrCnt(); /** * Add a pattern to the list of things (file or dir) to be ignored * (ie: #* , *~) */ bool addSkippedName(const string &pattern); /** Set the ignored patterns list */ bool setSkippedNames(const list &patlist); /** Same for skipped paths: this are paths, not names, under which we do not descend (ie: /home/me/.recoll) */ bool addSkippedPath(const string &path); /** Set the ignored paths list */ bool setSkippedPaths(const list &pathlist); /** Test if path/name should be skipped. This can be used independantly of * an actual tree walk */ bool inSkippedPaths(const string& path, bool ckparents = true); bool inSkippedNames(const string& name); private: Status iwalk(const string &dir, struct stat *stp, FsTreeWalkerCB& cb); class Internal; Internal *data; }; class FsTreeWalkerCB { public: virtual ~FsTreeWalkerCB() {} virtual FsTreeWalker::Status processone(const string &, const struct stat *, FsTreeWalker::CbFlag) = 0; }; #endif /* _FSTREEWALK_H_INCLUDED_ */ recoll-1.17.3/utils/idfile.cpp000644 001750 000000 00000012060 11740755063 016573 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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_IDFILE #include // for access(2) #include #include #include #include #include #include "idfile.h" #include "debuglog.h" #ifndef NO_NAMESPACES using namespace std; #endif /* NO_NAMESPACES */ /** * This code is currently ONLY used to identify mbox and mail message files * which are badly handled by standard mime type identifiers * There is a very old (circa 1990) mbox format using blocks of ^A (0x01) chars * to separate messages, that we don't recognize currently */ std::list idFileAllTypes() { std::list lst; lst.push_back("text/x-mail"); lst.push_back("message/rfc822"); return lst; } // Mail headers we compare to: static const char *mailhs[] = {"From: ", "Received: ", "Message-Id: ", "To: ", "Date: ", "Subject: ", "Status: ", "In-Reply-To: "}; static const int mailhsl[] = {6, 10, 12, 4, 6, 9, 8, 13}; static const int nmh = sizeof(mailhs) / sizeof(char *); const int wantnhead = 3; // fn is for message printing static string idFileInternal(istream& input, const char *fn) { static int treat_mbox_as_rfc822; if (treat_mbox_as_rfc822 == 0) { treat_mbox_as_rfc822 = getenv("RECOLL_TREAT_MBOX_AS_RFC822") ? 1 : -1; } bool line1HasFrom = false; bool gotnonempty = false; int lookslikemail = 0; // emacs VM sometimes inserts very long lines with continuations or // not (for folder information). This forces us to look at many // lines and long ones int lnum = 1; for (int loop = 1; loop < 200; loop++, lnum++) { #define LL 1024 char cline[LL+1]; cline[LL] = 0; input.getline(cline, LL-1); if (input.fail()) { if (input.bad()) { LOGERR(("idfile: error while reading [%s]\n", fn)); return string(); } // Must be eof ? break; } // gcount includes the \n int ll = input.gcount() - 1; if (ll > 0) gotnonempty = true; LOGDEB2(("idfile: lnum %d ll %d: [%s]\n", lnum, ll, cline)); // Check for a few things that can't be found in a mail file, // (optimization to get a quick negative) // Empty lines if (ll <= 0) { // Accept a few empty lines at the beginning of the file, // otherwise this is the end of headers if (gotnonempty || lnum > 10) { LOGDEB2(("Got empty line\n")); break; } else { // Don't increment the line counter for initial empty lines. lnum--; continue; } } // emacs vm can insert VERY long header lines. if (ll > 800) { LOGDEB2(("idFile: Line too long\n")); return string(); } // Check for mbox 'From ' line if (lnum == 1 && !strncmp("From ", cline, 5)) { if (treat_mbox_as_rfc822 == -1) line1HasFrom = true; continue; } // Except for a possible first line with 'From ', lines must // begin with whitespace or have a colon // (hope no one comes up with a longer header name ! if (!isspace(cline[0])) { char *cp = strchr(cline, ':'); if (cp == 0 || (cp - cline) > 70) { LOGDEB2(("idfile: can't be mail header line: [%s]\n", cline)); break; } } // Compare to known headers for (int i = 0; i < nmh; i++) { if (!strncasecmp(mailhs[i], cline, mailhsl[i])) { //fprintf(stderr, "Got [%s]\n", mailhs[i]); lookslikemail++; break; } } if (lookslikemail >= wantnhead) break; } if (line1HasFrom) lookslikemail++; if (lookslikemail >= wantnhead) return line1HasFrom ? string("text/x-mail") : string("message/rfc822"); return string(); } string idFile(const char *fn) { ifstream input; input.open(fn, ios::in); if (!input.is_open()) { LOGERR(("idFile: could not open [%s]\n", fn)); return string(); } return idFileInternal(input, fn); } string idFileMem(const string& data) { stringstream s(data, stringstream::in); return idFileInternal(s, ""); } #else #include #include #include #include #include #include using namespace std; #include "debuglog.h" #include "idfile.h" int main(int argc, char **argv) { if (argc < 2) { cerr << "Usage: idfile filename" << endl; exit(1); } DebugLog::getdbl()->setloglevel(DEBDEB1); DebugLog::setfilename("stderr"); for (int i = 1; i < argc; i++) { string mime = idFile(argv[i]); cout << argv[i] << " : " << mime << endl; } exit(0); } #endif recoll-1.17.3/utils/idfile.h000644 001750 000000 00000002421 11740755063 016240 0ustar00dockeswheel000000 000000 /* 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 _IDFILE_H_INCLUDED_ #define _IDFILE_H_INCLUDED_ #include #include // Look at data inside file or string, and return mime type or empty string. // // The system's file utility does a bad job on mail folders. idFile // only looks for mail file types for now, but this may change extern std::string idFile(const char *fn); extern std::string idFileMem(const std::string& data); // Return all types known to us extern std::list idFileAllTypes(); #endif /* _IDFILE_H_INCLUDED_ */ recoll-1.17.3/utils/md5.cpp000644 001750 000000 00000030415 11740755063 016030 0ustar00dockeswheel000000 000000 /* * 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. * * $FreeBSD: src/lib/libmd/md5c.c,v 1.11 1999/12/29 05:04:20 peter Exp $ * * This code is the same as the code published by RSA Inc. It has been * edited for clarity and style only. */ #ifndef TEST_MD5 #include #include #include "md5.h" typedef unsigned int md5uint32; static void MD5Transform(md5uint32 [4], const unsigned char [64]); #ifdef i386 #define Encode memcpy #define Decode memcpy #else /* i386 */ /* * Encodes input (md5uint32) into output (unsigned char). Assumes len is * a multiple of 4. */ static void Encode (unsigned char *output, md5uint32 *input, unsigned int len) { unsigned int i, j; for (i = 0, j = 0; j < len; i++, j += 4) { output[j] = (unsigned char)(input[i] & 0xff); output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); } } /* * Decodes input (unsigned char) into output (md5uint32). Assumes len is * a multiple of 4. */ static void Decode (md5uint32 *output, const unsigned char *input, unsigned int len) { unsigned int i, j; for (i = 0, j = 0; j < len; i++, j += 4) output[i] = ((md5uint32)input[j]) | (((md5uint32)input[j+1]) << 8) | (((md5uint32)input[j+2]) << 16) | (((md5uint32)input[j+3]) << 24); } #endif /* i386 */ static unsigned char PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* F, G, H and I are basic MD5 functions. */ #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) /* ROTATE_LEFT rotates x left n bits. */ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) /* * FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. * Rotation is separate from addition to prevent recomputation. */ #define FF(a, b, c, d, x, s, ac) { \ (a) += F ((b), (c), (d)) + (x) + (md5uint32)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define GG(a, b, c, d, x, s, ac) { \ (a) += G ((b), (c), (d)) + (x) + (md5uint32)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define HH(a, b, c, d, x, s, ac) { \ (a) += H ((b), (c), (d)) + (x) + (md5uint32)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define II(a, b, c, d, x, s, ac) { \ (a) += I ((b), (c), (d)) + (x) + (md5uint32)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } /* MD5 initialization. Begins an MD5 operation, writing a new context. */ void MD5Init (MD5_CTX *context) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. */ context->state[0] = 0x67452301; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476; } /* * MD5 block update operation. Continues an MD5 message-digest * operation, processing another message block, and updating the * context. */ void MD5Update (MD5_CTX *context, const unsigned char *input, unsigned int inputLen) { unsigned int i, index, partLen; /* Compute number of bytes mod 64 */ index = (unsigned int)((context->count[0] >> 3) & 0x3F); /* Update number of bits */ if ((context->count[0] += ((md5uint32)inputLen << 3)) < ((md5uint32)inputLen << 3)) context->count[1]++; context->count[1] += ((md5uint32)inputLen >> 29); partLen = 64 - index; /* Transform as many times as possible. */ if (inputLen >= partLen) { memcpy((void *)&context->buffer[index], (const void *)input, partLen); MD5Transform (context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) MD5Transform (context->state, &input[i]); index = 0; } else i = 0; /* Buffer remaining input */ memcpy ((void *)&context->buffer[index], (const void *)&input[i], inputLen-i); } /* * MD5 padding. Adds padding followed by original length. */ void MD5Pad (MD5_CTX *context) { unsigned char bits[8]; unsigned int index, padLen; /* Save number of bits */ Encode (bits, context->count, 8); /* Pad out to 56 mod 64. */ index = (unsigned int)((context->count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); MD5Update (context, PADDING, padLen); /* Append length (before padding) */ MD5Update (context, bits, 8); } /* * MD5 finalization. Ends an MD5 message-digest operation, writing the * the message digest and zeroizing the context. */ void MD5Final (unsigned char digest[16],MD5_CTX *context) { /* Do padding. */ MD5Pad (context); /* Store state in digest */ Encode (digest, context->state, 16); /* Zeroize sensitive information. */ memset ((void *)context, 0, sizeof (*context)); } /* MD5 basic transformation. Transforms state based on block. */ static void MD5Transform (md5uint32 state[4], const unsigned char block[64]) { md5uint32 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; Decode (x, block, 64); /* Round 1 */ #define S11 7 #define S12 12 #define S13 17 #define S14 22 FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ /* Round 2 */ #define S21 5 #define S22 9 #define S23 14 #define S24 20 GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ /* Round 3 */ #define S31 4 #define S32 11 #define S33 16 #define S34 23 HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ /* Round 4 */ #define S41 6 #define S42 10 #define S43 15 #define S44 21 II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; /* Zeroize sensitive information. */ memset ((void *)x, 0, sizeof (x)); } /*************** Convenience / utilities */ void MD5Final(string &digest, MD5_CTX *context) { unsigned char d[16]; MD5Final (d, context); digest.assign((const char *)d, 16); } string& MD5String(const string& data, string& digest) { MD5_CTX ctx; MD5Init(&ctx); MD5Update(&ctx, (const unsigned char*)data.c_str(), data.length()); MD5Final(digest, &ctx); return digest; } string& MD5HexPrint(const string& digest, string &out) { out.erase(); out.reserve(33); static const char hex[]="0123456789abcdef"; const unsigned char *hash = (const unsigned char *)digest.c_str(); for (int i = 0; i < 16; i++) { out.append(1, hex[hash[i] >> 4]); out.append(1, hex[hash[i] & 0x0f]); } return out; } string& MD5HexScan(const string& xdigest, string& digest) { digest.erase(); if (xdigest.length() != 32) { return digest; } for (unsigned int i = 0; i < 16; i++) { unsigned int val; if (sscanf(xdigest.c_str() + 2*i, "%2x", &val) != 1) { digest.erase(); return digest; } digest.append(1, (unsigned char)val); } return digest; } #include "readfile.h" class FileScanMd5 : public FileScanDo { public: FileScanMd5(string& d) : digest(d) {} virtual bool init(size_t size, string *) { MD5Init(&ctx); return true; } virtual bool data(const char *buf, int cnt, string*) { MD5Update(&ctx, (const unsigned char*)buf, cnt); return true; } string &digest; MD5_CTX ctx; }; bool MD5File(const string& filename, string &digest, string *reason) { FileScanMd5 md5er(digest); if (!file_scan(filename, &md5er, reason)) return false; // We happen to know that digest and md5er.digest are the same object MD5Final(md5er.digest, &md5er.ctx); return true; } #else // Test driver #include #include #include #include #include "md5.h" using namespace std; static const char *thisprog; static char usage [] = "trmd5 filename\n\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } int main(int argc, const char **argv) { thisprog = argv[0]; argc--; argv++; if (argc != 1) Usage(); string filename = *argv++;argc--; string reason, digest; if (!MD5File(filename, digest, &reason)) { cerr << reason << endl; exit(1); } else { string hex; cout << "MD5 (" << filename << ") = " << MD5HexPrint(digest, hex) << endl; string digest1; MD5HexScan(hex, digest1); if (digest1.compare(digest)) { cout << "MD5HexScan Failure" << endl; cout << MD5HexPrint(digest, hex) << " " << digest.length() << " -> " << MD5HexPrint(digest1, hex) << " " << digest1.length() << endl; exit(1); } } exit(0); } #endif recoll-1.17.3/utils/md5.h000644 001750 000000 00000003455 11740755063 015501 0ustar00dockeswheel000000 000000 #ifndef _MD5_H_ #define _MD5_H_ /* MD5.H - header file for MD5C.C * Id: md5.h,v 1.6.2.1 1998/02/18 02:28:14 jkh Exp $ */ /* 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. */ /* Base functions from original file */ /* MD5 context. */ typedef struct MD5Context { unsigned int state[4]; /* state (ABCD) */ unsigned int count[2]; /* number of bits, modulo 2^64 (lsb first) */ unsigned char buffer[64]; /* input buffer */ } MD5_CTX; extern void MD5Init (MD5_CTX *); extern void MD5Update (MD5_CTX *, const unsigned char *, unsigned int); extern void MD5Final (unsigned char [16], MD5_CTX *); /* Convenience / utilities */ #include using std::string; extern void MD5Final(string& digest, MD5_CTX *); extern bool MD5File(const string& filename, string& digest, string *reason); extern string& MD5String(const string& data, string& digest); extern string& MD5HexPrint(const string& digest, string& xdigest); extern string& MD5HexScan(const string& xdigest, string& digest); #endif /* _MD5_H_ */ recoll-1.17.3/utils/mimeparse.cpp000644 001750 000000 00000067004 11740755063 017331 0ustar00dockeswheel000000 000000 /* 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_MIMEPARSE #include #include #include #include #include #include #include #include #include "mimeparse.h" #include "base64.h" #include "transcode.h" #include "smallut.h" #ifndef NO_NAMESPACES using namespace std; #endif /* NO_NAMESPACES */ //#define DEBUG_MIMEPARSE #ifdef DEBUG_MIMEPARSE #define DPRINT(X) fprintf X #else #define DPRINT(X) #endif // Parsing a header value. Only content-type and content-disposition // have parameters, but others are compatible with content-type // syntax, only, parameters are not used. So we can parse all like: // // headertype: value [; paramname=paramvalue] ... // // Value and paramvalues can be quoted strings, and there can be // comments too. Note that RFC2047 is explicitly forbidden for // parameter values (RFC2231 must be used), but I have seen it used // anyway (ie: thunderbird 1.0) // // Ref: RFC2045/6/7 (MIME) RFC2183/2231 (content-disposition and encodings) /** Decode a MIME parameter value encoded according to rfc2231 * * Example input withs input charset == "": * [iso-8859-1'french'RE%A0%3A_Smoke_Tests%20bla] * Or (if charset is set) : RE%A0%3A_Smoke_Tests%20bla * * @param in input string, ascii with rfc2231 markup * @param out output string * @param charset if empty: decode string like 'charset'lang'more%20stuff, * else just do the %XX part * @return out output string encoded in utf-8 */ bool rfc2231_decode(const string &in, string &out, string &charset) { string::size_type pos1, pos2=0; if (charset.empty()) { if ((pos1 = in.find("'")) == string::npos) return false; charset = in.substr(0, pos1); // fprintf(stderr, "Charset: [%s]\n", charset.c_str()); pos1++; if ((pos2 = in.find("'", pos1)) == string::npos) return false; // We have no use for lang for now // string lang = in.substr(pos1, pos2-pos1); // fprintf(stderr, "Lang: [%s]\n", lang.c_str()); pos2++; } string raw; qp_decode(in.substr(pos2), raw, '%'); // fprintf(stderr, "raw [%s]\n", raw.c_str()); if (!transcode(raw, out, charset, "UTF-8")) return false; return true; } ///////////////////////////////////////// /// Decoding of MIME fields values and parameters // The lexical token returned by find_next_token class Lexical { public: enum kind {none, token, separator}; kind what; string value; string error; char quote; Lexical() : what(none), quote(0) {} void reset() {what = none; value.erase(); error.erase();quote = 0;} }; // Skip mime comment. This must be called with in[start] == '(' static string::size_type skip_comment(const string &in, string::size_type start, Lexical &lex) { int commentlevel = 0; for (; start < in.size(); start++) { if (in[start] == '\\') { // Skip escaped char. if (start+1 < in.size()) { start++; continue; } else { lex.error.append("\\ at end of string "); return in.size(); } } if (in[start] == '(') commentlevel++; if (in[start] == ')') { if (--commentlevel == 0) break; } } if (start == in.size() && commentlevel != 0) { lex.error.append("Unclosed comment "); return in.size(); } return start; } // Skip initial whitespace and (possibly nested) comments. static string::size_type skip_whitespace_and_comment(const string &in, string::size_type start, Lexical &lex) { while (1) { if ((start = in.find_first_not_of(" \t\r\n", start)) == string::npos) return in.size(); if (in[start] == '(') { if ((start = skip_comment(in, start, lex)) == string::npos) return string::npos; } else { break; } } return start; } /// Find next token in mime header value string. /// @return the next starting position in string, string::npos for error /// @param in the input string /// @param start the starting position /// @param lex the returned token and its description /// @param delims separators we should look for static string::size_type find_next_token(const string &in, string::size_type start, Lexical &lex, string delims = ";=") { char oquot, cquot; start = skip_whitespace_and_comment(in, start, lex); if (start == string::npos || start == in.size()) return in.size(); // Begins with separator ? return it. string::size_type delimi = delims.find_first_of(in[start]); if (delimi != string::npos) { lex.what = Lexical::separator; lex.value = delims[delimi]; return start+1; } // Check for start of quoted string oquot = in[start]; switch (oquot) { case '<': cquot = '>';break; case '"': cquot = '"';break; default: cquot = 0; break; } if (cquot != 0) { // Quoted string parsing string::size_type end; start++; // Skip quote character for (end = start;end < in.size() && in[end] != cquot; end++) { if (in[end] == '\\') { // Skip escaped char. if (end+1 < in.size()) { end++; } else { // backslash at end of string: error lex.error.append("\\ at end of string "); return string::npos; } } } if (end == in.size()) { // Found end of string before closing quote character: error lex.error.append("Unclosed quoted string "); return string::npos; } lex.what = Lexical::token; lex.value = in.substr(start, end-start); lex.quote = oquot; return ++end; } else { string::size_type end = in.find_first_of(delims + "\r\n \t(", start); lex.what = Lexical::token; lex.quote = 0; if (end == string::npos) { end = in.size(); lex.value = in.substr(start); } else { lex.value = in.substr(start, end-start); } return end; } } // Classes for handling rfc2231 value continuations class Chunk { public: Chunk() : decode(false) {} bool decode; string value; }; class Chunks { public: vector chunks; }; void stringtolower(string &out, const string& in) { for (string::size_type i = 0; i < in.size(); i++) out.append(1, char(tolower(in[i]))); } // Parse MIME field value. Should look like: // somevalue ; param1=val1;param2=val2 bool parseMimeHeaderValue(const string& value, MimeHeaderValue& parsed) { parsed.value.erase(); parsed.params.clear(); Lexical lex; string::size_type start = 0; // Get the field value start = find_next_token(value, start, lex); if (start == string::npos || lex.what != Lexical::token) return false; parsed.value = lex.value; map rawparams; // Look for parameters for (;;) { string paramname, paramvalue; lex.reset(); start = find_next_token(value, start, lex); if (start == value.size()) break; if (start == string::npos) { //fprintf(stderr, "Find_next_token error(1)\n"); return false; } if (lex.what == Lexical::separator && lex.value[0] == ';') continue; if (lex.what != Lexical::token) return false; stringtolower(paramname, lex.value); start = find_next_token(value, start, lex); if (start == string::npos || lex.what != Lexical::separator || lex.value[0] != '=') { //fprintf(stderr, "Find_next_token error (2)\n"); return false; } start = find_next_token(value, start, lex); if (start == string::npos || lex.what != Lexical::token) { //fprintf(stderr, "Parameter has no value!"); return false; } paramvalue = lex.value; rawparams[paramname] = paramvalue; //fprintf(stderr, "RAW: name [%s], value [%s]\n", paramname.c_str(), // paramvalue.c_str()); } // fprintf(stderr, "Number of raw params %d\n", rawparams.size()); // RFC2231 handling: // - if a parameter name ends in * it must be decoded // - If a parameter name looks line name*ii[*] it is a // partial value, and must be concatenated with other such. map chunks; for (map::const_iterator it = rawparams.begin(); it != rawparams.end(); it++) { string nm = it->first; // fprintf(stderr, "NM: [%s]\n", nm.c_str()); if (nm.empty()) // ?? continue; Chunk chunk; if (nm[nm.length()-1] == '*') { nm.erase(nm.length() - 1); chunk.decode = true; } else chunk.decode = false; // fprintf(stderr, "NM1: [%s]\n", nm.c_str()); chunk.value = it->second; // Look for another asterisk in nm. If none, assign index 0 string::size_type aster; int idx = 0; if ((aster = nm.rfind("*")) != string::npos) { string num = nm.substr(aster+1); //fprintf(stderr, "NUM: [%s]\n", num.c_str()); nm.erase(aster); idx = atoi(num.c_str()); } Chunks empty; if (chunks.find(nm) == chunks.end()) chunks[nm] = empty; chunks[nm].chunks.resize(idx+1); chunks[nm].chunks[idx] = chunk; //fprintf(stderr, "CHNKS: nm [%s], idx %d, decode %d, value [%s]\n", // nm.c_str(), idx, int(chunk.decode), chunk.value.c_str()); } // For each parameter name, concatenate its chunks and possibly // decode Note that we pass the whole concatenated string to // decoding if the first chunk indicates that decoding is needed, // which is not right because there might be uncoded chunks // according to the rfc. for (map::const_iterator it = chunks.begin(); it != chunks.end(); it++) { if (it->second.chunks.empty()) continue; string nm = it->first; // Create the name entry if (parsed.params.find(nm) == parsed.params.end()) parsed.params[nm].clear(); // Concatenate all chunks and decode the whole if the first one needs // to. Yes, this is not quite right. string value; for (vector::const_iterator vi = it->second.chunks.begin(); vi != it->second.chunks.end(); vi++) { value += vi->value; } if (it->second.chunks[0].decode) { string charset; rfc2231_decode(value, parsed.params[nm], charset); } else { // rfc2047 MUST NOT but IS used by some agents rfc2047_decode(value, parsed.params[nm]); } //fprintf(stderr, "FINAL: nm [%s], value [%s]\n", //nm.c_str(), parsed.params[nm].c_str()); } return true; } // Decode a string encoded with quoted-printable encoding. // we reuse the code for rfc2231 % encoding, even if the eol // processing is not useful in this case bool qp_decode(const string& in, string &out, char esc) { out.reserve(in.length()); string::size_type ii; for (ii = 0; ii < in.length(); ii++) { if (in[ii] == esc) { ii++; // Skip '=' or '%' if(ii >= in.length() - 1) { // Need at least 2 more chars break; } else if (in[ii] == '\r' && in[ii+1] == '\n') { // Soft nl, skip ii++; } else if (in[ii] != '\n' && in[ii] != '\r') { // decode char c = in[ii]; char co; if(c >= 'A' && c <= 'F') { co = char((c - 'A' + 10) * 16); } else if (c >= 'a' && c <= 'f') { co = char((c - 'a' + 10) * 16); } else if (c >= '0' && c <= '9') { co = char((c - '0') * 16); } else { return false; } if(++ii >= in.length()) break; c = in[ii]; if (c >= 'A' && c <= 'F') { co += char(c - 'A' + 10); } else if (c >= 'a' && c <= 'f') { co += char(c - 'a' + 10); } else if (c >= '0' && c <= '9') { co += char(c - '0'); } else { return false; } out += co; } } else { out += in[ii]; } } return true; } // Decode an word encoded as quoted printable or base 64 static bool rfc2047_decodeParsed(const std::string& charset, const std::string& encoding, const std::string& value, std::string &utf8) { DPRINT((stderr, "DecodeParsed: charset [%s] enc [%s] val [%s]\n", charset.c_str(), encoding.c_str(), value.c_str())); utf8.clear(); string decoded; if (!stringlowercmp("b", encoding)) { if (!base64_decode(value, decoded)) return false; DPRINT((stderr, "FromB64: [%s]\n", decoded.c_str())); } else if (!stringlowercmp("q", encoding)) { if (!qp_decode(value, decoded)) return false; // Need to translate _ to ' ' here string temp; for (string::size_type pos = 0; pos < decoded.length(); pos++) if (decoded[pos] == '_') temp += ' '; else temp += decoded[pos]; decoded = temp; DPRINT((stderr, "FromQP: [%s]\n", decoded.c_str())); } else { DPRINT((stderr, "Bad encoding [%s]\n", encoding.c_str())); return false; } if (!transcode(decoded, utf8, charset, "UTF-8")) { DPRINT((stderr, "Transcode failed\n")); return false; } return true; } // Parse a mail header value encoded according to RFC2047. // This is not supposed to be used for MIME parameter values, but it // happens. // Bugs: // - We should turn off decoding while inside quoted strings // typedef enum {rfc2047ready, rfc2047open_eq, rfc2047charset, rfc2047encoding, rfc2047value, rfc2047close_q} Rfc2047States; bool rfc2047_decode(const std::string& in, std::string &out) { DPRINT((stderr, "rfc2047_decode: [%s]\n", in.c_str())); Rfc2047States state = rfc2047ready; string encoding, charset, value, utf8; out.clear(); for (string::size_type ii = 0; ii < in.length(); ii++) { char ch = in[ii]; switch (state) { case rfc2047ready: { DPRINT((stderr, "STATE: ready, ch %c\n", ch)); switch (ch) { // Whitespace: stay ready case ' ': case ' ': value += ch;break; // '=' -> forward to next state case '=': state = rfc2047open_eq; break; DPRINT((stderr, "STATE: open_eq\n")); // Other: go back to sleep default: value += ch; state = rfc2047ready; } } break; case rfc2047open_eq: { DPRINT((stderr, "STATE: open_eq, ch %c\n", ch)); switch (ch) { case '?': { // Transcode current (unencoded part) value: // we sometimes find 8-bit chars in // there. Interpret as Iso8859. if (value.length() > 0) { transcode(value, utf8, "ISO-8859-1", "UTF-8"); out += utf8; value.clear(); } state = rfc2047charset; } break; default: state = rfc2047ready; out += '='; out += ch;break; } } break; case rfc2047charset: { DPRINT((stderr, "STATE: charset, ch %c\n", ch)); switch (ch) { case '?': state = rfc2047encoding; break; default: charset += ch; break; } } break; case rfc2047encoding: { DPRINT((stderr, "STATE: encoding, ch %c\n", ch)); switch (ch) { case '?': state = rfc2047value; break; default: encoding += ch; break; } } break; case rfc2047value: { DPRINT((stderr, "STATE: value, ch %c\n", ch)); switch (ch) { case '?': state = rfc2047close_q; break; default: value += ch;break; } } break; case rfc2047close_q: { DPRINT((stderr, "STATE: close_q, ch %c\n", ch)); switch (ch) { case '=': { DPRINT((stderr, "End of encoded area. Charset %s, Encoding %s\n", charset.c_str(), encoding.c_str())); string utf8; state = rfc2047ready; if (!rfc2047_decodeParsed(charset, encoding, value, utf8)) { return false; } out += utf8; charset.clear(); encoding.clear(); value.clear(); } break; default: state = rfc2047value; value += '?';value += ch;break; } } break; default: // ?? DPRINT((stderr, "STATE: default ?? ch %c\n", ch)); return false; } } if (value.length() > 0) { transcode(value, utf8, "ISO-8859-1", "UTF-8"); out += utf8; value.clear(); } if (state != rfc2047ready) return false; return true; } #define DEBUGDATE 0 #if DEBUGDATE #define DATEDEB(X) fprintf X #else #define DATEDEB(X) #endif // Convert rfc822 date to unix time. A date string normally looks like: // Mon, 3 Jul 2006 09:51:58 +0200 // But there are many close common variations // And also hopeless things like: Fri Nov 3 13:13:33 2006 time_t rfc2822DateToUxTime(const string& dt) { // Strip everything up to first comma if any, we don't need weekday, // then break into tokens vector toks; string::size_type idx; if ((idx = dt.find_first_of(",")) != string::npos) { if (idx == dt.length() - 1) { DATEDEB((stderr, "Bad rfc822 date format (short1): [%s]\n", dt.c_str())); return (time_t)-1; } string date = dt.substr(idx+1); stringToTokens(date, toks, " \t:"); } else { // No comma. Enter strangeland stringToTokens(dt, toks, " \t:"); // Test for date like: Sun Nov 19 06:18:41 2006 // 0 1 2 3 4 5 6 // and change to: 19 Nov 2006 06:18:41 if (toks.size() == 7) { if (toks[0].length() == 3 && toks[0].find_first_of("0123456789") == string::npos) { swap(toks[0], toks[2]); swap(toks[6], toks[2]); toks.pop_back(); } } } #if DEBUGDATE for (list::iterator it = toks.begin(); it != toks.end(); it++) { DATEDEB((stderr, "[%s] ", it->c_str())); } DATEDEB((stderr, "\n")); #endif if (toks.size() < 6) { DATEDEB((stderr, "Bad rfc822 date format (toks cnt): [%s]\n", dt.c_str())); return (time_t)-1; } if (toks.size() == 6) { // Probably no timezone, sometimes happens toks.push_back("+0000"); } struct tm tm; memset(&tm, 0, sizeof(tm)); // Load struct tm with appropriate tokens, possibly converting // when needed vector::iterator it = toks.begin(); // Day of month: no conversion needed tm.tm_mday = atoi(it->c_str()); it++; // Month. Only Jan-Dec are legal. January, February do happen // though. Convert to 0-11 if (*it == "Jan" || *it == "January") tm.tm_mon = 0; else if (*it == "Feb" || *it == "February") tm.tm_mon = 1; else if (*it == "Mar" || *it == "March") tm.tm_mon = 2; else if (*it == "Apr" || *it == "April") tm.tm_mon = 3; else if (*it == "May") tm.tm_mon = 4; else if (*it == "Jun" || *it == "June") tm.tm_mon = 5; else if (*it == "Jul" || *it == "July") tm.tm_mon = 6; else if (*it == "Aug" || *it == "August") tm.tm_mon = 7; else if (*it == "Sep" || *it == "September") tm.tm_mon = 8; else if (*it == "Oct" || *it == "October") tm.tm_mon = 9; else if (*it == "Nov" || *it == "November") tm.tm_mon = 10; else if (*it == "Dec" || *it == "December") tm.tm_mon = 11; else { DATEDEB((stderr, "Bad rfc822 date format (month): [%s]\n", dt.c_str())); return (time_t)-1; } it++; // Year. Struct tm counts from 1900. 2 char years are quite rare // but do happen. I've seen 00 happen so count small values from 2000 tm.tm_year = atoi(it->c_str()); if (it->length() == 2) { if (tm.tm_year < 10) tm.tm_year += 2000; else tm.tm_year += 1900; } if (tm.tm_year > 1900) tm.tm_year -= 1900; it++; // Hour minute second need no adjustments tm.tm_hour = atoi(it->c_str()); it++; tm.tm_min = atoi(it->c_str()); it++; tm.tm_sec = atoi(it->c_str()); it++; // Timezone is supposed to be either +-XYZT or a zone name int zonesecs = 0; if (it->length() < 1) { DATEDEB((stderr, "Bad rfc822 date format (zlen): [%s]\n", dt.c_str())); return (time_t)-1; } if (it->at(0) == '-' || it->at(0) == '+') { // Note that +xy:zt (instead of +xyzt) sometimes happen, we // may want to process it one day if (it->length() < 5) { DATEDEB((stderr, "Bad rfc822 date format (zlen1): [%s]\n", dt.c_str())); goto nozone; } zonesecs = 3600*((it->at(1)-'0') * 10 + it->at(2)-'0')+ (it->at(3)-'0')*10 + it->at(4)-'0'; zonesecs = it->at(0) == '+' ? -1 * zonesecs : zonesecs; } else { int hours; if (*it == "A") hours= 1; else if (*it == "B") hours= 2; else if (*it == "C") hours= 3; else if (*it == "D") hours= 4; else if (*it == "E") hours= 5; else if (*it == "F") hours= 6; else if (*it == "G") hours= 7; else if (*it == "H") hours= 8; else if (*it == "I") hours= 9; else if (*it == "K") hours= 10; else if (*it == "L") hours= 11; else if (*it == "M") hours= 12; else if (*it == "N") hours= -1; else if (*it == "O") hours= -2; else if (*it == "P") hours= -3; else if (*it == "Q") hours= -4; else if (*it == "R") hours= -5; else if (*it == "S") hours= -6; else if (*it == "T") hours= -7; else if (*it == "U") hours= -8; else if (*it == "V") hours= -9; else if (*it == "W") hours= -10; else if (*it == "X") hours= -11; else if (*it == "Y") hours= -12; else if (*it == "Z") hours= 0; else if (*it == "UT") hours= 0; else if (*it == "GMT") hours= 0; else if (*it == "EST") hours= 5; else if (*it == "EDT") hours= 4; else if (*it == "CST") hours= 6; else if (*it == "CDT") hours= 5; else if (*it == "MST") hours= 7; else if (*it == "MDT") hours= 6; else if (*it == "PST") hours= 8; else if (*it == "PDT") hours= 7; // Non standard names // Standard Time (or Irish Summer Time?) is actually +5.5 else if (*it == "CET") hours= -1; else if (*it == "JST") hours= -9; else if (*it == "IST") hours= -5; else if (*it == "WET") hours= 0; else if (*it == "MET") hours= -1; else { DATEDEB((stderr, "Bad rfc822 date format (zname): [%s]\n", dt.c_str())); // Forget tz goto nozone; } zonesecs = 3600 * hours; } DATEDEB((stderr, "Tz: [%s] -> %d\n", it->c_str(), zonesecs)); nozone: // Compute the UTC Unix time value #ifndef sun time_t tim = timegm(&tm); #else // No timegm on Sun. Use mktime, then correct for local timezone time_t tim = mktime(&tm); // altzone and timezone hold the difference in seconds between UTC // and local. They are negative for places east of greenwich // // mktime takes our buffer to be local time, so it adds timezone // to the conversion result (if timezone is < 0 it's currently // earlier in greenwhich). // // We have to substract it back (hey! hopefully! maybe we have to // add it). Who can really know? tim -= timezone; #endif // And add in the correction from the email's Tz tim += zonesecs; DATEDEB((stderr, "Date: %s uxtime %ld \n", ctime(&tim), tim)); return tim; } #else #include #include #include #include #include #include "mimeparse.h" #include "readfile.h" using namespace std; extern bool rfc2231_decode(const string& in, string& out, string& charset); extern time_t rfc2822DateToUxTime(const string& date); static const char *thisprog; static char usage [] = "-p: header value and parameter test\n" "-q: qp decoding\n" "-b: base64\n" "-7: rfc2047\n" "-1: rfc2331\n" "-t: date time\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_p 0x2 #define OPT_q 0x4 #define OPT_b 0x8 #define OPT_7 0x10 #define OPT_1 0x20 #define OPT_t 0x40 int main(int argc, const char **argv) { int count = 10; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'p': op_flags |= OPT_p; break; case 'q': op_flags |= OPT_q; break; case 'b': op_flags |= OPT_b; break; case '1': op_flags |= OPT_1; break; case '7': op_flags |= OPT_7; break; case 't': op_flags |= OPT_t; break; default: Usage(); break; } b1: argc--; argv++; } if (argc != 0) Usage(); if (op_flags & OPT_p) { // Mime header value and parameters extraction const char *tr[] = { "text/html;charset = UTF-8 ; otherparam=garb; \n" "QUOTEDPARAM=\"quoted value\"", "text/plain; charset=ASCII\r\n name=\"809D3016_5691DPS_5.2.LIC\"", "application/x-stuff;" "title*0*=us-ascii'en'This%20is%20even%20more%20;" "title*1*=%2A%2A%2Afun%2A%2A%2A%20;" "title*2=\"isn't it!\"" }; for (unsigned int i = 0; i < sizeof(tr) / sizeof(char *); i++) { MimeHeaderValue parsed; if (!parseMimeHeaderValue(tr[i], parsed)) { fprintf(stderr, "PARSE ERROR for [%s]\n", tr[i]); } printf("Field value: [%s]\n", parsed.value.c_str()); map::iterator it; for (it = parsed.params.begin();it != parsed.params.end();it++) { if (it == parsed.params.begin()) printf("Parameters:\n"); printf(" [%s] = [%s]\n", it->first.c_str(), it->second.c_str()); } } } else if (op_flags & OPT_q) { // Quoted printable stuff const char *qp = "=41=68 =e0 boire=\r\n continue 1ere\ndeuxieme\n\r3eme " "agrave is: '=E0' probable skipped decode error: =\n" "Actual decode error =xx this wont show"; string out; if (!qp_decode(string(qp), out)) { fprintf(stderr, "qp_decode returned error\n"); } printf("Decoded: '%s'\n", out.c_str()); } else if (op_flags & OPT_b) { // Base64 //'C'est à boire qu'il nous faut éviter l'excès.' //'Deuxième ligne' //'Troisième ligne' //'Et la fin (pas de nl). ' const char *b64 = "Qydlc3Qg4CBib2lyZSBxdSdpbCBub3VzIGZhdXQg6XZpdGVyIGwnZXhj6HMuCkRldXhp6G1l\r\n" "IGxpZ25lClRyb2lzaehtZSBsaWduZQpFdCBsYSBmaW4gKHBhcyBkZSBubCkuIA==\r\n"; string out; if (!base64_decode(string(b64), out)) { fprintf(stderr, "base64_decode returned error\n"); exit(1); } printf("Decoded: [%s]\n", out.c_str()); #if 0 string coded, decoded; const char *fname = "/tmp/recoll_decodefail"; if (!file_to_string(fname, coded)) { fprintf(stderr, "Cant read %s\n", fname); exit(1); } if (!base64_decode(coded, decoded)) { fprintf(stderr, "base64_decode returned error\n"); exit(1); } printf("Decoded: [%s]\n", decoded.c_str()); #endif } else if (op_flags & (OPT_7|OPT_1)) { // rfc2047 char line [1024]; string out; bool res; while (fgets(line, 1023, stdin)) { int l = strlen(line); if (l == 0) continue; line[l-1] = 0; fprintf(stderr, "Line: [%s]\n", line); string charset; if (op_flags & OPT_7) { res = rfc2047_decode(line, out); } else { res = rfc2231_decode(line, out, charset); } if (res) fprintf(stderr, "Out: [%s] cs %s\n", out.c_str(), charset.c_str()); else fprintf(stderr, "Decoding failed\n"); } } else if (op_flags & OPT_t) { time_t t; const char *dates[] = { " Wed, 13 Sep 2006 11:40:26 -0700 (PDT)", " Mon, 3 Jul 2006 09:51:58 +0200", " Wed, 13 Sep 2006 08:19:48 GMT-07:00", " Wed, 13 Sep 2006 11:40:26 -0700 (PDT)", " Sat, 23 Dec 89 19:27:12 EST", " 13 Jan 90 08:23:29 GMT"}; for (unsigned int i = 0; i [%s]\n", dates[i], datebuf); } printf("Enter date:\n"); char line [1024]; while (fgets(line, 1023, stdin)) { int l = strlen(line); if (l == 0) continue; line[l-1] = 0; t = rfc2822DateToUxTime(line); struct tm *tm = localtime(&t); char datebuf[100]; strftime(datebuf, 99, " %Y-%m-%d %H:%M:%S %z", tm); printf("[%s] -> [%s]\n", line, datebuf); } } exit(0); } #endif // TEST_MIMEPARSE recoll-1.17.3/utils/mimeparse.h000644 001750 000000 00000007170 11740755063 016774 0ustar00dockeswheel000000 000000 /* 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 _MIME_H_INCLUDED_ #define _MIME_H_INCLUDED_ /* Mime definitions RFC to 4-9-2006: 2045 Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies. N. Freed, N. Borenstein. November 1996. (Format: TXT=72932 bytes) (Obsoletes RFC1521, RFC1522, RFC1590) (Updated by RFC2184, RFC2231) (Status: DRAFT STANDARD) 2046 Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types. N. Freed, N. Borenstein. November 1996. (Format: TXT=105854 bytes) (Obsoletes RFC1521, RFC1522, RFC1590) (Updated by RFC2646, RFC3798) (Status: DRAFT STANDARD) 2047 MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text. K. Moore. November 1996. (Format: TXT=33262 bytes) (Obsoletes RFC1521, RFC1522, RFC1590) (Updated by RFC2184, RFC2231) (Status: DRAFT STANDARD) 2183 Communicating Presentation Information in Internet Messages: The Content-Disposition Header Field. R. Troost, S. Dorner, K. Moore, Ed.. August 1997. (Format: TXT=23150 bytes) (Updates RFC1806) (Updated by RFC2184, RFC2231) (Status: PROPOSED STANDARD) 2231 MIME Parameter Value and Encoded Word Extensions: Character Sets, Languages, and Continuations. N. Freed, K. Moore. November 1997. (Format: TXT=19280 bytes) (Obsoletes RFC2184) (Updates RFC2045, RFC2047, RFC2183) (Status: PROPOSED STANDARD) */ #include #include #include #include "base64.h" #ifndef NO_NAMESPACES using std::string; #endif /** A class to represent a MIME header value with parameters */ class MimeHeaderValue { public: string value; std::map params; }; /** * Parse MIME Content-type and Content-disposition value * * @param in the input string should be like: value; pn1=pv1; pn2=pv2. * Example: text/plain; charset="iso-8859-1" */ extern bool parseMimeHeaderValue(const string& in, MimeHeaderValue& psd); /** * Quoted printable decoding. Doubles up as rfc2231 decoder, hence the esc * RFC2045 Quoted printable uses '=' , rfc2331 uses '%'. The two encodings are * otherwise similar. */ extern bool qp_decode(const string& in, string &out, char esc = '='); /** Decode an Internet mail field value encoded according to rfc2047 * * Example input: Some words =?iso-8859-1?Q?RE=A0=3A_Smoke_Tests?= more input * * Note that MIME parameter values are explicitly NOT to be encoded with * this encoding which is only for headers like Subject:, To:. But it * is sometimes used anyway... * * @param in input string, ascii with rfc2047 markup * @return out output string encoded in utf-8 */ extern bool rfc2047_decode(const string& in, string &out); /** Decode RFC2822 date to unix time (gmt secs from 1970 * * @param dt date string (the part after Date: ) * @return unix time */ time_t rfc2822DateToUxTime(const string& dt); #endif /* _MIME_H_INCLUDED_ */ recoll-1.17.3/utils/netcon.cpp000644 001750 000000 00000072744 11740755063 016644 0ustar00dockeswheel000000 000000 /* Copyright (C) 2002 Jean-Francois Dockes */ // Wrapper classes for the socket interface #ifndef TEST_NETCON #include #include #include #include #ifdef _AIX #include #endif // _AIX #include #include #include #include #include #include #include #include #include #ifndef NO_NAMESPACES using namespace std; #endif #include "debuglog.h" #include "netcon.h" #ifndef SOCKLEN_T #define SOCKLEN_T socklen_t #endif // Need &one, &zero for setsockopt... static const int one = 1; static const int zero = 0; #define LOGSYSERR(who, call, spar) \ LOGERR(("%s: %s(%s) errno %d (%s)\n", who, call, \ spar, errno, strerror(errno))) #ifndef MIN #define MIN(a,b) (ab?a:b) #endif #ifndef freeZ #define freeZ(X) if (X) {free(X);X=0;} #endif #define MILLIS(OLD, NEW) ( (long)(((NEW).tv_sec - (OLD).tv_sec) * 1000 + \ ((NEW).tv_usec - (OLD).tv_usec) / 1000)) // Static method // Simplified interface to 'select()'. Only use one fd, for either // reading or writing. This is only used when not using the // selectloop() style of network i/o. // Note that timeo == 0 does NOT mean wait forever but no wait at all. int Netcon::select1(int fd, int timeo, int write) { int ret; struct timeval tv; fd_set rd; tv.tv_sec = timeo; tv.tv_usec = 0; FD_ZERO(&rd); FD_SET(fd, &rd); if (write) { ret = select(fd+1, 0, &rd, 0, &tv); } else { ret = select(fd+1, &rd, 0, 0, &tv); } if (!FD_ISSET(fd, &rd)) { LOGERR(("Netcon::select1: fd not ready after select ??\n")); return -1; } return ret; } void SelectLoop::setperiodichandler(int (*handler)(void *), void *p, int ms) { m_periodichandler = handler; m_periodicparam = p; m_periodicmillis = ms; if (m_periodicmillis > 0) gettimeofday(&m_lasthdlcall, 0); } // Compute the appropriate timeout so that the select call returns in // time to call the periodic routine. void SelectLoop::periodictimeout(struct timeval *tv) { // If periodic not set, the select call times out and we loop // after a very long time (we'd need to pass NULL to select for an // infinite wait, and I'm too lazy to handle it) if (m_periodicmillis <= 0) { tv->tv_sec = 10000; tv->tv_usec = 0; return; } struct timeval mtv; gettimeofday(&mtv, 0); int millis = m_periodicmillis - MILLIS(m_lasthdlcall, mtv); // millis <= 0 means we should have already done the thing. *dont* set the // tv to 0, which means no timeout at all ! if (millis <= 0) millis = 1; tv->tv_sec = millis / 1000; tv->tv_usec = (millis % 1000) * 1000; } // Check if it's time to call the handler. selectloop will return to // caller if it or we return 0 int SelectLoop::maybecallperiodic() { if (m_periodicmillis <= 0) return 1; struct timeval mtv; gettimeofday(&mtv, 0); int millis = m_periodicmillis - MILLIS(m_lasthdlcall, mtv); if (millis <= 0) { gettimeofday(&m_lasthdlcall, 0); if (m_periodichandler) return m_periodichandler(m_periodicparam); else return 0; } return 1; } int SelectLoop::doLoop() { for (;;) { if (m_selectloopDoReturn) { m_selectloopDoReturn = false; LOGDEB(("Netcon::selectloop: returning on request\n")); return m_selectloopReturnValue; } int nfds; fd_set rd, wd; FD_ZERO(&rd); FD_ZERO(&wd); // Walk the netcon map and set up the read and write fd_sets // for select() nfds = 0; for (map::iterator it = m_polldata.begin(); it != m_polldata.end(); it++) { NetconP &pll = it->second; int fd = it->first; LOGDEB2(("Selectloop: fd %d flags 0x%x\n",fd, pll->m_wantedEvents)); if (pll->m_wantedEvents & Netcon::NETCONPOLL_READ) { FD_SET(fd, &rd); nfds = MAX(nfds, fd + 1); } if (pll->m_wantedEvents & Netcon::NETCONPOLL_WRITE) { FD_SET(fd, &wd); nfds = MAX(nfds, fd + 1); } } if (nfds == 0) { // This should never happen in a server as we should at least // always monitor the main listening server socket. For a // client, it's up to client code to avoid or process this // condition. // Just in case there would still be open fds in there // (with no r/w flags set). Should not be needed, but safer m_polldata.clear(); LOGDEB1(("Netcon::selectloop: no fds\n")); return 0; } LOGDEB2(("Netcon::selectloop: selecting, nfds = %d\n", nfds)); // Compute the next timeout according to what might need to be // done apart from waiting for data struct timeval tv; periodictimeout(&tv); // Wait for something to happen int ret = select(nfds, &rd, &wd, 0, &tv); LOGDEB2(("Netcon::selectloop: select returns %d\n", ret)); if (ret < 0) { LOGSYSERR("Netcon::selectloop", "select", ""); return -1; } if (m_periodicmillis > 0) if (maybecallperiodic() <= 0) return 1; // Timeout, do it again. if (ret == 0) continue; // We don't start the fd sweep at 0, else some fds would be advantaged. // Note that we do an fd sweep, not a map sweep. This is // inefficient because the fd array may be very sparse. Otoh, the // map may change between 2 sweeps, so that we'd have to be smart // with the iterator. As the cost per unused fd is low (just 2 bit // flag tests), we keep it like this for now if (m_placetostart >= nfds) m_placetostart = 0; int i, fd; for (i = 0, fd = m_placetostart; i < nfds;i++, fd++) { if (fd >= nfds) fd = 0; int canread = FD_ISSET(fd, &rd); int canwrite = FD_ISSET(fd, &wd); bool none = !canread && !canwrite; LOGDEB2(("Netcon::selectloop: fd %d %s %s %s\n", fd, none ? "blocked" : "can" , canread ? "read" : "", canwrite ? "write" : "")); if (none) continue; map::iterator it = m_polldata.find(fd); if (it == m_polldata.end()) { /// This should not happen actually LOGDEB2(("Netcon::selectloop: fd %d not found\n", fd)); continue; } // Next start will be one beyond last serviced (modulo nfds) m_placetostart = fd + 1; NetconP &pll = it->second; if (canread && pll->cando(Netcon::NETCONPOLL_READ) <= 0) pll->m_wantedEvents &= ~Netcon::NETCONPOLL_READ; if (canwrite && pll->cando(Netcon::NETCONPOLL_WRITE) <= 0) pll->m_wantedEvents &= ~Netcon::NETCONPOLL_WRITE; if (!(pll->m_wantedEvents & (Netcon::NETCONPOLL_WRITE|Netcon::NETCONPOLL_READ))) { LOGDEB0(("Netcon::selectloop: fd %d has 0x%x mask, erasing\n", it->first, it->second->m_wantedEvents)); m_polldata.erase(it); } } // fd sweep } // forever loop LOGERR(("SelectLoop::doLoop: got out of loop !\n")); return -1; } // Add a connection to the monitored set. int SelectLoop::addselcon(NetconP con, int events) { if (con.isNull()) return -1; LOGDEB1(("Netcon::addselcon: fd %d\n", con->m_fd)); con->set_nonblock(1); con->setselevents(events); m_polldata[con->m_fd] = con; con->setloop(this); return 0; } // Remove a connection from the monitored set. int SelectLoop::remselcon(NetconP con) { if (con.isNull()) return -1; LOGDEB1(("Netcon::remselcon: fd %d\n", con->m_fd)); map::iterator it = m_polldata.find(con->m_fd); if (it == m_polldata.end()) { LOGDEB1(("Netcon::remselcon: con not found for fd %d\n", con->m_fd)); return -1; } con->setloop(0); m_polldata.erase(it); return 0; } ////////////////////////////////////////////////////////// // Base class (Netcon) methods Netcon::~Netcon() { closeconn(); if (m_peer) { free(m_peer); m_peer = 0; } } void Netcon::closeconn() { if (m_ownfd && m_fd >= 0) { close(m_fd); } m_fd = -1; m_ownfd = true; } char *Netcon::sterror() { return strerror(errno); } void Netcon::setpeer(const char *hostname) { if (m_peer) free(m_peer); m_peer = strdup(hostname); } int Netcon::settcpnodelay(int on) { LOGDEB2(( "Netcon::settcpnodelay\n" )); if (m_fd < 0) { LOGERR(("Netcon::settcpnodelay: connection not opened\n")); return -1; } char *cp = on ? (char *)&one : (char *)&zero; if (setsockopt(m_fd, IPPROTO_TCP, TCP_NODELAY, cp, sizeof(one)) < 0) { LOGSYSERR("NetconCli::settcpnodelay", "setsockopt", "TCP_NODELAY"); return -1; } return 0; } // Set/reset non-blocking flag on fd int Netcon::set_nonblock(int onoff) { int flags = fcntl(m_fd, F_GETFL, 0); if (flags != -1 ) { int newflags = onoff ? flags | O_NONBLOCK : flags & ~O_NONBLOCK; if (newflags != flags) if (fcntl(m_fd, F_SETFL, newflags)< 0) return -1; } return flags; } ///////////////////////////////////////////////////////////////////// // Data socket (NetconData) methods NetconData::~NetconData() { freeZ(m_buf); m_bufbase = 0; m_bufbytes = m_bufsize = 0; } int NetconData::send(const char *buf, int cnt, int expedited) { LOGDEB2(("NetconData::send: fd %d cnt %d expe %d\n", m_fd, cnt, expedited)); int flag = 0; if (m_fd < 0) { LOGERR(("NetconData::send: connection not opened\n")); return -1; } if (expedited) { LOGDEB2(("NetconData::send: expedited data, count %d bytes\n", cnt)); flag = MSG_OOB; } int ret; // There is a bug in the uthread version of sendto() in FreeBSD at // least up to 2.2.7, so avoid using it when possible if (flag) ret = ::send(m_fd, buf, cnt, flag); else ret = ::write(m_fd, buf, cnt); // Note: byte count may be different from cnt if fd is non-blocking if (ret < 0) { char fdcbuf[20];sprintf(fdcbuf, "%d", m_fd); LOGSYSERR("NetconData::send", "send", fdcbuf); } return ret; } // Test for data available int NetconData::readready() { LOGDEB2(("NetconData::readready\n")); if (m_fd < 0) { LOGERR(("NetconData::readready: connection not opened\n")); return -1; } return select1(m_fd, 0); } // Test for writable int NetconData::writeready() { LOGDEB2(("NetconData::writeready\n")); if (m_fd < 0) { LOGERR(("NetconData::writeready: connection not opened\n")); return -1; } return select1(m_fd, 0, 1); } // Receive at most cnt bytes (maybe less) int NetconData::receive(char *buf, int cnt, int timeo) { LOGDEB2(("NetconData::receive: cnt %d timeo %d m_buf 0x%x m_bufbytes %d\n", cnt, timeo, m_buf, m_bufbytes)); if (m_fd < 0) { LOGERR(("NetconData::receive: connection not opened\n")); return -1; } int fromibuf = 0; // Get whatever might have been left in the buffer by a previous // getline, except if we're called to fill the buffer of course if (m_buf && m_bufbytes > 0 && (buf < m_buf || buf > m_buf + m_bufsize)) { fromibuf = MIN(m_bufbytes, cnt); memcpy(buf, m_bufbase, fromibuf); m_bufbytes -= fromibuf; m_bufbase += fromibuf; cnt -= fromibuf; LOGDEB2(("NetconData::receive: transferred %d from mbuf\n", fromibuf)); if (cnt <= 0) return fromibuf; } if (timeo > 0) { int ret = select1(m_fd, timeo); if (ret == 0) { LOGDEB2(("NetconData::receive timed out\n")); m_didtimo = 1; return -1; } if (ret < 0) { LOGSYSERR("NetconData::receive", "select", ""); return -1; } } m_didtimo = 0; if ((cnt = read(m_fd, buf + fromibuf, cnt)) < 0) { char fdcbuf[20];sprintf(fdcbuf, "%d", m_fd); LOGSYSERR("NetconData::receive", "read", fdcbuf); return -1; } LOGDEB2(("NetconData::receive: normal return, cnt %d\n", cnt)); return fromibuf + cnt; } // Receive exactly cnt bytes (except for timeout) int NetconData::doreceive(char *buf, int cnt, int timeo) { int got, cur; LOGDEB2(("Netcon::doreceive: cnt %d, timeo %d\n", cnt, timeo)); cur = 0; while (cnt > cur) { got = receive(buf, cnt-cur, timeo); LOGDEB2(("Netcon::doreceive: got %d\n", got)); if (got < 0) { return -1; } if (got == 0) { return cur; } cur += got; buf += got; } return cur; } // Read data until cnt-1 characters are read or a newline is found. Add // null char at end of buffer and return. // As we don't know where the newline will be and it would be inefficient to // read a character at a time, we use a buffer // Unlike fgets, we return an integer status: // >0: number of characters returned, not including the final 0 // 0: EOF reached, no chars transferred // -1: error static const int defbufsize = 200; int NetconData::getline(char *buf, int cnt, int timeo) { LOGDEB2(("NetconData::getline: cnt %d, timeo %d\n", cnt, timeo)); if (m_buf == 0) { if ((m_buf = (char *)malloc(defbufsize)) == 0) { LOGSYSERR("NetconData::getline: Out of mem", "malloc", ""); return -1; } m_bufsize = defbufsize; m_bufbase = m_buf; m_bufbytes = 0; } char *cp = buf; for (;;) { // Transfer from buffer. Have to take a lot of care to keep counts and // pointers consistant in all end cases int maxtransf = MIN(m_bufbytes, cnt-1); int nn = maxtransf; LOGDEB2(("Before loop, bufbytes %d, maxtransf %d, nn: %d\n", m_bufbytes, maxtransf, nn)); for (nn = maxtransf; nn > 0;) { // This is not pretty but we want nn to be decremented for // each byte copied (even newline), and not become -1 if // we go to the end. Better ways welcome! nn--; if ((*cp++ = *m_bufbase++) == '\n') break; } // Update counts maxtransf -= nn; // Actual count transferred m_bufbytes -= maxtransf; cnt -= maxtransf; LOGDEB2(("After transfer: actual transf %d cnt %d, m_bufbytes %d\n", maxtransf, cnt, m_bufbytes)); // Finished ? if (cnt <= 1 || (cp > buf && cp[-1] == '\n')) { *cp = 0; return cp - buf; } // Transfer from net m_bufbase = m_buf; m_bufbytes = receive(m_buf, m_bufsize, timeo); if (m_bufbytes == 0) { // EOF *cp = 0; return cp - buf; } if (m_bufbytes < 0) { m_bufbytes = 0; *cp = 0; return -1; } } } // Called when selectloop detects that data can be read or written on // the connection. The user callback would normally have been set // up. If it is, call it and return. Else, perform housecleaning: read // and discard. int NetconData::cando(Netcon::Event reason) { LOGDEB2(("NetconData::cando\n")); if (!m_user.isNull()) { return m_user->data(this, reason); } // No user callback. Clean up by ourselves if (reason & NETCONPOLL_READ) { #define BS 200 char buf[BS]; int n; if ((n = receive(buf, BS)) < 0) { LOGSYSERR("NetconData::cando", "receive", ""); return -1; } if (n == 0) { // EOF return 0; } } clearselevents(NETCONPOLL_WRITE); return 1; } /////////////////////////////////////////////////////////////////////// // Methods for a client connection (NetconCli) int NetconCli::openconn(const char *host, unsigned int port, int timeo) { int ret = -1; LOGDEB2(("Netconcli::openconn: host %s, port %d\n", host, port)); closeconn(); struct sockaddr_in saddr; memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons(port); // Server name may be host name or IP address int addr; if ((addr = inet_addr(host)) != -1) { memcpy(&saddr.sin_addr, &addr, sizeof(addr)); } else { struct hostent *hp; if ((hp = gethostbyname(host)) == 0) { LOGERR(("NetconCli::openconn: gethostbyname(%s) failed\n", host)); return -1; } memcpy(&saddr.sin_addr, hp->h_addr, hp->h_length); } if ((m_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { LOGSYSERR("NetconCli::openconn", "socket", ""); return -1; } if (timeo > 0) set_nonblock(1); if(connect(m_fd,(struct sockaddr *) &saddr, sizeof(saddr)) < 0) { if (timeo > 0) { if (errno != EINPROGRESS) goto out; if (select1(m_fd, timeo, 1) == 1) goto connectok; } if (m_silentconnectfailure == 0) { LOGSYSERR("NetconCli", "connect", ""); } goto out; } connectok: if (timeo > 0) set_nonblock(0); LOGDEB2(("NetconCli::connect: setting keepalive\n")); if (setsockopt(m_fd, SOL_SOCKET, SO_KEEPALIVE, (char *)&one, sizeof(one)) < 0) { LOGSYSERR("NetconCli::connect", "setsockopt", "KEEPALIVE"); } setpeer(host); LOGDEB2(("NetconCli::openconn: connection opened ok\n")); ret = 0; out: if (ret < 0) closeconn(); return ret; } // Same as previous, but get the port number from services int NetconCli::openconn(const char *host, char *serv, int timeo) { LOGDEB2(("Netconcli::openconn: host %s, serv %s\n", host, serv)); struct servent *sp; if ((sp = getservbyname(serv, "tcp")) == 0) { LOGERR(("NetconCli::openconn: getservbyname failed for %s\n", serv)); return -1; } // Callee expects the port number in host byte order return openconn(host, ntohs(sp->s_port), timeo); } int NetconCli::setconn(int fd) { LOGDEB2(("Netconcli::setconn: fd %d\n", fd)); closeconn(); m_fd = fd; m_ownfd = false; setpeer(""); return 0; } /////////////////////////////////////////////////////////////////////// // Methods for the main (listening) server connection NetconServLis::~NetconServLis() { #ifdef NETCON_ACCESSCONTROL freeZ(okaddrs.intarray); freeZ(okmasks.intarray); #endif } #if 0 // code for dumping a struct servent static void dump_servent(struct servent *servp) { fprintf(stderr, "Official name %s\n", servp->s_name); for (char **cpp = servp->s_aliases;*cpp;cpp++) fprintf(stderr, "Nickname %s\n", *cpp); fprintf(stderr, "Port %d\n", (int)ntohs((short)servp->s_port)); fprintf(stderr, "Proto %s\n", servp->s_proto); } #endif // Set up service. int NetconServLis::openservice(char *serv, int backlog) { int port; struct servent *servp; LOGDEB1(("NetconServLis::openservice: serv %s\n", serv)); #ifdef NETCON_ACCESSCONTROL if (initperms(serv) < 0) return -1; #endif if ((servp = getservbyname(serv, "tcp")) == 0) { LOGERR(("NetconServLis::openservice: getservbyname failed for %s\n",serv)); return -1; } port = (int)ntohs((short)servp->s_port); return openservice(port, backlog); } // Port is a natural host integer value int NetconServLis::openservice(int port, int backlog) { LOGDEB1(("NetconServLis::openservice: port %d\n", port)); #ifdef NETCON_ACCESSCONTROL if (initperms(port) < 0) return -1; #endif int ret = -1; struct sockaddr_in ipaddr; if ((m_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { LOGSYSERR("NetconServLis", "socket", ""); return -1; } (void) setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR,(char *)&one, sizeof(one)); #ifdef SO_REUSEPORT (void) setsockopt(m_fd, SOL_SOCKET, SO_REUSEPORT,(char *)&one, sizeof(one)); #endif /*SO_REUSEPORT*/ memset(&ipaddr, 0, sizeof(ipaddr)); ipaddr.sin_family = AF_INET; ipaddr.sin_addr.s_addr = htonl(INADDR_ANY); ipaddr.sin_port = htons((short)port); if (bind(m_fd, (struct sockaddr *)&ipaddr, sizeof(ipaddr)) < 0){ LOGSYSERR("NetconServLis", "bind", ""); goto out; } if (listen(m_fd, backlog) < 0) { LOGSYSERR("NetconServLis", "listen", ""); goto out; } LOGDEB1(("NetconServLis::openservice: service opened ok\n")); ret = 0; out: if (ret < 0 && m_fd >= 0) { close(m_fd); m_fd = -1; } return ret; } #ifdef NETCON_ACCESSCONTROL int NetconServLis::initperms(int port) { if (permsinit) return 0; char sport[30]; sprintf(sport, "%d", port); return initperms(sport); } // Get authorized address lists from parameter file. This is disabled for now int NetconServLis::initperms(char *serv) { if (permsinit) return 0; if (serv == 0 || *serv == 0 || strlen(serv) > 80) { LOGERR(("NetconServLis::initperms: bad service name %s\n", serv)); return -1; } char keyname[100]; sprintf(keyname, "%s_okaddrs", serv); if (genparams->getparam(keyname, &okaddrs, 1) < 0) { serv = "default"; sprintf(keyname, "%s_okaddrs", serv); if (genparams->getparam(keyname, &okaddrs) < 0) { LOGERR(("NetconServLis::initperms: no okaddrs found in config file\n")); return -1; } } sprintf(keyname, "%s_okmasks", serv); if (genparams->getparam(keyname, &okmasks)) { LOGERR(("NetconServLis::initperms: okmasks not found\n")); return -1; } if (okaddrs.len == 0 || okmasks.len == 0) { LOGERR(("NetconServLis::initperms: len 0 for okmasks or okaddrs\n")); return -1; } permsinit = 1; return 0; } #endif /* NETCON_ACCESSCONTROL */ // Sample cando routine for server master connection: delete newly // accepted connection. What else ? // This is to be overriden by a derived class method for an application // using the selectloop thing int NetconServLis::cando(Netcon::Event reason) { delete accept(); return 1; } NetconServCon * NetconServLis::accept(int timeo) { LOGDEB(("NetconServLis::accept\n")); if (timeo > 0) { int ret = select1(m_fd, timeo); if (ret == 0) { LOGDEB2(("NetconServLis::accept timed out\n")); m_didtimo = 1; return 0; } if (ret < 0) { LOGSYSERR("NetconServLis::accept", "select", ""); return 0; } } m_didtimo = 0; NetconServCon *con = 0; int newfd = -1; struct sockaddr_in who; SOCKLEN_T clilen = (SOCKLEN_T)sizeof(who); if ((newfd = ::accept(m_fd, (struct sockaddr *)&who, &clilen)) < 0) { LOGSYSERR("NetconServCon::accept", "accept", ""); goto out; } #ifdef NETCON_ACCESSCONTROL if (checkperms(&who, clilen) < 0) { goto out; } #endif con = new NetconServCon(newfd); if (con == 0) { LOGERR(("NetconServLis::accept: new NetconServCon failed\n")); goto out; } // Retrieve peer's host name. Errors are non fatal struct hostent *hp; if ((hp = gethostbyaddr((char *)&(who.sin_addr), sizeof(struct in_addr), AF_INET)) == 0) { LOGERR(("NetconServLis::accept: gethostbyaddr failed for addr 0x%lx\n", who.sin_addr.s_addr)); con->setpeer(inet_ntoa(who.sin_addr)); } else { con->setpeer(hp->h_name); } LOGDEB2(("NetconServLis::accept: setting keepalive\n")); if (setsockopt(newfd, SOL_SOCKET, SO_KEEPALIVE, (char *)&one, sizeof(one)) < 0) { LOGSYSERR("NetconServLis::accept", "setsockopt", "KEEPALIVE"); } LOGDEB2(("NetconServLis::accept: got connect from %s\n", con->getpeer())); out: if (con == 0 && newfd >= 0) close(newfd); return con; } #ifdef NETCON_ACCESSCONTROL int NetconServLis::checkperms(void *cl, int) { // If okmasks and addrs were not initialized, the default is allow to all if (okmasks.len <= 0 || okaddrs.len <= 0) return 0; struct sockaddr *addr = (struct sockaddr *)cl; unsigned long ip_addr; if (addr->sa_family != AF_INET) { LOGERR(("NetconServLis::checkperms: connection from non-INET addr !\n")); return -1; } ip_addr = ntohl(((struct sockaddr_in *)addr)->sin_addr.s_addr); LOGDEB2(("checkperms: ip_addr: 0x%x\n", ip_addr)); for (int i = 0; i < okaddrs.len; i++) { unsigned int mask; if (i < okmasks.len) mask = okmasks.intarray[i]; else mask = okmasks.intarray[okmasks.len-1]; LOGDEB2(("checkperms: trying okaddr 0x%x, mask 0x%x\n", okaddrs.intarray[i], mask)); if ((ip_addr & mask) == (okaddrs.intarray[i] & mask)) return (0); } LOGERR(("NetconServLis::checkperm: connection from bad address 0x%x\n", ip_addr)); return -1; } #endif /* NETCON_ACCESSCONTROL */ #else /* !TEST_NETCON */ ///////////////////////////////////////////////////////////////////////// ////////// TEST DRIVER //////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include "debuglog.h" #include "netcon.h" static char *thisprog; static char usage[] = "-c : Connects to trnetcon server, exchange message, then\n" " sleeps 10 S, except if option -n is given (sleep forever)\n" "\n" "-s : open service \n" ; static void Usage() { fprintf(stderr, "Usage : %s:\n %s", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_s 0x2 /* Server */ #define OPT_c 0x4 /* Client */ #define OPT_n 0x8 /* Client sleeps forever */ extern int trycli(char *host, char *serv); extern int tryserv(char *serv); int nloop = 10; int main(int argc, char **argv) { char *host, *serv; 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 'c': op_flags |= OPT_c; break; case 'n': op_flags |= OPT_n; break; default: Usage(); break; } argc--; argv++; } DebugLog::setfilename("stderr"); DebugLog::getdbl()->setloglevel(DEBDEB2); if (op_flags & OPT_c) { if (argc != 2) { Usage(); } host = *argv++;argc--; serv = *argv++;argc--; exit(trycli(host, serv)); } else if (op_flags & OPT_s) { if (argc != 1) { Usage(); } serv = *argv++;argc--; exit(tryserv(serv)); } else { Usage(); } } static char buf[1024]; static int buflen = 1023; static char fromcli[200]; class CliNetconWorker : public NetconWorker { public: CliNetconWorker() : m_count(0) {} int data(NetconData *con, Netcon::Event reason) { LOGDEB(("clientdata\n")); if (reason & Netcon::NETCONPOLL_WRITE) { sprintf(fromcli, "Bonjour Bonjour client %d, count %d", getpid(), m_count); con->setselevents(Netcon::NETCONPOLL_READ); if (con->send(fromcli, strlen(fromcli) + 1) < 0) { fprintf(stderr, "send failed\n"); return -1; } m_count++; } if (reason & Netcon::NETCONPOLL_READ) { con->setselevents(Netcon::NETCONPOLL_WRITE); int n; if ((n = con->receive(buf, buflen)) < 0) { fprintf(stderr, "receive failed\n"); return -1; } if (n == 0) { // EOF, close connection return -1; } buf[n] = 0; fprintf(stderr, "%d received \"%s\"\n", getpid(), buf); if (op_flags & OPT_n) { pause(); } else { sleep(1); } } if (m_count >= 10) { fprintf(stderr, "Did 10, enough\n"); if (con->getloop()) con->getloop()->loopReturn(0); } return 0; } private: int m_count; }; int trycli(char *host, char *serv) { sprintf(fromcli, "Bonjour Bonjour je suis le client %d", getpid()); NetconCli *clicon = new NetconCli(); NetconP con(clicon); if (con.isNull()) { fprintf(stderr, "new NetconCli failed\n"); return 1; } if (clicon->openconn(host, serv) < 0) { fprintf(stderr, "openconn(%s, %s) failed\n", host, serv); return 1; } fprintf(stderr, "openconn(%s, %s) ok\n", host, serv); #ifdef NOSELLOOP for (int i = 0;i < nloop;i++) { if (con->send(fromcli, strlen(fromcli) + 1) < 0) { fprintf(stderr, "%d: Send failed\n", getpid()); return 1; } if (con->receive(buf, buflen) < 0) { perror("receive:"); fprintf(stderr, "%d: Receive failed\n", getpid()); return 1; } fprintf(stderr, "%d Received \"%s\"\n", getpid(), buf); if (op_flags & OPT_n) { pause(); } else { sleep(1); } } #else RefCntr worker = RefCntr(new CliNetconWorker()); clicon->setcallback(worker); SelectLoop myloop; myloop.addselcon(con, Netcon::NETCONPOLL_WRITE); fprintf(stderr, "client ready\n"); int ret = myloop.doLoop(); if (ret < 0) { fprintf(stderr, "selectloop failed\n"); exit(1); } fprintf(stderr, "selectloop returned %d\n", ret); #endif return 0; } ////////////////////////////////////////////////////////////////// // Server-side sample code class ServNetconWorker : public NetconWorker { public: ServNetconWorker() : m_count(0) {} int data(NetconData *con, Netcon::Event reason) { LOGDEB(("serverdata\n")); if (reason & Netcon::NETCONPOLL_WRITE) { con->setselevents(Netcon::NETCONPOLL_READ); char fromserv[200]; sprintf(fromserv, "Du serveur: mon fd pour ce client est %d, mon compte %d", con->getfd(), ++m_count); if (con->send(fromserv, strlen(fromserv) + 1) < 0) { fprintf(stderr, "send failed\n"); return -1; } } if (reason & Netcon::NETCONPOLL_READ) { #define LL 200 char buf[LL+1]; int n; if ((n = con->receive(buf, LL)) < 0) { fprintf(stderr, "receive failed\n"); return -1; } if (n == 0) { return -1; } buf[n] = 0; fprintf(stderr, "%d received \"%s\"\n", getpid(), buf); con->setselevents(Netcon::NETCONPOLL_READ|Netcon::NETCONPOLL_WRITE); } return 0; } private: int m_count; }; class MyNetconServLis : public NetconServLis { public: MyNetconServLis(SelectLoop &loop) : NetconServLis(), m_loop(loop) { } protected: int cando(Netcon::Event reason) { NetconServCon *con = accept(); if (con == 0) return -1; RefCntr worker = RefCntr(new ServNetconWorker()); con->setcallback(worker); m_loop.addselcon(NetconP(con), NETCONPOLL_READ); return 1; } SelectLoop& m_loop; }; NetconP lis; void onexit(int sig) { fprintf(stderr, "Onexit: "); if (sig == SIGQUIT) kill(getpid(), SIGKILL); fprintf(stderr, "Exiting\n"); exit(0); } int tryserv(char *serv) { signal(SIGCHLD, SIG_IGN); SelectLoop myloop; MyNetconServLis *servlis = new MyNetconServLis(myloop); lis = NetconP(servlis); if (lis.isNull()) { fprintf(stderr, "new NetconServLis failed\n"); return 1; } // Prepare for cleanup struct sigaction sa; sa.sa_flags = 0; sa.sa_handler = onexit; sigemptyset(&sa.sa_mask); sigaction(SIGINT, &sa, 0); sigaction(SIGQUIT, &sa, 0); sigaction(SIGTERM, &sa, 0); if (servlis->openservice(serv) < 0) { fprintf(stderr, "openservice(%s) failed\n", serv); return 1; } myloop.addselcon(lis, Netcon::NETCONPOLL_READ); fprintf(stderr, "openservice(%s) Ok\n", serv); if (myloop.doLoop() < 0) { fprintf(stderr, "selectloop failed\n"); exit(1); } return 0; } #endif /* TEST_NETCON */ recoll-1.17.3/utils/netcon.h000644 001750 000000 00000030753 11740755063 016303 0ustar00dockeswheel000000 000000 #ifndef _NETCON_H_ #define _NETCON_H_ /* Copyright (C) 2002 Jean-Francois 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 "refcntr.h" using std::map; /// A set of classes to manage client-server communication over a /// connection-oriented network, or a pipe. /// /// The listening/connection-accepting code currently only uses /// TCP. The classes include client-side and server-side (accepting) /// endpoints. Netcon also has server-side static code to handle a set /// of client connections in parallel. This should be moved to a /// friend class. /// /// The client data transfer class can also be used for /// timeout-protected/asynchronous io using a given fd (ie a pipe /// descriptor) /// Base class for all network endpoints: class Netcon; typedef RefCntr NetconP; class SelectLoop; class Netcon { public: enum Event {NETCONPOLL_READ = 0x1, NETCONPOLL_WRITE=0x2}; Netcon() : m_peer(0), m_fd(-1), m_ownfd(true), m_didtimo(0), m_wantedEvents(0), m_loop(0) {} virtual ~Netcon(); /// Remember whom we're talking to. We let external code do this because /// the application may have a non-dns method to find the peer name. virtual void setpeer(const char *hostname); /// Retrieve the peer's hostname. Only works if it was set before ! virtual const char *getpeer() { return m_peer ? (const char *)m_peer : "none"; } /// Set or reset the TCP_NODELAY option. virtual int settcpnodelay(int on = 1); /// Did the last receive() call time out ? Resets the flag. virtual int timedout() {int s = m_didtimo; m_didtimo = 0; return s;} /// Return string version of last syscall error virtual char *sterror(); /// Return the socket descriptor virtual int getfd() {return m_fd;} /// Close the current connection if it is open virtual void closeconn(); /// Set/reset the non-blocking flag on the underlying fd. Returns /// prev state The default is that sockets are blocking except /// when added to the selectloop, or, transparently, to handle /// connection timeout issues. virtual int set_nonblock(int onoff); /// Decide what events the connection will be looking for /// (NETCONPOLL_READ, NETCONPOLL_WRITE) int setselevents(int evs) {return m_wantedEvents = evs;} /// Retrieve the connection's currently monitored set of events int getselevents() {return m_wantedEvents;} /// Add events to current set int addselevents(int evs) {return m_wantedEvents |= evs;} /// Clear events from current set int clearselevents(int evs) {return m_wantedEvents &= ~evs;} friend class SelectLoop; SelectLoop *getloop() {return m_loop;} /// Utility function for a simplified select() interface: check one fd /// for reading or writing, for a specified maximum number of seconds. static int select1(int fd, int secs, int writing = 0); protected: char *m_peer; // Name of the connected host int m_fd; bool m_ownfd; int m_didtimo; // Used when part of the selectloop map. short m_wantedEvents; SelectLoop *m_loop; // Method called by the selectloop when something can be done with a netcon virtual int cando(Netcon::Event reason) = 0; // Called when added to loop virtual void setloop(SelectLoop *loop) {m_loop = loop;} }; /// The selectloop interface is used to implement parallel servers. // The select loop mechanism allows several netcons to be used for io // in a program without blocking as long as there is data to be read // or written. In a multithread program which is also using select, it // would typically make sense to have one SelectLoop active per // thread. class SelectLoop { public: SelectLoop() : m_selectloopDoReturn(false), m_selectloopReturnValue(0), m_placetostart(0), m_periodichandler(0), m_periodicparam(0), m_periodicmillis(0) {} /// Loop waiting for events on the connections and call the /// cando() method on the object when something happens (this will in /// turn typically call the app callback set on the netcon). Possibly /// call the periodic handler (if set) at regular intervals. /// @return -1 for error. 0 if no descriptors left for i/o. 1 for periodic /// timeout (should call back in after processing) int doLoop(); /// Call from data handler: make selectloop return the param value void loopReturn(int value) { m_selectloopDoReturn = true; m_selectloopReturnValue = value; } /// Add a connection to be monitored (this will usually be called /// from the server's listen connection's accept callback) int addselcon(NetconP con, int events); /// Remove a connection from the monitored set. This is /// automatically called when EOF is detected on a connection. int remselcon(NetconP con); /// Set a function to be called periodically, or a time before return. /// @param handler the function to be called. /// - if it is 0, selectloop() will return after ms mS (and can be called /// again /// - if it is not 0, it will be called at ms mS intervals. If its return /// value is <= 0, selectloop will return. /// @param clp client data to be passed to handler at every call. /// @param ms milliseconds interval between handler calls or /// before return. Set to 0 for no periodic handler. void setperiodichandler(int (*handler)(void *), void *clp, int ms); private: // Set by client callback to tell selectloop to return. bool m_selectloopDoReturn; int m_selectloopReturnValue; int m_placetostart; // Map of NetconP indexed by fd map m_polldata; // The last time we did the periodic thing. Initialized by setperiodic() struct timeval m_lasthdlcall; // The call back function and its parameter int (*m_periodichandler)(void *); void *m_periodicparam; // The periodic interval int m_periodicmillis; void periodictimeout(struct timeval *tv); int maybecallperiodic(); }; /////////////////////// class NetconData; /// Class for the application callback routine (when in selectloop). /// /// This is set by the app on the NetconData by calling /// setcallback(). It is then called from the NetconData's cando() /// routine, itself called by selectloop. /// /// It would be nicer to override cando() in a subclass instead of /// setting a callback, but this can't be done conveniently because /// accept() always creates a base NetconData (another approach would /// be to pass a factory function to the listener, to create /// NetconData derived classes). class NetconWorker { public: virtual ~NetconWorker() {} virtual int data(NetconData *con, Netcon::Event reason) = 0; }; /// Base class for connections that actually transfer data. T class NetconData : public Netcon { public: NetconData() : m_buf(0), m_bufbase(0), m_bufbytes(0), m_bufsize(0) {} virtual ~NetconData(); /// Write data to the connection. /// @param buf the data buffer /// @param cnt the number of bytes we should try to send /// @param expedited send data in as 'expedited' data. /// @return the count of bytes actually transferred, -1 if an /// error occurred. virtual int send(const char *buf, int cnt, int expedited = 0); /// Read from the connection /// @param buf the data buffer /// @param cnt the number of bytes we should try to read (but we return /// as soon as we get data) /// @param timeo maximum number of seconds we should be waiting for data. /// @return the count of bytes actually read. 0 for timeout (call /// didtimo() to discriminate from EOF). -1 if an error occurred. virtual int receive(char *buf, int cnt, int timeo = -1); /// Loop on receive until cnt bytes are actually read or a timeout occurs virtual int doreceive(char *buf, int cnt, int timeo = -1); /// Check for data being available for reading virtual int readready(); /// Check for data being available for writing virtual int writeready(); /// Read a line of text on an ascii connection virtual int getline(char *buf, int cnt, int timeo = -1); /// Set handler to be called when the connection is placed in the /// selectloop and an event occurs. virtual void setcallback(RefCntr user) {m_user = user;} private: char *m_buf; // Buffer. Only used when doing getline()s char *m_bufbase; // Pointer to current 1st byte of useful data int m_bufbytes; // Bytes of data. int m_bufsize; // Total buffer size RefCntr m_user; virtual int cando(Netcon::Event reason); // Selectloop slot }; /// Network endpoint, client side. class NetconCli : public NetconData { public: NetconCli(int silent = 0) {m_silentconnectfailure = silent;} /// Open connection to specified host and named service. int openconn(const char *host, char *serv, int timeo = -1); /// Open connection to specified host and numeric port. port is in /// HOST byte order int openconn(const char *host, unsigned int port, int timeo = -1); /// Reuse existing fd. /// We DONT take ownership of the fd, and do no closin' EVEN on an /// explicit closeconn() or setconn() (use getfd(), close, /// setconn(-1) if you need to really close the fd and have no /// other copy). int setconn(int fd); /// Do not log message if openconn() fails. void setSilentFail(int onoff) {m_silentconnectfailure = onoff;} private: int m_silentconnectfailure; // No logging of connection failures if set }; class NetconServCon; #ifdef NETCON_ACCESSCONTROL struct intarrayparam { int len; unsigned int *intarray; }; #endif /* NETCON_ACCESSCONTROL */ /// Server listening end point. /// /// if NETCON_ACCESSCONTROL is defined during compilation, /// NetconServLis has primitive access control features: okaddrs holds /// the host addresses for the hosts which we allow to connect to /// us. okmasks holds the masks to be used for comparison. okmasks /// can be shorter than okaddrs, in which case we use the last entry /// for all addrs beyond the masks array length. Both arrays are /// retrieved from the configuration file when we create the endpoint /// the key is either based on the service name (ex: cdpathdb_okaddrs, /// cdpathdb_okmasks), or "default" if the service name is not found /// (ex: default_okaddrs, default_okmasks) class NetconServLis : public Netcon { public: NetconServLis() { #ifdef NETCON_ACCESSCONTROL permsinit = 0; okaddrs.len = okmasks.len = 0; okaddrs.intarray = okmasks.intarray = 0; #endif /* NETCON_ACCESSCONTROL */ } ~NetconServLis(); /// Open named service. int openservice(char *serv, int backlog = 10); /// Open service by port number. int openservice(int port, int backlog = 10); /// Wait for incoming connection. Returned connected Netcon NetconServCon *accept(int timeo = -1); protected: /// This should be overriden in a derived class to handle incoming /// connections. It will usually call NetconServLis::accept(), and /// insert the new connection in the selectloop. virtual int cando(Netcon::Event reason); private: #ifdef NETCON_ACCESSCONTROL int permsinit; struct intarrayparam okaddrs; struct intarrayparam okmasks; int initperms(char *servicename); int initperms(int port); int checkperms(void *cli, int clilen); #endif /* NETCON_ACCESSCONTROL */ }; /// Server-side accepted client connection. The only specific code /// allows closing the listening endpoint in the child process (in the /// case of a forking server) class NetconServCon : public NetconData { public: NetconServCon(int newfd, Netcon* lis = 0) { m_liscon = lis; m_fd = newfd; } /// This is for forked servers that want to get rid of the main socket void closeLisCon() { if (m_liscon) m_liscon->closeconn(); } private: Netcon* m_liscon; }; #endif /* _NETCON_H_ */ recoll-1.17.3/utils/pathut.cpp000644 001750 000000 00000041350 11746577216 016660 0ustar00dockeswheel000000 000000 /* 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_PATHUT #include "autoconfig.h" #include #include #include #include #include #include #include #include #include #include // Let's include all files where statfs can be defined and hope for no // conflict... #ifdef HAVE_SYS_MOUNT_H #include #endif #ifdef HAVE_SYS_STATFS_H #include #endif #ifdef HAVE_SYS_STATVFS_H #include #endif #ifdef HAVE_SYS_VFS_H #include #endif #include #include #include #include #include #ifndef NO_NAMESPACES using std::string; using std::list; using std::stack; #endif /* NO_NAMESPACES */ #include "pathut.h" #include "transcode.h" #include "wipedir.h" #include "md5.h" bool fsocc(const string &path, int *pc, long *blocks) { #ifdef sun struct statvfs buf; if (statvfs(path.c_str(), &buf) != 0) { return false; } #else struct statfs buf; if (statfs(path.c_str(), &buf) != 0) { return false; } #endif // used blocks double fpc = 0.0; #define FSOCC_USED (double(buf.f_blocks - buf.f_bfree)) #define FSOCC_TOTAVAIL (FSOCC_USED + double(buf.f_bavail)) if (FSOCC_TOTAVAIL > 0) { fpc = 100.0 * FSOCC_USED / FSOCC_TOTAVAIL; } *pc = int(fpc); if (blocks) { *blocks = 0; #define FSOCC_MB (1024*1024) if (buf.f_bsize > 0) { int ratio = buf.f_bsize > FSOCC_MB ? buf.f_bsize / FSOCC_MB : FSOCC_MB / buf.f_bsize; *blocks = buf.f_bsize > FSOCC_MB ? long(buf.f_bavail) * ratio : long(buf.f_bavail) / ratio; } } return true; } static const char *tmplocation() { const char *tmpdir = getenv("RECOLL_TMPDIR"); if (!tmpdir) tmpdir = getenv("TMPDIR"); if (!tmpdir) tmpdir = "/tmp"; return tmpdir; } bool maketmpdir(string& tdir, string& reason) { tdir = path_cat(tmplocation(), "rcltmpXXXXXX"); char *cp = strdup(tdir.c_str()); if (!cp) { reason = "maketmpdir: out of memory (for file name !)\n"; tdir.erase(); return false; } if (! #ifdef HAVE_MKDTEMP mkdtemp(cp) #else mktemp(cp) #endif // HAVE_MKDTEMP ) { free(cp); reason = "maketmpdir: mktemp failed for [" + tdir + "] : " + strerror(errno); tdir.erase(); return false; } tdir = cp; free(cp); #ifndef HAVE_MKDTEMP if (mkdir(tdir.c_str(), 0700) < 0) { reason = string("maketmpdir: mkdir ") + tdir + " failed"; tdir.erase(); return false; } #endif return true; } TempFileInternal::TempFileInternal(const string& suffix) { string filename = path_cat(tmplocation(), "rcltmpfXXXXXX"); char *cp = strdup(filename.c_str()); if (!cp) { m_reason = "Out of memory (for file name !)\n"; return; } // Yes using mkstemp this way is awful (bot the suffix adding and // using mkstemp() just to avoid the warnings) int fd; if ((fd = mkstemp(cp)) < 0) { free(cp); m_reason = "TempFileInternal: mkstemp failed\n"; return; } close(fd); unlink(cp); filename = cp; free(cp); m_filename = filename + suffix; if (close(open(m_filename.c_str(), O_CREAT|O_EXCL, 0600)) != 0) { m_reason = string("Could not open/create") + m_filename; m_filename.erase(); } } TempFileInternal::~TempFileInternal() { if (!m_filename.empty()) unlink(m_filename.c_str()); } TempDir::TempDir() { if (!maketmpdir(m_dirname, m_reason)) { m_dirname.erase(); return; } } TempDir::~TempDir() { if (!m_dirname.empty()) { (void)wipedir(m_dirname, true, true); m_dirname.erase(); } } bool TempDir::wipe() { if (m_dirname.empty()) { m_reason = "TempDir::wipe: no directory !\n"; return false; } if (wipedir(m_dirname, false, true)) { m_reason = "TempDir::wipe: wipedir failed\n"; return false; } return true; } void path_catslash(string &s) { if (s.empty() || s[s.length() - 1] != '/') s += '/'; } string path_cat(const string &s1, const string &s2) { string res = s1; path_catslash(res); res += s2; return res; } string path_getfather(const string &s) { string father = s; // ?? if (father.empty()) return "./"; if (father[father.length() - 1] == '/') { // Input ends with /. Strip it, handle special case for root if (father.length() == 1) return father; father.erase(father.length()-1); } string::size_type slp = father.rfind('/'); if (slp == string::npos) return "./"; father.erase(slp); path_catslash(father); return father; } string path_getsimple(const string &s) { string simple = s; if (simple.empty()) return simple; string::size_type slp = simple.rfind('/'); if (slp == string::npos) return simple; simple.erase(0, slp+1); return simple; } string path_basename(const string &s, const string &suff) { string simple = path_getsimple(s); string::size_type pos = string::npos; if (suff.length() && simple.length() > suff.length()) { pos = simple.rfind(suff); if (pos != string::npos && pos + suff.length() == simple.length()) return simple.substr(0, pos); } return simple; } string path_home() { uid_t uid = getuid(); struct passwd *entry = getpwuid(uid); if (entry == 0) { const char *cp = getenv("HOME"); if (cp) return cp; else return "/"; } string homedir = entry->pw_dir; path_catslash(homedir); return homedir; } extern string path_tildexpand(const string &s) { if (s.empty() || s[0] != '~') return s; string o = s; if (s.length() == 1) { o.replace(0, 1, path_home()); } else if (s[1] == '/') { o.replace(0, 2, path_home()); } else { string::size_type pos = s.find('/'); int l = (pos == string::npos) ? s.length() - 1 : pos - 1; struct passwd *entry = getpwnam(s.substr(1, l).c_str()); if (entry) o.replace(0, l+1, entry->pw_dir); } return o; } extern string path_absolute(const string &is) { if (is.length() == 0) return is; string s = is; if (s[0] != '/') { char buf[MAXPATHLEN]; if (!getcwd(buf, MAXPATHLEN)) { return string(); } s = path_cat(string(buf), s); } return s; } #include extern string path_canon(const string &is) { if (is.length() == 0) return is; string s = is; if (s[0] != '/') { char buf[MAXPATHLEN]; if (!getcwd(buf, MAXPATHLEN)) { return string(); } s = path_cat(string(buf), s); } vector elems; stringToTokens(s, elems, "/"); vector cleaned; for (vector::const_iterator it = elems.begin(); it != elems.end(); it++){ if (*it == "..") { if (!cleaned.empty()) cleaned.pop_back(); } else if (it->empty() || *it == ".") { } else { cleaned.push_back(*it); } } string ret; if (!cleaned.empty()) { for (vector::const_iterator it = cleaned.begin(); it != cleaned.end(); it++) { ret += "/"; ret += *it; } } else { ret = "/"; } return ret; } #include #include list path_dirglob(const string &dir, const string pattern) { list res; glob_t mglob; string mypat=path_cat(dir, pattern); if (glob(mypat.c_str(), 0, 0, &mglob)) { return res; } for (int i = 0; i < int(mglob.gl_pathc); i++) { res.push_back(mglob.gl_pathv[i]); } globfree(&mglob); return res; } bool path_isdir(const string& path) { struct stat st; if (lstat(path.c_str(), &st) < 0) return false; if (S_ISDIR(st.st_mode)) return true; return false; } // Allowed punctuation in the path part of an URI according to RFC2396 // -_.!~*'():@&=+$, /* 21 ! 22 " 23 # 24 $ 25 % 26 & 27 ' 28 ( 29 ) 2A * 2B + 2C , 2D - 2E . 2F / 30 0 ... 39 9 3A : 3B ; 3C < 3D = 3E > 3F ? 40 @ 41 A ... 5A Z 5B [ 5C \ 5D ] 5E ^ 5F _ 60 ` 61 a ... 7A z 7B { 7C | 7D } 7E ~ 7F DEL */ string url_encode(const string& url, string::size_type offs) { string out = url.substr(0, offs); const char *cp = url.c_str(); for (string::size_type i = offs; i < url.size(); i++) { int c; const char *h = "0123456789ABCDEF"; c = cp[i]; if (c <= 0x20 || c >= 0x7f || c == '"' || c == '#' || c == '%' || c == ';' || c == '<' || c == '>' || c == '?' || c == '[' || c == '\\' || c == ']' || c == '^' || c == '`' || c == '{' || c == '|' || c == '}' ) { out += '%'; out += h[(c >> 4) & 0xf]; out += h[c & 0xf]; } else { out += char(c); } } return out; } string url_gpath(const string& url) { // Remove the access schema part (or whatever it's called) string::size_type colon = url.find_first_of(":"); if (colon == string::npos || colon == url.size() - 1) return url; // If there are non-alphanum chars before the ':', then there // probably is no scheme. Whatever... for (string::size_type i = 0; i < colon; i++) { if (!isalnum(url.at(i))) return url; } // In addition we canonize the path to remove empty host parts // (for compatibility with older versions of recoll where file:// // was hardcoded, but the local path was used for doc // identification. return path_canon(url.substr(colon+1)); } // Convert to file path if url is like file: // Note: this only works with our internal pseudo-urls which are not // encoded/escaped string fileurltolocalpath(string url) { if (url.find("file://") == 0) url = url.substr(7, string::npos); else return string(); string::size_type pos; if ((pos = url.find_last_of("#")) != string::npos) { url.erase(pos); } return url; } // Printable url: this is used to transcode from the system charset // into either utf-8 if transcoding succeeds, or url-encoded bool printableUrl(const string &fcharset, const string &in, string &out) { int ecnt = 0; if (!transcode(in, out, fcharset, "UTF-8", &ecnt) || ecnt) { out = url_encode(in, 7); } return true; } Pidfile::~Pidfile() { if (m_fd >= 0) ::close(m_fd); m_fd = -1; } pid_t Pidfile::read_pid() { int fd = ::open(m_path.c_str(), O_RDONLY); if (fd == -1) return (pid_t)-1; char buf[16]; int error; int i = read(fd, buf, sizeof(buf) - 1); error = errno; ::close(fd); if (i <= 0) return (pid_t)-1; buf[i] = '\0'; char *endptr; pid_t pid = strtol(buf, &endptr, 10); if (endptr != &buf[i]) return (pid_t)-1; return pid; } int Pidfile::flopen() { const char *path = m_path.c_str(); if ((m_fd = ::open(path, O_RDWR|O_CREAT, 0644)) == -1) { m_reason = "Open failed"; return -1; } #ifdef sun struct flock lockdata; lockdata.l_start = 0; lockdata.l_len = 0; lockdata.l_type = F_WRLCK; lockdata.l_whence = SEEK_SET; if (fcntl(m_fd, F_SETLK, &lockdata) != 0) { int serrno = errno; (void)::close(m_fd); errno = serrno; m_reason = "fcntl lock failed"; return -1; } #else int operation = LOCK_EX | LOCK_NB; if (flock(m_fd, operation) == -1) { int serrno = errno; (void)::close(m_fd); errno = serrno; m_reason = "flock failed"; return -1; } #endif // ! sun if (ftruncate(m_fd, 0) != 0) { /* can't happen [tm] */ int serrno = errno; (void)::close(m_fd); errno = serrno; m_reason = "ftruncate failed"; return -1; } return 0; } pid_t Pidfile::open() { if (flopen() < 0) { return read_pid(); } return (pid_t)0; } int Pidfile::write_pid() { /* truncate to allow multiple calls */ if (ftruncate(m_fd, 0) == -1) { m_reason = "ftruncate failed"; return -1; } char pidstr[20]; sprintf(pidstr, "%u", int(getpid())); lseek(m_fd, 0, 0); if (::write(m_fd, pidstr, strlen(pidstr)) != (ssize_t)strlen(pidstr)) { m_reason = "write failed"; return -1; } return 0; } int Pidfile::close() { return ::close(m_fd); } int Pidfile::remove() { return unlink(m_path.c_str()); } // Freedesktop standard paths for thumbnails // Place for 256x256 files static const string thmbdirlarge = ".thumbnails/large"; // 128x128 static const string thmbdirnormal = ".thumbnails/normal"; static void thumbname(const string& url, string& name) { string digest; string l_url = url_encode(url); MD5String(l_url, digest); MD5HexPrint(digest, name); name += ".png"; } bool thumbPathForUrl(const string& url, int size, string& path) { string name; thumbname(url, name); if (size <= 128) { path = path_cat(path_home(), thmbdirnormal); path = path_cat(path, name); if (access(path.c_str(), R_OK) == 0) { return true; } } path = path_cat(path_home(), thmbdirlarge); path = path_cat(path, name); if (access(path.c_str(), R_OK) == 0) { return true; } // File does not exist. Path corresponds to the large version at this point, // fix it if needed. if (size <= 128) { path = path_cat(path_home(), thmbdirnormal); path = path_cat(path, name); } return false; } #else // TEST_PATHUT #include #include using namespace std; #include "pathut.h" const char *tstvec[] = {"", "/", "/dir", "/dir/", "/dir1/dir2", "/dir1/dir2", "./dir", "./dir1/", "dir", "../dir", "/dir/toto.c", "/dir/.c", "/dir/toto.txt", "toto.txt1" }; const string ttvec[] = {"/dir", "", "~", "~/sub", "~root", "~root/sub", "~nosuch", "~nosuch/sub"}; int nttvec = sizeof(ttvec) / sizeof(string); const char *thisprog; int main(int argc, const char **argv) { thisprog = *argv++;argc--; string s; list::const_iterator it; #if 0 for (unsigned int i = 0;i < sizeof(tstvec) / sizeof(char *); i++) { cout << tstvec[i] << " Father " << path_getfather(tstvec[i]) << endl; } for (unsigned int i = 0;i < sizeof(tstvec) / sizeof(char *); i++) { cout << tstvec[i] << " Simple " << path_getsimple(tstvec[i]) << endl; } for (unsigned int i = 0;i < sizeof(tstvec) / sizeof(char *); i++) { cout << tstvec[i] << " Basename " << path_basename(tstvec[i], ".txt") << endl; } #endif #if 0 for (int i = 0; i < nttvec; i++) { cout << "tildexp: '" << ttvec[i] << "' -> '" << path_tildexpand(ttvec[i]) << "'" << endl; } #endif #if 0 const string canontst[] = {"/dir1/../../..", "/////", "", "/dir1/../../.././/////dir2///////", "../../", "../../../../../../../../../../" }; unsigned int nttvec = sizeof(canontst) / sizeof(string); for (unsigned int i = 0; i < nttvec; i++) { cout << "canon: '" << canontst[i] << "' -> '" << path_canon(canontst[i]) << "'" << endl; } #endif #if 0 if (argc != 2) { fprintf(stderr, "Usage: trpathut \n"); exit(1); } string dir = *argv++;argc--; string pattern = *argv++;argc--; list matched = path_dirglob(dir, pattern); for (it = matched.begin(); it != matched.end();it++) { cout << *it << endl; } #endif #if 0 if (argc != 1) { fprintf(stderr, "Usage: fsocc: trpathut \n"); exit(1); } string path = *argv++;argc--; int pc; long blocks; if (!fsocc(path, &pc, &blocks)) { fprintf(stderr, "fsocc failed\n"); return 1; } printf("pc %d, megabytes %ld\n", pc, blocks); #endif #if 0 Pidfile pidfile("/tmp/pathutpidfile"); pid_t pid; if ((pid = pidfile.open()) != 0) { cerr << "open failed. reason: " << pidfile.getreason() << " return " << pid << endl; exit(1); } pidfile.write_pid(); sleep(10); pidfile.close(); pidfile.remove(); #endif #if 1 if (argc != 2) { fprintf(stderr, "Usage: thumbpath \n"); exit(1); } string input = *argv++; int size = atoi(*argv++); if (input.empty()) { fprintf(stderr, "Usage: thumbpath \n"); exit(1); } // Make absolute path if needed if (input[0] != '/') { input = path_absolute(input); } input = string("file://") + path_canon(input); string path; if (thumbPathForUrl(input, size, path)) { cout << "Thumbnail for [" << input << "] [" << path << "]" << endl; } else { cout << "No thumbnail for [" << input << "] path [" << path << "]" < #include #include #include "refcntr.h" #ifndef NO_NAMESPACES using std::string; using std::list; #endif /// Add a / at the end if none there yet. extern void path_catslash(string &s); /// Concatenate 2 paths extern string path_cat(const string &s1, const string &s2); /// Get the simple file name (get rid of any directory path prefix extern string path_getsimple(const string &s); /// Simple file name + optional suffix stripping extern string path_basename(const string &s, const string &suff=string()); /// Get the father directory extern string path_getfather(const string &s); /// Get the current user's home directory extern string path_home(); /// Expand ~ at the beginning of string extern string path_tildexpand(const string &s); /// Use getcwd() to make absolute path if needed. Beware: ***this can fail*** /// we return an empty path in this case. extern string path_absolute(const string &s); /// Clean up path by removing duplicated / and resolving ../ + make it absolute extern string path_canon(const string &s); /// Use glob(3) to return a list of file names matching pattern inside dir extern list path_dirglob(const string &dir, const string pattern); /// Encode according to rfc 1738 extern string url_encode(const string& url, string::size_type offs = 0); /// Transcode to utf-8 if possible or url encoding, for display. extern bool printableUrl(const string &fcharset, const string &in, string &out); // Convert to file path if url is like file:// extern string fileurltolocalpath(string url); /// Return the host+path part of an url. This is not a general /// routine, it does the right thing only in the recoll context extern string url_gpath(const string& url); /// Stat parameter and check if it's a directory extern bool path_isdir(const string& path); /** A small wrapper around statfs et al, to return percentage of disk occupation */ bool fsocc(const string &path, int *pc, // Percent occupied long *avmbs = 0 // Mbs available to non-superuser ); /// Create temporary directory extern bool maketmpdir(string& tdir, string& reason); /// Temporary file class class TempFileInternal { public: TempFileInternal(const string& suffix); ~TempFileInternal(); const char *filename() {return m_filename.c_str();} const string &getreason() {return m_reason;} bool ok() {return !m_filename.empty();} private: string m_filename; string m_reason; }; typedef RefCntr TempFile; /// Temporary directory class class TempDir { public: TempDir(); ~TempDir(); const char *dirname() {return m_dirname.c_str();} const string &getreason() {return m_reason;} bool ok() {return !m_dirname.empty();} bool wipe(); private: string m_dirname; string m_reason; }; /// Lock/pid file class. This is quite close to the pidfile_xxx /// utilities in FreeBSD with a bit more encapsulation. I'd have used /// the freebsd code if it was available elsewhere class Pidfile { public: Pidfile(const string& path) : m_path(path), m_fd(-1) {} ~Pidfile(); /// Open/create the pid file. /// @return 0 if ok, > 0 for pid of existing process, -1 for other error. pid_t open(); /// Write pid into the pid file /// @return 0 ok, -1 error int write_pid(); /// Close the pid file (unlocks) int close(); /// Delete the pid file int remove(); const string& getreason() {return m_reason;} private: string m_path; int m_fd; string m_reason; pid_t read_pid(); int flopen(); }; // Freedesktop thumbnail standard path routine // On return, path will have the appropriate value in all cases, // returns true if the file already exists extern bool thumbPathForUrl(const string& url, int size, string& path); #endif /* _PATHUT_H_INCLUDED_ */ recoll-1.17.3/utils/ptmutex.cpp000644 001750 000000 00000005144 11740755063 017052 0ustar00dockeswheel000000 000000 /* 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. */ // // Small test program to evaluate the cost of using mutex locks: calls // to methods doing a small (150 bytes) base64 encoding job + string // manips, with and without locking. The performance cost is // negligible on all machines I tested (around 0.3% to 2% depending on // the system and machine), but not inexistent, you would not want // this in a tight loop. #include #include #include #include using namespace std; #include "ptmutex.h" #include "base64.h" static char *thisprog; static char usage [] = "ptmutex [-l] count\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_l 0x2 static const string convertbuffer = "* The recoll GUI program sometimes crashes when running a query while\ the indexing thread is active. Possible workarounds:"; static PTMutexInit o_lock; void workerlock(string& out) { PTMutexLocker locker(o_lock); base64_encode(convertbuffer, out); } void workernolock(string& out) { base64_encode(convertbuffer, out); } int main(int argc, char **argv) { int count = 0; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'l': op_flags |= OPT_l; break; default: Usage(); break; } b1: argc--; argv++; } if (argc != 1) Usage(); count = atoi(*argv++);argc--; if (op_flags & OPT_l) { fprintf(stderr, "Looping %d, locking\n", count); for (int i = 0; i < count; i++) { string s; workerlock(s); } } else { fprintf(stderr, "Looping %d, no locking\n", count); for (int i = 0; i < count; i++) { string s; workernolock(s); } } exit(0); } recoll-1.17.3/utils/ptmutex.h000644 001750 000000 00000002726 11740755063 016522 0ustar00dockeswheel000000 000000 /* 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 _PTMUTEX_H_INCLUDED_ #define _PTMUTEX_H_INCLUDED_ #include /// A trivial wrapper/helper for pthread mutex locks /// Init lock. Used as a single PTMutexInit static object. class PTMutexInit { public: pthread_mutex_t m_mutex; PTMutexInit() { pthread_mutex_init(&m_mutex, 0); } }; /// Take the lock when constructed, release when deleted class PTMutexLocker { public: PTMutexLocker(PTMutexInit& l) : m_lock(l) { m_status = pthread_mutex_lock(&m_lock.m_mutex); } ~PTMutexLocker() { pthread_mutex_unlock(&m_lock.m_mutex); } int ok() {return m_status == 0;} private: PTMutexInit& m_lock; int m_status; }; #endif /* _PTMUTEX_H_INCLUDED_ */ recoll-1.17.3/utils/pxattr.cpp000644 001750 000000 00000044424 11740755063 016672 0ustar00dockeswheel000000 000000 /* Copyright (c) 2009 Jean-Francois Dockes 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. */ // We want this to compile even to empty on non-supported systems. makes // things easier for autoconf #if defined(__FreeBSD__) || defined(__gnu_linux__) || defined(__APPLE__) #ifndef TEST_PXATTR #include #include #include #include #if defined(__FreeBSD__) #include #include #elif defined(__gnu_linux__) #include #elif defined(__APPLE__) #include #else #error "Unknown system can't compile" #endif #include "pxattr.h" namespace pxattr { class AutoBuf { public: char *buf; AutoBuf() : buf(0) {} ~AutoBuf() {if (buf) free(buf); buf = 0;} bool alloc(int n) { if (buf) { free(buf); buf = 0; } buf = (char *)malloc(n); return buf != 0; } }; static bool get(int fd, const string& path, const string& _name, string *value, flags flags, nspace dom) { string name; if (!sysname(dom, _name, &name)) return false; ssize_t ret = -1; AutoBuf buf; #if defined(__FreeBSD__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = extattr_get_link(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } else { ret = extattr_get_file(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } } else { ret = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } if (ret < 0) return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 return false; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = extattr_get_link(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), buf.buf, ret); } else { ret = extattr_get_file(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), buf.buf, ret); } } else { ret = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str(), buf.buf, ret); } #elif defined(__gnu_linux__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = lgetxattr(path.c_str(), name.c_str(), 0, 0); } else { ret = getxattr(path.c_str(), name.c_str(), 0, 0); } } else { ret = fgetxattr(fd, name.c_str(), 0, 0); } if (ret < 0) return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 return false; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = lgetxattr(path.c_str(), name.c_str(), buf.buf, ret); } else { ret = getxattr(path.c_str(), name.c_str(), buf.buf, ret); } } else { ret = fgetxattr(fd, name.c_str(), buf.buf, ret); } #elif defined(__APPLE__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = getxattr(path.c_str(), name.c_str(), 0, 0, 0, XATTR_NOFOLLOW); } else { ret = getxattr(path.c_str(), name.c_str(), 0, 0, 0, 0); } } else { ret = fgetxattr(fd, name.c_str(), 0, 0, 0, 0); } if (ret < 0) return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 return false; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = getxattr(path.c_str(), name.c_str(), buf.buf, ret, 0, XATTR_NOFOLLOW); } else { ret = getxattr(path.c_str(), name.c_str(), buf.buf, ret, 0, 0); } } else { ret = fgetxattr(fd, name.c_str(), buf.buf, ret, 0, 0); } #endif if (ret >= 0) value->assign(buf.buf, ret); return ret >= 0; } static bool set(int fd, const string& path, const string& _name, const string& value, flags flags, nspace dom) { string name; if (!sysname(dom, _name, &name)) return false; ssize_t ret = -1; #if defined(__FreeBSD__) if (flags & (PXATTR_CREATE|PXATTR_REPLACE)) { // Need to test existence bool exists = false; ssize_t eret; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { eret = extattr_get_link(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } else { eret = extattr_get_file(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } } else { eret = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } if (eret >= 0) exists = true; if (eret < 0 && errno != ENOATTR) return false; if ((flags & PXATTR_CREATE) && exists) { errno = EEXIST; return false; } if ((flags & PXATTR_REPLACE) && !exists) { errno = ENOATTR; return false; } } if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = extattr_set_link(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), value.c_str(), value.length()); } else { ret = extattr_set_file(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), value.c_str(), value.length()); } } else { ret = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str(), value.c_str(), value.length()); } #elif defined(__gnu_linux__) int opts = 0; if (flags & PXATTR_CREATE) opts = XATTR_CREATE; else if (flags & PXATTR_REPLACE) opts = XATTR_REPLACE; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = lsetxattr(path.c_str(), name.c_str(), value.c_str(), value.length(), opts); } else { ret = setxattr(path.c_str(), name.c_str(), value.c_str(), value.length(), opts); } } else { ret = fsetxattr(fd, name.c_str(), value.c_str(), value.length(), opts); } #elif defined(__APPLE__) int opts = 0; if (flags & PXATTR_CREATE) opts = XATTR_CREATE; else if (flags & PXATTR_REPLACE) opts = XATTR_REPLACE; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = setxattr(path.c_str(), name.c_str(), value.c_str(), value.length(), 0, XATTR_NOFOLLOW|opts); } else { ret = setxattr(path.c_str(), name.c_str(), value.c_str(), value.length(), 0, opts); } } else { ret = fsetxattr(fd, name.c_str(), value.c_str(), value.length(), 0, opts); } #endif return ret >= 0; } static bool del(int fd, const string& path, const string& _name, flags flags, nspace dom) { string name; if (!sysname(dom, _name, &name)) return false; int ret = -1; #if defined(__FreeBSD__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = extattr_delete_link(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str()); } else { ret = extattr_delete_file(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str()); } } else { ret = extattr_delete_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str()); } #elif defined(__gnu_linux__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = lremovexattr(path.c_str(), name.c_str()); } else { ret = removexattr(path.c_str(), name.c_str()); } } else { ret = fremovexattr(fd, name.c_str()); } #elif defined(__APPLE__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = removexattr(path.c_str(), name.c_str(), XATTR_NOFOLLOW); } else { ret = removexattr(path.c_str(), name.c_str(), 0); } } else { ret = fremovexattr(fd, name.c_str(), 0); } #endif return ret >= 0; } static bool list(int fd, const string& path, vector* names, flags flags, nspace dom) { ssize_t ret = -1; AutoBuf buf; #if defined(__FreeBSD__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = extattr_list_link(path.c_str(), EXTATTR_NAMESPACE_USER, 0, 0); } else { ret = extattr_list_file(path.c_str(), EXTATTR_NAMESPACE_USER, 0, 0); } } else { ret = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, 0, 0); } if (ret < 0) return false; if (!buf.alloc(ret+1)) // NEEDED on FreeBSD (no ending null) return false; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = extattr_list_link(path.c_str(), EXTATTR_NAMESPACE_USER, buf.buf, ret); } else { ret = extattr_list_file(path.c_str(), EXTATTR_NAMESPACE_USER, buf.buf, ret); } } else { ret = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, buf.buf, ret); } #elif defined(__gnu_linux__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = llistxattr(path.c_str(), 0, 0); } else { ret = listxattr(path.c_str(), 0, 0); } } else { ret = flistxattr(fd, 0, 0); } if (ret < 0) return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 return false; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = llistxattr(path.c_str(), buf.buf, ret); } else { ret = listxattr(path.c_str(), buf.buf, ret); } } else { ret = flistxattr(fd, buf.buf, ret); } #elif defined(__APPLE__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = listxattr(path.c_str(), 0, 0, XATTR_NOFOLLOW); } else { ret = listxattr(path.c_str(), 0, 0, 0); } } else { ret = flistxattr(fd, 0, 0, 0); } if (ret < 0) return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 return false; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = listxattr(path.c_str(), buf.buf, ret, XATTR_NOFOLLOW); } else { ret = listxattr(path.c_str(), buf.buf, ret, 0); } } else { ret = flistxattr(fd, buf.buf, ret, 0); } #endif char *bufstart = buf.buf; // All systems return a 0-separated string list except FreeBSD // which has length, value pairs, length is a byte. #if defined(__FreeBSD__) char *cp = buf.buf; unsigned int len; while (cp < buf.buf + ret + 1) { len = *cp; *cp = 0; cp += len + 1; } bufstart = buf.buf + 1; *cp = 0; // don't forget, we allocated one more #endif if (ret > 0) { int pos = 0; while (pos < ret) { string n = string(bufstart + pos); string n1; if (pxname(PXATTR_USER, n, &n1)) { names->push_back(n1); } pos += n.length() + 1; } } return true; } static const string cstr_nullstring(""); bool get(const string& path, const string& _name, string *value, flags flags, nspace dom) { return get(-1, path, _name, value, flags, dom); } bool get(int fd, const string& _name, string *value, flags flags, nspace dom) { return get(fd, cstr_nullstring, _name, value, flags, dom); } bool set(const string& path, const string& _name, const string& value, flags flags, nspace dom) { return set(-1, path, _name, value, flags, dom); } bool set(int fd, const string& _name, const string& value, flags flags, nspace dom) { return set(fd, cstr_nullstring, _name, value, flags, dom); } bool del(const string& path, const string& _name, flags flags, nspace dom) { return del(-1, path, _name, flags, dom); } bool del(int fd, const string& _name, flags flags, nspace dom) { return del(fd, cstr_nullstring, _name, flags, dom); } bool list(const string& path, vector* names, flags flags, nspace dom) { return list(-1, path, names, flags, dom); } bool list(int fd, vector* names, flags flags, nspace dom) { return list(fd, cstr_nullstring, names, flags, dom); } static const string cstr_userstring("user."); bool sysname(nspace dom, const string& pname, string* sname) { if (dom != PXATTR_USER) { errno = EINVAL; return false; } *sname = cstr_userstring + pname; return true; } bool pxname(nspace dom, const string& sname, string* pname) { if (sname.find("user.") != 0) { errno = EINVAL; return false; } *pname = sname.substr(cstr_userstring.length()); return true; } } // namespace pxattr #else // Testing / driver -> #include #include #include #include #include #include #include #include "pxattr.h" static char *thisprog; static char usage [] = "pxattr [-h] -n name [-v value] pathname...\n" "pxattr [-h] -x name pathname...\n" "pxattr [-h] -l pathname...\n" " [-h] : don't follow symbolic links (act on link itself)\n" "pxattr -T: run tests on temp file in current directory" "\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_n 0x2 #define OPT_v 0x4 #define OPT_h 0x8 #define OPT_x 0x10 #define OPT_l 0x20 #define OPT_T 0x40 static void dotests() { static const char *tfn = "pxattr_testtmp.xyz"; static const char *NAMES[] = {"ORG.PXATTR.NAME1", "ORG.PXATTR.N2", "ORG.PXATTR.LONGGGGGGGGisSSSHHHHHHHHHNAME3"}; static const char *VALUES[] = {"VALUE1", "VALUE2", "VALUE3"}; static bool verbose = true; /* Create test file if it doesn't exist, remove all attributes */ int fd = open(tfn, O_RDWR|O_CREAT, 0755); if (fd < 0) { perror("open/create"); exit(1); } if (verbose) fprintf(stdout, "Cleanup old attrs\n"); vector names; if (!pxattr::list(tfn, &names)) { perror("pxattr::list"); exit(1); } for (vector::const_iterator it = names.begin(); it != names.end(); it++) { string value; if (!pxattr::del(fd, *it)) { perror("pxattr::del"); exit(1); } } /* Check that there are no attributes left */ names.clear(); if (!pxattr::list(tfn, &names)) { perror("pxattr::list"); exit(1); } if (names.size() != 0) { fprintf(stderr, "Attributes remain after initial cleanup !\n"); for (vector::const_iterator it = names.begin(); it != names.end(); it++) { fprintf(stderr, "%s\n", (*it).c_str()); } exit(1); } /* Create attributes, check existence and value */ if (verbose) fprintf(stdout, "Creating extended attributes\n"); for (int i = 0; i < 3; i++) { if (!pxattr::set(fd, NAMES[i], VALUES[i])) { perror("pxattr::set"); exit(1); } } if (verbose) fprintf(stdout, "Checking creation\n"); for (int i = 0; i < 3; i++) { string value; if (!pxattr::get(tfn, NAMES[i], &value)) { perror("pxattr::get"); exit(1); } if (value.compare(VALUES[i])) { fprintf(stderr, "Wrong value after create !\n"); exit(1); } } /* Delete one, check list */ if (verbose) fprintf(stdout, "Delete one\n"); if (!pxattr::del(tfn, NAMES[1])) { perror("pxattr::del one name"); exit(1); } if (verbose) fprintf(stdout, "Check list\n"); for (int i = 0; i < 3; i++) { string value; if (!pxattr::get(fd, NAMES[i], &value)) { if (i == 1) continue; perror("pxattr::get"); exit(1); } else if (i == 1) { fprintf(stderr, "Name at index 1 still exists after deletion\n"); exit(1); } if (value.compare(VALUES[i])) { fprintf(stderr, "Wrong value after delete 1 !\n"); exit(1); } } /* Test the CREATE/REPLACE flags */ // Set existing with flag CREATE should fail if (verbose) fprintf(stdout, "Testing CREATE/REPLACE flags use\n"); if (pxattr::set(tfn, NAMES[0], VALUES[0], pxattr::PXATTR_CREATE)) { fprintf(stderr, "Create existing with flag CREATE succeeded !\n"); exit(1); } // Set new with flag REPLACE should fail if (pxattr::set(tfn, NAMES[1], VALUES[1], pxattr::PXATTR_REPLACE)) { fprintf(stderr, "Create new with flag REPLACE succeeded !\n"); exit(1); } // Set new with flag CREATE should succeed if (!pxattr::set(fd, NAMES[1], VALUES[1], pxattr::PXATTR_CREATE)) { fprintf(stderr, "Create new with flag CREATE failed !\n"); exit(1); } // Set existing with flag REPLACE should succeed if (!pxattr::set(fd, NAMES[0], VALUES[0], pxattr::PXATTR_REPLACE)) { fprintf(stderr, "Create existing with flag REPLACE failed !\n"); exit(1); } close(fd); unlink(tfn); exit(0); } static void listattrs(const string& path) { std::cout << "Path: " << path << std::endl; vector names; if (!pxattr::list(path, &names)) { perror("pxattr::list"); exit(1); } for (vector::const_iterator it = names.begin(); it != names.end(); it++) { string value; if (!pxattr::get(path, *it, &value)) { perror("pxattr::get"); exit(1); } std::cout << " " << *it << " => " << value << std::endl; } } void setxattr(const string& path, const string& name, const string& value) { if (!pxattr::set(path, name, value)) { perror("pxattr::set"); exit(1); } } void printxattr(const string &path, const string& name) { std::cout << "Path: " << path << std::endl; string value; if (!pxattr::get(path, name, &value)) { perror("pxattr::get"); exit(1); } std::cout << " " << name << " => " << value << std::endl; } void delxattr(const string &path, const string& name) { if (pxattr::del(path, name) < 0) { perror("pxattr::del"); exit(1); } } int main(int argc, char **argv) { thisprog = argv[0]; argc--; argv++; string name, value; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'T': op_flags |= OPT_T; break; case 'l': op_flags |= OPT_l; break; case 'x': op_flags |= OPT_x; if (argc < 2) Usage(); name = *(++argv); argc--; goto b1; case 'n': op_flags |= OPT_n; if (argc < 2) Usage(); name = *(++argv); argc--; goto b1; case 'v': op_flags |= OPT_v; if (argc < 2) Usage(); value = *(++argv); argc--; goto b1; default: Usage(); break; } b1: argc--; argv++; } if (argc < 1 && !(op_flags & OPT_T)) Usage(); if (op_flags & OPT_l) { while (argc > 0) { listattrs(*argv++);argc--; } } else if (op_flags & OPT_n) { if (op_flags & OPT_v) { while (argc > 0) { setxattr(*argv++, name, value);argc--; } } else { while (argc > 0) { printxattr(*argv++, name);argc--; } } } else if (op_flags & OPT_x) { while (argc > 0) { delxattr(*argv++, name);argc--; } } else if (op_flags & OPT_T) { dotests(); } exit(0); } #endif // Testing pxattr #endif // Supported systems. recoll-1.17.3/utils/pxattr.h000644 001750 000000 00000011215 11740755063 016327 0ustar00dockeswheel000000 000000 #ifndef _pxattr_h_included_ #define _pxattr_h_included_ /* Copyright (c) 2009 Jean-Francois Dockes 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. */ #include #include using std::string; using std::vector; /** * Provide a uniform C++ API for extended file attributes on Linux/FreeBSD * and MacOSX. * * We only deal with user attributes. Other namespaces are very * system-specific and would be difficult to use in a portable way. * * Linux and FreeBSD treat differently the attributes name space * segmentation: Linux uses the first name segment ("user.", "system.", ...), * FreeBSD uses an enumeration. * * We handle this by using only domain-internal names in the interface: * that is, the caller specifies the names as, ie, 'org.myapp.somename' * not 'user.org.myapp.somename'. pxattr will deal with adding/removing * the 'user.' part as needed. * * MacOsX does not segment the attribute name space. * * In order to avoid conflicts, it is recommended that attributes * names be chosen in a "reverse dns" fashion, ie: * org.recoll.indexing.status * * The interface provided should work the same way on all 3 systems, * it papers over such differences as the "list" output format, * the existence of CREATE/UPDATE distinctions, etc. * * Diagnostics: all functions return false on error, and preserve the errno * value or set it as appropriate. * * For path-based interfaces, the PXATTR_NOFOLLOW flag can be set to decide if * symbolic links will be acted on or followed. */ namespace pxattr { /** nspace might be used in the future if we support multiple namespaces.*/ enum nspace { /** User name space */ PXATTR_USER }; /** Flags can modify the behaviour of some methods */ enum flags {PXATTR_NONE=0, /** Act on link instead of following it */ PXATTR_NOFOLLOW = 1, /** Fail if existing */ PXATTR_CREATE=2, /** Fail if new */ PXATTR_REPLACE=4 }; /** * Retrieve the named attribute from path. */ bool get(const string& path, const string& name, string* value, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * Retrieve the named attribute from open file. */ bool get(int fd, const string& name, string* value, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * Set the named attribute on path. */ bool set(const string& path, const string& name, const string& value, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * Set the named attribute on open file. */ bool set(int fd, const string& name, const string& value, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * Delete the named attribute from path. */ bool del(const string& path, const string& name, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * Delete the named attribute from open file. */ bool del(int fd, const string& name, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * List attribute names from path. */ bool list(const string& path, vector* names, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * List attribute names from open file. */ bool list(int fd, vector* names, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * Compute actual/system attribute name from external name * (ie: myattr->user.myattr) */ bool sysname(nspace dom, const string& pname, string* sname); /** * Compute external name from actual/system name * (ie: user.myattr->myattr) */ bool pxname(nspace dom, const string& sname, string* pname); } #endif /* _pxattr_h_included_ */ recoll-1.17.3/utils/rclionice.cpp000644 001750 000000 00000003020 11740755063 017302 0ustar00dockeswheel000000 000000 /* 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 #include #include "rclionice.h" #include "execmd.h" #include "debuglog.h" bool rclionice(const string& clss, const string& cdata) { string ionicexe; if (!ExecCmd::which("ionice", ionicexe)) { // ionice not found, bail out LOGDEB0(("rclionice: ionice not found\n")); return false; } list args; args.push_back("-c"); args.push_back(clss); if (!cdata.empty()) { args.push_back("-n"); args.push_back(cdata); } char cpid[100]; sprintf(cpid, "%d", getpid()); args.push_back("-p"); args.push_back(cpid); ExecCmd cmd; int status = cmd.doexec(ionicexe, args); if (status) { LOGERR(("rclionice: failed, status 0x%x\n", status)); return false; } return true; } recoll-1.17.3/utils/rclionice.h000644 001750 000000 00000001731 11740755063 016756 0ustar00dockeswheel000000 000000 /* 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 _RCLIONICE_H_INCLUDED_ #define _RCLIONICE_H_INCLUDED_ #include using std::string; extern bool rclionice(const string& clss, const string& classdata); #endif /* _RCLIONICE_H_INCLUDED_ */ recoll-1.17.3/utils/readfile.cpp000644 001750 000000 00000015056 11740755063 017122 0ustar00dockeswheel000000 000000 /* 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_READFILE #include "autoconfig.h" #include #include #include #include #ifndef O_STREAMING #define O_STREAMING 0 #endif #include #include #include #include #ifndef NO_NAMESPACES using std::string; #endif /* NO_NAMESPACES */ #include "readfile.h" #include "smallut.h" #ifndef MIN #define MIN(A,B) ((A) < (B) ? (A) : (B)) #endif class FileToString : public FileScanDo { public: FileToString(string& data) : m_data(data) {} string& m_data; bool init(size_t size, string *reason) { if (size > 0) m_data.reserve(size); return true; } bool data(const char *buf, int cnt, string *reason) { try { m_data.append(buf, cnt); } catch (...) { catstrerror(reason, "append", errno); return false; } return true; } }; bool file_to_string(const string &fn, string &data, string *reason) { return file_to_string(fn, data, 0, size_t(-1), reason); } bool file_to_string(const string &fn, string &data, off_t offs, size_t cnt, string *reason) { FileToString accum(data); return file_scan(fn, &accum, offs, cnt, reason); } bool file_scan(const string &fn, FileScanDo* doer, string *reason) { return file_scan(fn, doer, 0, size_t(-1), reason); } const int RDBUFSZ = 4096; // Note: the fstat() + reserve() (in init()) calls divide cpu usage almost by 2 // on both linux i586 and macosx (compared to just append()) // Also tried a version with mmap, but it's actually slower on the mac and not // faster on linux. bool file_scan(const string &fn, FileScanDo* doer, off_t startoffs, size_t cnttoread, string *reason) { bool ret = false; bool noclosing = true; int fd = 0; struct stat st; // Initialize st_size: if fn.empty() , the fstat() call won't happen. st.st_size = 0; // If we have a file name, open it, else use stdin. if (!fn.empty()) { fd = open(fn.c_str(), O_RDONLY|O_STREAMING); if (fd < 0 || fstat(fd, &st) < 0) { catstrerror(reason, "open/stat", errno); return false; } noclosing = false; } if (cnttoread != (size_t)-1 && cnttoread) { doer->init(cnttoread+1, reason); } else if (st.st_size > 0) { doer->init(st.st_size+1, reason); } else { doer->init(0, reason); } off_t curoffs = 0; if (startoffs > 0 && !fn.empty()) { if (lseek(fd, startoffs, SEEK_SET) != startoffs) { catstrerror(reason, "lseek", errno); return false; } curoffs = startoffs; } char buf[RDBUFSZ]; size_t totread = 0; for (;;) { size_t toread = RDBUFSZ; if (startoffs > 0 && curoffs < startoffs) { toread = MIN(RDBUFSZ, startoffs - curoffs); } if (cnttoread != size_t(-1)) { toread = MIN(toread, cnttoread - totread); } int n = read(fd, buf, toread); if (n < 0) { catstrerror(reason, "read", errno); goto out; } if (n == 0) break; curoffs += n; if (curoffs - n < startoffs) continue; if (!doer->data(buf, n, reason)) { goto out; } totread += n; if (cnttoread > 0 && totread >= cnttoread) break; } ret = true; out: if (fd >= 0 && !noclosing) close(fd); return ret; } #else // Test #include "autoconfig.h" #include #include #include #include #include #include #include using namespace std; #include "readfile.h" #include "fstreewalk.h" using namespace std; class myCB : public FsTreeWalkerCB { public: FsTreeWalker::Status processone(const string &path, const struct stat *st, FsTreeWalker::CbFlag flg) { if (flg == FsTreeWalker::FtwDirEnter) { //cout << "[Entering " << path << "]" << endl; } else if (flg == FsTreeWalker::FtwDirReturn) { //cout << "[Returning to " << path << "]" << endl; } else if (flg == FsTreeWalker::FtwRegular) { //cout << path << endl; string s, reason; if (!file_to_string(path, s, &reason)) { cerr << "Failed: " << reason << " : " << path << endl; } else { //cout << //"================================================" << endl; cout << path << endl; // cout << s; } reason.clear(); } return FsTreeWalker::FtwOk; } }; static int op_flags; #define OPT_MOINS 0x1 #define OPT_c 0x2 #define OPT_o 0x4 static const char *thisprog; static char usage [] = "trreadfile [-o offs] [-c cnt] topdirorfile\n\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } int main(int argc, const char **argv) { off_t offs = 0; size_t cnt = size_t(-1); 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; if (argc < 2) Usage(); cnt = atol(*(++argv)); argc--; goto b1; case 'o': op_flags |= OPT_o; if (argc < 2) Usage(); offs = strtoul(*(++argv), 0, 0); argc--; goto b1; default: Usage(); break; } b1: argc--; argv++; } if (argc != 1) Usage(); string top = *argv++;argc--; cerr << "filename " << top << " offs " << offs << " cnt " << cnt << endl; struct stat st; if (!top.empty() && stat(top.c_str(), &st) < 0) { perror("stat"); exit(1); } if (!top.empty() && S_ISDIR(st.st_mode)) { FsTreeWalker walker; myCB cb; walker.walk(top, cb); if (walker.getErrCnt() > 0) cout << walker.getReason(); } else { string s, reason; if (!file_to_string(top, s, offs, cnt, &reason)) { cerr << reason << endl; exit(1); } else { cout << s; } } exit(0); } #endif //TEST_READFILE recoll-1.17.3/utils/readfile.h000644 001750 000000 00000003534 11740755063 016565 0ustar00dockeswheel000000 000000 /* 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 _READFILE_H_INCLUDED_ #define _READFILE_H_INCLUDED_ #include #include using std::string; /** * Read file in chunks, calling an accumulator for each chunk. Can be used * for reading in a file, computing an md5... */ class FileScanDo { public: virtual ~FileScanDo() {} virtual bool init(size_t size, string *reason) = 0; virtual bool data(const char *buf, int cnt, string* reason) = 0; }; bool file_scan(const string &filename, FileScanDo* doer, string *reason = 0); /* Same but only process count cnt from offset offs. Set cnt to size_t(-1) * for no limit */ bool file_scan(const string &fn, FileScanDo* doer, off_t offs, size_t cnt, string *reason = 0); /** * Read file into string. * @return true for ok, false else */ bool file_to_string(const string &filename, string &data, string *reason = 0); /** Read file chunk into string. Set cnt to size_t(-1) for whole file */ bool file_to_string(const string &filename, string &data, off_t offs, size_t cnt, string *reason = 0); #endif /* _READFILE_H_INCLUDED_ */ recoll-1.17.3/utils/refcntr.h000644 001750 000000 00000002330 11740755063 016446 0ustar00dockeswheel000000 000000 #ifndef _REFCNTR_H_ #define _REFCNTR_H_ // See Stroustrup C++ 3rd ed, p. 783 template class RefCntr { X *rep; int *pcount; public: RefCntr() : rep(0), pcount(0) {} explicit RefCntr(X *pp) : rep(pp), pcount(new int(1)) {} RefCntr(const RefCntr &r) : rep(r.rep), pcount(r.pcount) { if (pcount) (*pcount)++; } RefCntr& operator=(const RefCntr& r) { if (rep == r.rep) return *this; if (pcount && --(*pcount) == 0) { delete rep; delete pcount; } rep = r.rep; pcount = r.pcount; if (pcount) (*pcount)++; return *this; } void release() { if (pcount && --(*pcount) == 0) { delete rep; delete pcount; } rep = 0; pcount = 0; } ~RefCntr() { release(); } X *operator->() {return rep;} X *getptr() const {return rep;} const X *getconstptr() const {return rep;} int getcnt() const {return pcount ? *pcount : 0;} bool isNull() const {return rep == 0;} bool isNotNull() const {return rep != 0;} }; #endif /*_REFCNTR_H_ */ recoll-1.17.3/utils/smallut.cpp000644 001750 000000 00000074517 11740755063 017037 0ustar00dockeswheel000000 000000 /* 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_SMALLUT #ifdef HAVE_CONFIG_H #include "autoconfig.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include "smallut.h" #include "utf8iter.h" #ifndef NO_NAMESPACES using namespace std; #endif /* NO_NAMESPACES */ #define MIN(A,B) ((A)<(B)?(A):(B)) int stringicmp(const string & s1, const string& s2) { string::const_iterator it1 = s1.begin(); string::const_iterator it2 = s2.begin(); int size1 = s1.length(), size2 = s2.length(); char c1, c2; if (size1 > size2) { while (it1 != s1.end()) { c1 = ::toupper(*it1); c2 = ::toupper(*it2); if (c1 != c2) { return c1 > c2 ? 1 : -1; } ++it1; ++it2; } return size1 == size2 ? 0 : 1; } else { while (it2 != s2.end()) { c1 = ::toupper(*it1); c2 = ::toupper(*it2); if (c1 != c2) { return c1 > c2 ? 1 : -1; } ++it1; ++it2; } return size1 == size2 ? 0 : -1; } } void stringtolower(string& io) { string::iterator it = io.begin(); string::iterator ite = io.end(); while (it != ite) { *it = ::tolower(*it); it++; } } string stringtolower(const string& i) { string o = i; stringtolower(o); return o; } extern int stringisuffcmp(const string& s1, const string& s2) { string::const_reverse_iterator r1 = s1.rbegin(), re1 = s1.rend(), r2 = s2.rbegin(), re2 = s2.rend(); while (r1 != re1 && r2 != re2) { char c1 = ::toupper(*r1); char c2 = ::toupper(*r2); if (c1 != c2) { return c1 > c2 ? 1 : -1; } ++r1; ++r2; } return 0; } // s1 is already lowercase int stringlowercmp(const string & s1, const string& s2) { string::const_iterator it1 = s1.begin(); string::const_iterator it2 = s2.begin(); int size1 = s1.length(), size2 = s2.length(); char c2; if (size1 > size2) { while (it1 != s1.end()) { c2 = ::tolower(*it2); if (*it1 != c2) { return *it1 > c2 ? 1 : -1; } ++it1; ++it2; } return size1 == size2 ? 0 : 1; } else { while (it2 != s2.end()) { c2 = ::tolower(*it2); if (*it1 != c2) { return *it1 > c2 ? 1 : -1; } ++it1; ++it2; } return size1 == size2 ? 0 : -1; } } // s1 is already uppercase int stringuppercmp(const string & s1, const string& s2) { string::const_iterator it1 = s1.begin(); string::const_iterator it2 = s2.begin(); int size1 = s1.length(), size2 = s2.length(); char c2; if (size1 > size2) { while (it1 != s1.end()) { c2 = ::toupper(*it2); if (*it1 != c2) { return *it1 > c2 ? 1 : -1; } ++it1; ++it2; } return size1 == size2 ? 0 : 1; } else { while (it2 != s2.end()) { c2 = ::toupper(*it2); if (*it1 != c2) { return *it1 > c2 ? 1 : -1; } ++it1; ++it2; } return size1 == size2 ? 0 : -1; } } // Compare charset names, removing the more common spelling variations bool samecharset(const string &cs1, const string &cs2) { string mcs1, mcs2; // Remove all - and _, turn to lowecase for (unsigned int i = 0; i < cs1.length();i++) { if (cs1[i] != '_' && cs1[i] != '-') { mcs1 += ::tolower(cs1[i]); } } for (unsigned int i = 0; i < cs2.length();i++) { if (cs2[i] != '_' && cs2[i] != '-') { mcs2 += ::tolower(cs2[i]); } } return mcs1 == mcs2; } template bool stringToStrings(const string &s, T &tokens, const string& addseps) { string current; tokens.clear(); enum states {SPACE, TOKEN, INQUOTE, ESCAPE}; states state = SPACE; for (unsigned int i = 0; i < s.length(); i++) { switch (s[i]) { case '"': switch(state) { case SPACE: state=INQUOTE; continue; case TOKEN: current += '"'; continue; case INQUOTE: tokens.insert(tokens.end(), current); current.clear(); state = SPACE; continue; case ESCAPE: current += '"'; state = INQUOTE; continue; } break; case '\\': switch(state) { case SPACE: case TOKEN: current += '\\'; state=TOKEN; continue; case INQUOTE: state = ESCAPE; continue; case ESCAPE: current += '\\'; state = INQUOTE; continue; } break; case ' ': case '\t': case '\n': case '\r': switch(state) { case SPACE: continue; case TOKEN: tokens.insert(tokens.end(), current); current.clear(); state = SPACE; continue; case INQUOTE: case ESCAPE: current += s[i]; continue; } break; default: if (!addseps.empty() && addseps.find(s[i]) != string::npos) { switch(state) { case ESCAPE: state = INQUOTE; break; case INQUOTE: break; case SPACE: tokens.insert(tokens.end(), string(1, s[i])); continue; case TOKEN: tokens.insert(tokens.end(), current); current.erase(); tokens.insert(tokens.end(), string(1, s[i])); state = SPACE; continue; } } else switch(state) { case ESCAPE: state = INQUOTE; break; case SPACE: state = TOKEN; break; case TOKEN: case INQUOTE: break; } current += s[i]; } } switch(state) { case SPACE: break; case TOKEN: tokens.insert(tokens.end(), current); break; case INQUOTE: case ESCAPE: return false; } return true; } template bool stringToStrings >(const string &, list &, const string&); template bool stringToStrings >(const string &, vector &,const string&); template bool stringToStrings >(const string &, set &, const string&); template void stringsToString(const T &tokens, string &s) { for (typename T::const_iterator it = tokens.begin(); it != tokens.end(); it++) { bool hasblanks = false; if (it->find_first_of(" \t\n") != string::npos) hasblanks = true; if (it != tokens.begin()) s.append(1, ' '); if (hasblanks) s.append(1, '"'); for (unsigned int i = 0; i < it->length(); i++) { char car = it->at(i); if (car == '"') { s.append(1, '\\'); s.append(1, car); } else { s.append(1, car); } } if (hasblanks) s.append(1, '"'); } } template void stringsToString >(const list &, string &); template void stringsToString >(const vector &,string &); template void stringsToString >(const set &, string &); template void stringsToCSV(const T &tokens, string &s, char sep) { s.erase(); for (typename T::const_iterator it = tokens.begin(); it != tokens.end(); it++) { bool needquotes = false; if (it->empty() || it->find_first_of(string(1, sep) + "\"\n") != string::npos) needquotes = true; if (it != tokens.begin()) s.append(1, sep); if (needquotes) s.append(1, '"'); for (unsigned int i = 0; i < it->length(); i++) { char car = it->at(i); if (car == '"') { s.append(2, '"'); } else { s.append(1, car); } } if (needquotes) s.append(1, '"'); } } template void stringsToCSV >(const list &, string &, char); template void stringsToCSV >(const vector &,string &, char); void stringToTokens(const string& str, vector& tokens, const string& delims, bool skipinit) { string::size_type startPos = 0, pos; for (pos = 0;;) { // Skip initial delims, break if this eats all. if (skipinit && (startPos = str.find_first_not_of(delims, pos)) == string::npos) break; // Find next delimiter or end of string (end of token) pos = str.find_first_of(delims, startPos); // Add token to the vector. Note: token cant be empty here if (pos == string::npos) tokens.push_back(str.substr(startPos)); else tokens.push_back(str.substr(startPos, pos - startPos)); } } bool stringToBool(const string &s) { if (s.empty()) return false; if (isdigit(s[0])) { int val = atoi(s.c_str()); return val ? true : false; } if (s.find_first_of("yYtT") == 0) return true; return false; } void trimstring(string &s, const char *ws) { string::size_type pos = s.find_first_not_of(ws); if (pos == string::npos) { s.clear(); return; } s.replace(0, pos, string()); pos = s.find_last_not_of(ws); if (pos != string::npos && pos != s.length()-1) s.replace(pos+1, string::npos, string()); } // Remove some chars and replace them with spaces string neutchars(const string &str, const string &chars) { string out; neutchars(str, out, chars); return out; } void neutchars(const string &str, string &out, const string& chars) { string::size_type startPos, pos; for (pos = 0;;) { // Skip initial chars, break if this eats all. if ((startPos = str.find_first_not_of(chars, pos)) == string::npos) break; // Find next delimiter or end of string (end of token) pos = str.find_first_of(chars, startPos); // Add token to the output. Note: token cant be empty here if (pos == string::npos) { out += str.substr(startPos); } else { out += str.substr(startPos, pos - startPos) + " "; } } } /* Truncate a string to a given maxlength, avoiding cutting off midword * if reasonably possible. Note: we could also use textsplit, stopping when * we have enough, this would be cleanly utf8-aware but would remove * punctuation */ static const string cstr_SEPAR = " \t\n\r-:.;,/[]{}"; string truncate_to_word(const string &input, string::size_type maxlen) { string output; if (input.length() <= maxlen) { output = input; } else { output = input.substr(0, maxlen); string::size_type space = output.find_last_of(cstr_SEPAR); // Original version only truncated at space if space was found after // maxlen/2. But we HAVE to truncate at space, else we'd need to do // utf8 stuff to avoid truncating at multibyte char. In any case, // not finding space means that the text probably has no value. // Except probably for Asian languages, so we may want to fix this // one day if (space == string::npos) { output.erase(); } else { output.erase(space); } } return output; } void utf8truncate(string &s, int maxlen) { if (s.size() <= string::size_type(maxlen)) return; Utf8Iter iter(s); int pos = 0; while (iter++ != string::npos) if (iter.getBpos() < string::size_type(maxlen)) pos = iter.getBpos(); s.erase(pos); } // Escape things that would look like markup string escapeHtml(const string &in) { string out; for (string::size_type pos = 0; pos < in.length(); pos++) { switch(in.at(pos)) { case '<': out += "<"; break; case '&': out += "&"; break; default: out += in.at(pos); } } return out; } string escapeShell(const string &in) { string out; out += "\""; for (string::size_type pos = 0; pos < in.length(); pos++) { switch(in.at(pos)) { case '$': out += "\\$"; break; case '`': out += "\\`"; break; case '"': out += "\\\""; break; case '\n': out += "\\\n"; break; case '\\': out += "\\\\"; break; default: out += in.at(pos); } } out += "\""; return out; } // Substitute printf-like percent cmds inside a string bool pcSubst(const string& in, string& out, map& subs) { string::const_iterator it; for (it = in.begin(); it != in.end();it++) { if (*it == '%') { if (++it == in.end()) { out += '%'; break; } if (*it == '%') { out += '%'; continue; } map::iterator tr; if ((tr = subs.find(*it)) != subs.end()) { out += tr->second; } else { // We used to do "out += *it;" here but this does not make // sense } } else { out += *it; } } return true; } bool pcSubst(const string& in, string& out, map& subs) { out.erase(); string::size_type i; for (i = 0; i < in.size(); i++) { if (in[i] == '%') { if (++i == in.size()) { out += '%'; break; } if (in[i] == '%') { out += '%'; continue; } string key = ""; if (in[i] == '(') { if (++i == in.size()) { out += string("%("); break; } string::size_type j = in.find_first_of(")", i); if (j == string::npos) { // ??concatenate remaining part and stop out += in.substr(i-2); break; } key = in.substr(i, j-i); i = j; } else { key = in[i]; } map::iterator tr; if ((tr = subs.find(key)) != subs.end()) { out += tr->second; } else { // Substitute to nothing, that's the reasonable thing to do // instead of keeping the %(key) // out += key.size()==1? key : string("(") + key + string(")"); } } else { out += in[i]; } } return true; } // Convert byte count into unit (KB/MB...) appropriate for display string displayableBytes(off_t size) { char sizebuf[50]; const char *unit; if (size < 1000) { unit = " B "; } else if (size < 1E6) { unit = " KB "; size /= 1000; } else if (size < 1E9) { unit = " MB "; size /= (1E6); } else { unit = " GB "; size /= (1E9); } sprintf(sizebuf, OFFTPC "%s", size, unit); return string(sizebuf); } string breakIntoLines(const string& in, unsigned int ll, unsigned int maxlines) { string query = in; string oq; unsigned int nlines = 0; while (query.length() > 0) { string ss = query.substr(0, ll); if (ss.length() == ll) { string::size_type pos = ss.find_last_of(" "); if (pos == string::npos) { pos = query.find_first_of(" "); if (pos != string::npos) ss = query.substr(0, pos+1); else ss = query; } else { ss = ss.substr(0, pos+1); } } // This cant happen, but anyway. Be very sure to avoid an infinite loop if (ss.length() == 0) { oq = query; break; } oq += ss + "\n"; if (nlines++ >= maxlines) { oq += " ... \n"; break; } query= query.substr(ss.length()); } return oq; } //////////////////// // Internal redefinition of system time interface to help with dependancies struct m_timespec { time_t tv_sec; long tv_nsec; }; #ifndef CLOCK_REALTIME #define CLOCK_REALTIME 1 #endif #define MILLIS(TV) ( (long)(((TV).tv_sec - m_secs) * 1000 + \ ((TV).tv_nsec - m_nsecs) / 1000000)) #define MICROS(TV) ( (long)(((TV).tv_sec - m_secs) * 1000000 + \ ((TV).tv_nsec - m_nsecs) / 1000)) // We use gettimeofday instead of clock_gettime for now and get only // uS resolution, because clock_gettime is more configuration trouble // than it's worth static void gettime(int, struct m_timespec *ts) { struct timeval tv; gettimeofday(&tv, 0); ts->tv_sec = tv.tv_sec; ts->tv_nsec = tv.tv_usec * 1000; } ///// End system interface // Note: this not protected against multithread access and not reentrant, but // this is mostly debug code, and it won't crash, just show bad results. Also // the frozen thing is not used that much static m_timespec frozen_tv; void Chrono::refnow() { gettime(CLOCK_REALTIME, &frozen_tv); } Chrono::Chrono() { restart(); } // Reset and return value before rest in milliseconds long Chrono::restart() { struct m_timespec tv; gettime(CLOCK_REALTIME, &tv); long ret = MILLIS(tv); m_secs = tv.tv_sec; m_nsecs = tv.tv_nsec; return ret; } // Get current timer value, milliseconds long Chrono::millis(int frozen) { if (frozen) { return MILLIS(frozen_tv); } else { struct m_timespec tv; gettime(CLOCK_REALTIME, &tv); return MILLIS(tv); } } // long Chrono::micros(int frozen) { if (frozen) { return MICROS(frozen_tv); } else { struct m_timespec tv; gettime(CLOCK_REALTIME, &tv); return MICROS(tv); } } float Chrono::secs(int frozen) { struct m_timespec tv; gettime(CLOCK_REALTIME, &tv); float secs = (float)(frozen?frozen_tv.tv_sec:tv.tv_sec - m_secs); float nsecs = (float)(frozen?frozen_tv.tv_nsec:tv.tv_nsec - m_nsecs); return secs + nsecs * 1e-9; } // Date is Y[-M[-D]] static bool parsedate(vector::const_iterator& it, vector::const_iterator end, DateInterval *dip) { dip->y1 = dip->m1 = dip->d1 = dip->y2 = dip->m2 = dip->d2 = 0; if (it->length() > 4 || !it->length() || it->find_first_not_of("0123456789") != string::npos) { return false; } if (it == end || sscanf(it++->c_str(), "%d", &dip->y1) != 1) { return false; } if (it == end || *it == "/") return true; if (*it++ != "-") { return false; } if (it->length() > 2 || !it->length() || it->find_first_not_of("0123456789") != string::npos) { return false; } if (it == end || sscanf(it++->c_str(), "%d", &dip->m1) != 1) { return false; } if (it == end || *it == "/") return true; if (*it++ != "-") { return false; } if (it->length() > 2 || !it->length() || it->find_first_not_of("0123456789") != string::npos) { return false; } if (it == end || sscanf(it++->c_str(), "%d", &dip->d1) != 1) { return -1; } return true; } // Called with the 'P' already processed. Period ends at end of string // or at '/'. We dont' do a lot effort at validation and will happily // accept 10Y1Y4Y (the last wins) static bool parseperiod(vector::const_iterator& it, vector::const_iterator end, DateInterval *dip) { dip->y1 = dip->m1 = dip->d1 = dip->y2 = dip->m2 = dip->d2 = 0; while (it != end) { int value; if (it->find_first_not_of("0123456789") != string::npos) { return false; } if (sscanf(it++->c_str(), "%d", &value) != 1) { return false; } if (it == end || it->empty()) return false; switch (it->at(0)) { case 'Y': case 'y': dip->y1 = value;break; case 'M': case 'm': dip->m1 = value;break; case 'D': case 'd': dip->d1 = value;break; default: return false; } it++; if (it == end) return true; if (*it == "/") { return true; } } return true; } static void cerrdip(const string& s, DateInterval *dip) { cerr << s << dip->y1 << "-" << dip->m1 << "-" << dip->d1 << "/" << dip->y2 << "-" << dip->m2 << "-" << dip->d2 << endl; } // Compute date + period. Won't work out of the unix era. // or pre-1970 dates. Just convert everything to unixtime and // seconds (with average durations for months/years), add and convert // back static bool addperiod(DateInterval *dp, DateInterval *pp) { struct tm tm; // Create a struct tm with possibly non normalized fields and let // timegm sort it out memset(&tm, 0, sizeof(tm)); tm.tm_year = dp->y1 - 1900 + pp->y1; tm.tm_mon = dp->m1 + pp->m1 -1; tm.tm_mday = dp->d1 + pp->d1; #ifdef sun time_t tres = mktime(&tm); localtime_r(&tres, &tm); #else time_t tres = timegm(&tm); gmtime_r(&tres, &tm); #endif dp->y1 = tm.tm_year + 1900; dp->m1 = tm.tm_mon + 1; dp->d1 = tm.tm_mday; //cerrdip("Addperiod return", dp); return true; } int monthdays(int mon, int year) { switch (mon) { case 2: return (year % 4) == 0 ? 29 : 28; case 1:case 3:case 5:case 7: case 8:case 10:case 12: return 31; default: return 30; } } bool parsedateinterval(const string& s, DateInterval *dip) { vector vs; dip->y1 = dip->m1 = dip->d1 = dip->y2 = dip->m2 = dip->d2 = 0; DateInterval p1, p2, d1, d2; p1 = p2 = d1 = d2 = *dip; bool hasp1 = false, hasp2 = false, hasd1 = false, hasd2 = false, hasslash = false; if (!stringToStrings(s, vs, "PYMDpymd-/")) { return false; } if (vs.empty()) return false; vector::const_iterator it = vs.begin(); if (*it == "P" || *it == "p") { it++; if (!parseperiod(it, vs.end(), &p1)) { return false; } hasp1 = true; //cerrdip("p1", &p1); p1.y1 = -p1.y1; p1.m1 = -p1.m1; p1.d1 = -p1.d1; } else if (*it == "/") { hasslash = true; goto secondelt; } else { if (!parsedate(it, vs.end(), &d1)) { return false; } hasd1 = true; } // Got one element and/or / secondelt: if (it != vs.end()) { if (*it != "/") { return false; } hasslash = true; it++; if (it == vs.end()) { // ok } else if (*it == "P" || *it == "p") { it++; if (!parseperiod(it, vs.end(), &p2)) { return false; } hasp2 = true; } else { if (!parsedate(it, vs.end(), &d2)) { return false; } hasd2 = true; } } // 2 periods dont' make sense if (hasp1 && hasp2) { return false; } // Nothing at all doesn't either if (!hasp1 && !hasd1 && !hasp2 && !hasd2) { return false; } // Empty part means today IF other part is period, else means // forever (stays at 0) time_t now = time(0); struct tm *tmnow = gmtime(&now); if ((!hasp1 && !hasd1) && hasp2) { d1.y1 = 1900 + tmnow->tm_year; d1.m1 = tmnow->tm_mon + 1; d1.d1 = tmnow->tm_mday; hasd1 = true; } else if ((!hasp2 && !hasd2) && hasp1) { d2.y1 = 1900 + tmnow->tm_year; d2.m1 = tmnow->tm_mon + 1; d2.d1 = tmnow->tm_mday; hasd2 = true; } // Incomplete dates have different meanings depending if there is // a period or not (actual or infinite indicated by a / + empty) // // If there is no explicit period, an incomplete date indicates a // period of the size of the uncompleted elements. Ex: 1999 // actually means 1999/P12M // // If there is a period, the incomplete date should be extended // to the beginning or end of the unspecified portion. Ex: 1999/ // means 1999-01-01/ and /1999 means /1999-12-31 if (hasd1) { if (!(hasslash || hasp2)) { if (d1.m1 == 0) { p2.m1 = 12; d1.m1 = 1; d1.d1 = 1; } else if (d1.d1 == 0) { d1.d1 = 1; p2.d1 = monthdays(d1.m1, d1.y1); } hasp2 = true; } else { if (d1.m1 == 0) { d1.m1 = 1; d1.d1 = 1; } else if (d1.d1 == 0) { d1.d1 = 1; } } } // if hasd2 is true we had a / if (hasd2) { if (d2.m1 == 0) { d2.m1 = 12; d2.d1 = 31; } else if (d2.d1 == 0) { d2.d1 = monthdays(d2.m1, d2.y1); } } if (hasp1) { // Compute d1 d1 = d2; if (!addperiod(&d1, &p1)) { return false; } } else if (hasp2) { // Compute d2 d2 = d1; if (!addperiod(&d2, &p2)) { return false; } } dip->y1 = d1.y1; dip->m1 = d1.m1; dip->d1 = d1.d1; dip->y2 = d2.y1; dip->m2 = d2.m1; dip->d2 = d2.d1; return true; } void catstrerror(string *reason, const char *what, int _errno) { if (!reason) return; if (what) reason->append(what); reason->append(": errno: "); char nbuf[20]; sprintf(nbuf, "%d", _errno); reason->append(nbuf); reason->append(" : "); #ifdef sun // Note: sun strerror is noted mt-safe ?? reason->append(strerror(_errno)); #else #define ERRBUFSZ 200 char errbuf[ERRBUFSZ]; // There are 2 versions of strerror_r. // - The GNU one returns a pointer to the message (maybe // static storage or supplied buffer). // - The POSIX one always stores in supplied buffer and // returns 0 on success. As the possibility of error and // error code are not specified, we're basically doomed // cause we can't use a test on the 0 value to know if we // were returned a pointer... // Also couldn't find an easy way to disable the gnu version without // changing the cxxflags globally, so forget it. Recent gnu lib versions // normally default to the posix version. // At worse we get no message at all here. errbuf[0] = 0; strerror_r(_errno, errbuf, ERRBUFSZ); reason->append(errbuf); #endif } #else #include using namespace std; #include #include "smallut.h" struct spair { const char *s1; const char *s2; }; struct spair pairs[] = { {"", ""}, {"", "a"}, {"a", ""}, {"a", "a"}, {"A", "a"}, {"a", "A"}, {"A", "A"}, {"12", "12"}, {"a", "ab"}, {"ab", "a"}, {"A", "Ab"}, {"a", "Ab"}, }; int npairs = sizeof(pairs) / sizeof(struct spair); struct spair suffpairs[] = { {"", ""}, {"", "a"}, {"a", ""}, {"a", "a"}, {"toto.txt", ".txt"}, {"TXT", "toto.txt"}, {"toto.txt", ".txt1"}, {"toto.txt1", ".txt"}, }; int nsuffpairs = sizeof(suffpairs) / sizeof(struct spair); // Periods test strings const char* periods[] = { "2001", // Year 2001 "2001/", // 2001 or later "2001/P3Y", // 2001 -> 2004 or 2005, ambiguous "2001-01-01/P3Y", // 01-2001 -> 01 2004 "2001-03-03/2001-05-01", // Explicit one "P3M/", // 3 months ago to now "P1Y1M/2001-03-01", // 2000-02-01/2001-03-01 "/2001", // From the epoch to the end of 2001 }; const int nperiods = sizeof(periods) / sizeof(char*); const char *thisprog; static void cerrdip(const string& s, DateInterval *dip) { cerr << s << dip->y1 << "-" << dip->m1 << "-" << dip->d1 << "/" << dip->y2 << "-" << dip->m2 << "-" << dip->d2 << endl; } int main(int argc, char **argv) { thisprog = *argv++;argc--; #if 0 if (argc <=0 ) { cerr << "Usage: smallut " << endl; exit(1); } string s = *argv++;argc--; vector vs; if (!stringToStrings(s, vs, ":-()")) { cerr << "Bad entry" << endl; exit(1); } for (vector::const_iterator it = vs.begin(); it != vs.end(); it++) cerr << "[" << *it << "] "; cerr << endl; exit(0); #elif 0 if (argc <=0 ) { cerr << "Usage: smallut " << endl; exit(1); } string s = *argv++;argc--; DateInterval di; if (!parsedateinterval(s, &di)) { cerr << "Parse failed" << endl; exit(1); } cerrdip("", &di); exit(0); #elif 0 DateInterval di; for (int i = 0; i < nperiods; i++) { if (!parsedateinterval(periods[i], &di)) { cerr << "Parsing failed for [" << periods[i] << "]" << endl; } else { cerrdip(string(periods[i]).append(" : "), &di); } } exit(0); #elif 0 for (int i = 0; i < npairs; i++) { { int c = stringicmp(pairs[i].s1, pairs[i].s2); printf("'%s' %s '%s' ", pairs[i].s1, c == 0 ? "==" : c < 0 ? "<" : ">", pairs[i].s2); } { int cl = stringlowercmp(pairs[i].s1, pairs[i].s2); printf("L '%s' %s '%s' ", pairs[i].s1, cl == 0 ? "==" : cl < 0 ? "<" : ">", pairs[i].s2); } { int cu = stringuppercmp(pairs[i].s1, pairs[i].s2); printf("U '%s' %s '%s' ", pairs[i].s1, cu == 0 ? "==" : cu < 0 ? "<" : ">", pairs[i].s2); } printf("\n"); } #elif 0 for (int i = 0; i < nsuffpairs; i++) { int c = stringisuffcmp(suffpairs[i].s1, suffpairs[i].s2); printf("[%s] %s [%s] \n", suffpairs[i].s1, c == 0 ? "matches" : c < 0 ? "<" : ">", suffpairs[i].s2); } #elif 0 std::string testit("\303\251l\303\251gant"); for (int sz = 10; sz >= 0; sz--) { utf8truncate(testit, sz); cout << testit << endl; } #elif 0 std::string testit("ligne\ndeuxieme ligne\r3eme ligne\r\n"); cout << "[" << neutchars(testit, "\r\n") << "]" << endl; string i, o; cout << "neutchars(null) is [" << neutchars(i, "\r\n") << "]" << endl; #elif 0 map substs; substs["a"] = "A_SUBST"; substs["title"] = "TITLE_SUBST"; string in = "a: %a title: %(title) pcpc: %% %"; string out; pcSubst(in, out, substs); cout << in << " => " << out << endl; in = "unfinished: %(unfinished"; pcSubst(in, out, substs); cout << in << " => " << out << endl; in = "unfinished: %("; pcSubst(in, out, substs); cout << in << " => " << out << endl; in = "empty: %()"; pcSubst(in, out, substs); cout << in << " => " << out << endl; substs.clear(); in = "a: %a title: %(title) pcpc: %% %"; pcSubst(in, out, substs); cout << "After map clear: " << in << " => " << out << endl; #elif 1 list tokens; tokens.push_back(""); tokens.push_back("a,b"); tokens.push_back("simple value"); tokens.push_back("with \"quotes\""); string out; stringsToCSV(tokens, out); cout << "CSV line: [" << out << "]" << endl; #endif } #endif recoll-1.17.3/utils/smallut.h000644 001750 000000 00000016054 11740755063 016474 0ustar00dockeswheel000000 000000 /* 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 _SMALLUT_H_INCLUDED_ #define _SMALLUT_H_INCLUDED_ #include #include #include #include #include #include #ifndef NO_NAMESPACES using std::string; using std::list; using std::vector; using std::map; using std::set; #endif /* NO_NAMESPACES */ // Note these are all ascii routines extern int stringicmp(const string& s1, const string& s2); // For find_if etc. struct StringIcmpPred { StringIcmpPred(const string& s1) : m_s1(s1) {} bool operator()(const string& s2) { return stringicmp(m_s1, s2) == 0; } const string& m_s1; }; extern int stringlowercmp(const string& alreadylower, const string& s2); extern int stringuppercmp(const string& alreadyupper, const string& s2); extern void stringtolower(string& io); extern string stringtolower(const string& io); // Is one string the end part of the other ? extern int stringisuffcmp(const string& s1, const string& s2); // Compare charset names, removing the more common spelling variations extern bool samecharset(const string &cs1, const string &cs2); // Parse date interval specifier into pair of y,m,d dates. The format // for the time interval is based on a subset of iso 8601 with // the addition of open intervals, and removal of all time indications. // 'P' is the Period indicator, it's followed by a length in // years/months/days (or any subset thereof) // Dates: YYYY-MM-DD YYYY-MM YYYY // Periods: P[nY][nM][nD] where n is an integer value. // At least one of YMD must be specified // The separator for the interval is /. Interval examples // YYYY/ (from YYYY) YYYY-MM-DD/P3Y (3 years after date) etc. // This returns a pair of y,m,d dates. struct DateInterval { int y1;int m1;int d1; int y2;int m2;int d2; }; extern bool parsedateinterval(const string&s, DateInterval *di); extern int monthdays(int mon, int year); /** * Parse input string into list of strings. * * Token delimiter is " \t\n" except inside dquotes. dquote inside * dquotes can be escaped with \ etc... * Input is handled a byte at a time, things will work as long as space tab etc. * have the ascii values and can't appear as part of a multibyte char. utf-8 ok * but so are the iso-8859-x and surely others. addseps do have to be * single-bytes */ template bool stringToStrings(const string& s, T &tokens, const string& addseps = ""); /** * Inverse operation: */ template void stringsToString(const T &tokens, string &s); /** * Strings to CSV string. tokens containing the separator are quoted (") * " inside tokens is escaped as "" ([word "quote"] =>["word ""quote"""] */ template void stringsToCSV(const T &tokens, string &s, char sep = ','); /** * Split input string. No handling of quoting */ extern void stringToTokens(const string &s, vector &tokens, const string &delims = " \t", bool skipinit=true); /** Convert string to boolean */ extern bool stringToBool(const string &s); /** Remove instances of characters belonging to set (default {space, tab}) at beginning and end of input string */ extern void trimstring(string &s, const char *ws = " \t"); /** Escape things like < or & by turning them into entities */ extern string escapeHtml(const string &in); /** Replace some chars with spaces (ie: newline chars). This is not utf8-aware * so chars should only contain ascii */ extern string neutchars(const string &str, const string &chars); extern void neutchars(const string &str, string& out, const string &chars); /** Turn string into something that won't be expanded by a shell. In practise * quote with double-quotes and escape $`\ */ extern string escapeShell(const string &str); /** Truncate a string to a given maxlength, avoiding cutting off midword * if reasonably possible. */ extern string truncate_to_word(const string &input, string::size_type maxlen); /** Truncate in place in an utf8-legal way */ extern void utf8truncate(string &s, int maxlen); /** Convert byte count into unit (KB/MB...) appropriate for display */ string displayableBytes(off_t size); /** Break big string into lines */ string breakIntoLines(const string& in, unsigned int ll = 100, unsigned int maxlines= 50); /** Small utility to substitute printf-like percents cmds in a string */ bool pcSubst(const string& in, string& out, map& subs); /** Substitute printf-like percents and also %(key) */ bool pcSubst(const string& in, string& out, map& subs); /** Append system error message */ void catstrerror(string *reason, const char *what, int _errno); /** Compute times to help with perf issues */ class Chrono { public: Chrono(); /** Reset origin */ long restart(); /** Snapshot current time */ static void refnow(); /** Get current elapsed since creation or restart * * @param frozen give time since the last refnow call (this is to * allow for using one actual system call to get values from many * chrono objects, like when examining timeouts in a queue) */ long millis(int frozen = 0); long ms() {return millis();} long micros(int frozen = 0); float secs(int frozen = 0); private: long m_secs; long m_nsecs; }; /** Temp buffer with automatic deallocation */ struct TempBuf { TempBuf() : m_buf(0) {} TempBuf(int n) { m_buf = (char *)malloc(n); } ~TempBuf() { if (m_buf) free(m_buf); } char *setsize(int n) { return (m_buf = (char *)realloc(m_buf, n)); } char *buf() {return m_buf;} char *m_buf; }; inline void leftzeropad(string& s, unsigned len) { if (s.length() && s.length() < len) s = s.insert(0, len - s.length(), '0'); } #ifndef deleteZ #define deleteZ(X) {delete X;X = 0;} #endif // Code for static initialization of an stl map. Somewhat like Boost.assign. // Ref: http://stackoverflow.com/questions/138600/initializing-a-static-stdmapint-int-in-c // Example use: map m = map_list_of (1,2) (3,4) (5,6) (7,8); template class create_map { private: std::map m_map; public: create_map(const T& key, const U& val) { m_map[key] = val; } create_map& operator()(const T& key, const U& val) { m_map[key] = val; return *this; } operator std::map() { return m_map; } }; #endif /* _SMALLUT_H_INCLUDED_ */ recoll-1.17.3/utils/transcode.cpp000644 001750 000000 00000013021 11740755063 017317 0ustar00dockeswheel000000 000000 /* 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_TRANSCODE #include "autoconfig.h" #include #include #ifndef NO_NAMESPACES using std::string; #endif /* NO_NAMESPACES */ #include #include #include "transcode.h" #include "debuglog.h" #include "ptmutex.h" #ifdef RCL_ICONV_INBUF_CONST #define ICV_P2_TYPE const char** #else #define ICV_P2_TYPE char** #endif // We gain approximately 25% exec time for word at a time conversions by // caching the iconv_open thing. // // We may also lose some concurrency on multiproc because of the // necessary locking, but we only have one processing-intensive // possible thread for now (the indexing one), so this is probably not // an issue (and could be worked around with a slightly more // sohisticated approach). #define ICONV_CACHE_OPEN bool transcode(const string &in, string &out, const string &icode, const string &ocode, int *ecnt) { LOGDEB2(("Transcode: %s -> %s\n", icode.c_str(), ocode.c_str())); #ifdef ICONV_CACHE_OPEN static iconv_t ic = (iconv_t)-1; static string cachedicode; static string cachedocode; static PTMutexInit o_cachediconv_mutex; PTMutexLocker locker(o_cachediconv_mutex); #else iconv_t ic; #endif bool ret = false; const int OBSIZ = 8192; char obuf[OBSIZ], *op; bool icopen = false; int mecnt = 0; out.erase(); size_t isiz = in.length(); out.reserve(isiz); const char *ip = in.c_str(); #ifdef ICONV_CACHE_OPEN if (cachedicode.compare(icode) || cachedocode.compare(ocode)) { if (ic != (iconv_t)-1) { iconv_close(ic); ic = (iconv_t)-1; } #endif if((ic = iconv_open(ocode.c_str(), icode.c_str())) == (iconv_t)-1) { out = string("iconv_open failed for ") + icode + " -> " + ocode; #ifdef ICONV_CACHE_OPEN cachedicode.erase(); cachedocode.erase(); #endif goto error; } #ifdef ICONV_CACHE_OPEN cachedicode.assign(icode); cachedocode.assign(ocode); } #endif icopen = true; while (isiz > 0) { size_t osiz; op = obuf; osiz = OBSIZ; if(iconv(ic, (ICV_P2_TYPE)&ip, &isiz, &op, &osiz) == (size_t)-1 && errno != E2BIG) { #if 0 out.erase(); out = string("iconv failed for ") + icode + " -> " + ocode + " : " + strerror(errno); #endif if (errno == EILSEQ) { LOGDEB1(("transcode:iconv: bad input seq.: shift, retry\n")); LOGDEB1((" Input consumed %d output produced %d\n", ip - in.c_str(), out.length() + OBSIZ - osiz)); out.append(obuf, OBSIZ - osiz); out += "?"; mecnt++; ip++;isiz--; continue; } // Normally only EINVAL is possible here: incomplete // multibyte sequence at the end. This is not fatal. Any // other is supposedly impossible, we return an error if (errno == EINVAL) goto out; else goto error; } out.append(obuf, OBSIZ - osiz); } #ifndef ICONV_CACHE_OPEN icopen = false; if(iconv_close(ic) == -1) { out.erase(); out = string("iconv_close failed for ") + icode + " -> " + ocode; goto error; } #endif out: ret = true; error: if (icopen) { #ifndef ICONV_CACHE_OPEN iconv_close(ic); #else // Just reset conversion iconv(ic, 0, 0, 0, 0); #endif } if (mecnt) LOGDEB(("transcode: [%s]->[%s] %d errors\n", icode.c_str(), ocode.c_str(), mecnt)); if (ecnt) *ecnt = mecnt; return ret; } #else #include #include #include #include #include #include #include using namespace std; #include "readfile.h" #include "transcode.h" // Repeatedly transcode a small string for timing measurements static const string testword("\xc3\xa9\x6c\x69\x6d\x69\x6e\xc3\xa9\xc3\xa0"); // Without cache 10e6 reps on y -> 6.68 // With cache -> 4.73 // With cache and lock -> 4.9 void looptest() { cout << testword << endl; string out; for (int i = 0; i < 10*1000*1000; i++) { if (!transcode(testword, out, "UTF-8", "UTF-16BE")) { cerr << "Transcode failed" << endl; break; } } } int main(int argc, char **argv) { #if 0 looptest(); exit(0); #endif if (argc != 5) { cerr << "Usage: transcode ifilename icode ofilename ocode" << endl; exit(1); } const string ifilename = argv[1]; const string icode = argv[2]; const string ofilename = argv[3]; const string ocode = argv[4]; string text; if (!file_to_string(ifilename, text)) { cerr << "Couldnt read file, errno " << errno << endl; exit(1); } string out; if (!transcode(text, out, icode, ocode)) { cerr << out << endl; exit(1); } int fd = open(ofilename.c_str(), O_CREAT|O_TRUNC|O_WRONLY, 0666); if (fd < 0) { perror("Open/create output"); exit(1); } if (write(fd, out.c_str(), out.length()) != (int)out.length()) { perror("write"); exit(1); } close(fd); exit(0); } #endif recoll-1.17.3/utils/transcode.h000644 001750 000000 00000002562 11740755063 016774 0ustar00dockeswheel000000 000000 /* 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 _TRANSCODE_H_INCLUDED_ #define _TRANSCODE_H_INCLUDED_ /** * */ #include /** * c++ized interface to iconv * * @param in input string * @param out output string * @param icode input encoding * @param ocode input encoding * @param ecnt (output) number of transcoding errors * @return true if transcoding succeeded, even with errors. False for global * errors like unknown charset names */ extern bool transcode(const std::string &in, std::string &out, const std::string &icode, const std::string &ocode, int *ecnt = 0); #endif /* _TRANSCODE_H_INCLUDED_ */ recoll-1.17.3/utils/utf8iter.cpp000644 001750 000000 00000010156 11740755063 017115 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #include #include #include "debuglog.h" #include "transcode.h" #ifndef NO_NAMESPACES using namespace std; #endif /* NO_NAMESPACES */ #define UTF8ITER_CHECK #include "utf8iter.h" #include "readfile.h" const char *thisprog; static char usage [] = "utf8iter [opts] infile outfile\n" " converts infile to 32 bits unicode (processor order), for testing\n" "-v : print stuff as we go\n" ; void Usage() { fprintf(stderr, "%s:%s\n", thisprog, usage); exit(1); } static int op_flags; #define OPT_v 0x2 int main(int argc, char **argv) { thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) Usage(); while (**argv) switch (*(*argv)++) { case 'v': op_flags |= OPT_v; break; default: Usage(); break; } argc--;argv++; } if (argc != 2) { Usage(); } const char *infile = *argv++;argc--; const char *outfile = *argv++;argc--; string in; if (!file_to_string(infile, in)) { cerr << "Cant read file\n" << endl; exit(1); } vectorucsout1; string out, out1; Utf8Iter it(in); FILE *fp = fopen(outfile, "w"); if (fp == 0) { fprintf(stderr, "cant create %s\n", outfile); exit(1); } int nchars = 0; for (;!it.eof(); it++) { unsigned int value = *it; if (value == (unsigned int)-1) { cerr << "Conversion error occurred\n" << endl; exit(1); } if (op_flags & OPT_v) { printf("Value: 0x%x", value); if (value < 0x7f) printf(" (%c) ", value); printf("\n"); } // UTF-32LE or BE array ucsout1.push_back(value); // UTF-32LE or BE file fwrite(&value, 4, 1, fp); // Reconstructed utf8 strings (2 methods) if (!it.appendchartostring(out)) break; // conversion to string out1 += it; // fprintf(stderr, "%s", string(it).c_str()); nchars++; } fclose(fp); fprintf(stderr, "nchars %d\n", nchars); if (in.compare(out)) { fprintf(stderr, "error: out != in\n"); exit(1); } if (in != out1) { fprintf(stderr, "error: out1 != in\n"); exit(1); } // Rewind and do it a second time vectorucsout2; it.rewind(); for (int i = 0; ; i++) { unsigned int value; if ((value = it[i]) == (unsigned int)-1) { fprintf(stderr, "%d chars\n", i); break; } it++; ucsout2.push_back(value); } if (ucsout1 != ucsout2) { fprintf(stderr, "error: ucsout1 != ucsout2\n"); exit(1); } ucsout2.clear(); int ercnt; const char *encoding = "UTF-32LE"; // note : use BE on high-endian machine string ucs, ucs1; for (vector::iterator it = ucsout1.begin(); it != ucsout1.end(); it++) { unsigned int i = *it; ucs.append((const char *)&i, 4); } if (!transcode(ucs, ucs1, encoding, encoding, &ercnt) || ercnt) { fprintf(stderr, "Transcode check failed, ercount: %d\n", ercnt); exit(1); } if (ucs.compare(ucs1)) { fprintf(stderr, "error: ucsout1 != ucsout2 after iconv\n"); exit(1); } if (!transcode(ucs, ucs1, encoding, "UTF-8", &ercnt) || ercnt) { fprintf(stderr, "Transcode back to utf-8 check failed, ercount: %d\n", ercnt); exit(1); } if (ucs1.compare(in)) { fprintf(stderr, "Transcode back to utf-8 compare to in failed\n"); exit(1); } exit(0); } recoll-1.17.3/utils/utf8iter.h000644 001750 000000 00000014760 11740755063 016567 0ustar00dockeswheel000000 000000 /* 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 _UTF8ITER_H_INCLUDED_ #define _UTF8ITER_H_INCLUDED_ #ifdef UTF8ITER_CHECK #include "assert.h" #endif /** * A small helper class to iterate over utf8 strings. This is not an * STL iterator and does not much error checking. It is designed purely * for recoll usage, where the utf-8 string comes out of iconv in most cases * and is assumed legal. We just try to catch cases where there would be * a risk of crash. */ class Utf8Iter { public: Utf8Iter(const string &in) : m_s(in), m_cl(0), m_pos(0), m_charpos(0), m_error(false) { update_cl(); } const string& buffer() const {return m_s;} void rewind() { m_cl = 0; m_pos = 0; m_charpos = 0; m_error = false; update_cl(); } /** "Direct" access. Awfully inefficient as we skip from start or current * position at best. This can only be useful for a lookahead from the * current position */ unsigned int operator[](unsigned int charpos) const { string::size_type mypos = 0; unsigned int mycp = 0; if (charpos >= m_charpos) { mypos = m_pos; mycp = m_charpos; } int l; while (mypos < m_s.length() && mycp != charpos) { l = get_cl(mypos); if (l <= 0) return (unsigned int)-1; mypos += l; ++mycp; } if (mypos < m_s.length() && mycp == charpos) { l = get_cl(mypos); if (poslok(mypos, l)) return getvalueat(mypos, get_cl(mypos)); } return (unsigned int)-1; } /** Increment current position to next utf-8 char */ string::size_type operator++(int) { // Note: m_cl may be zero at eof if user's test not right // this shouldn't crash the program until actual data access #ifdef UTF8ITER_CHECK assert(m_cl != 0); #endif if (m_cl <= 0) return string::npos; m_pos += m_cl; m_charpos++; update_cl(); return m_pos; } /** operator* returns the ucs4 value as a machine integer*/ unsigned int operator*() { #ifdef UTF8ITER_CHECK assert(m_cl != 0); #endif return getvalueat(m_pos, m_cl); } /** Append current utf-8 possibly multi-byte character to string param. This needs to be fast. No error checking. */ unsigned int appendchartostring(string &out) { #ifdef UTF8ITER_CHECK assert(m_cl != 0); #endif out.append(&m_s[m_pos], m_cl); return m_cl; } /** Return current character as string */ operator string() { #ifdef UTF8ITER_CHECK assert(m_cl != 0); #endif return m_s.substr(m_pos, m_cl); } bool eof() { return m_pos == m_s.length(); } bool error() { return m_error; } /** Return current byte offset in input string */ string::size_type getBpos() const { return m_pos; } /** Return current character length */ string::size_type getBlen() const { return m_cl; } /** Return current unicode character offset in input string */ string::size_type getCpos() const { return m_charpos; } private: // String we're working with const string& m_s; // Character length at current position. A value of zero indicates // an error. unsigned int m_cl; // Current byte offset in string. string::size_type m_pos; // Current character position unsigned int m_charpos; // Am I ok ? mutable bool m_error; // Check position and cl against string length bool poslok(string::size_type p, int l) const { #ifdef UTF8ITER_CHECK assert(p != string::npos && l > 0 && p + l <= m_s.length()); #endif return p != string::npos && l > 0 && p + l <= m_s.length(); } // Update current char length in object state, minimum checking // for errors inline void update_cl() { m_cl = 0; if (m_pos >= m_s.length()) return; m_cl = get_cl(m_pos); if (!poslok(m_pos, m_cl)) { // Used to set eof here for safety, but this is bad because it // basically prevents the caller to discriminate error and eof. // m_pos = m_s.length(); m_cl = 0; m_error = true; } } // Get character byte length at specified position. Returns 0 for error. inline int get_cl(string::size_type p) const { unsigned int z = (unsigned char)m_s[p]; if (z <= 127) { return 1; } else if ((z & 224) == 192) { return 2; } else if ((z & 240) == 224) { return 3; } else if ((z & 248) == 240) { return 4; } #ifdef UTF8ITER_CHECK assert(z <= 127 || (z & 224) == 192 || (z & 240) == 224 || (z & 248) == 240); #endif return 0; } // Compute value at given position. No error checking. inline unsigned int getvalueat(string::size_type p, int l) const { switch (l) { case 1: #ifdef UTF8ITER_CHECK assert((unsigned char)m_s[p] < 128); #endif return (unsigned char)m_s[p]; case 2: #ifdef UTF8ITER_CHECK assert( ((unsigned char)m_s[p] & 224) == 192 && ((unsigned char)m_s[p+1] & 192) == 128 ); #endif return ((unsigned char)m_s[p] - 192) * 64 + (unsigned char)m_s[p+1] - 128 ; case 3: #ifdef UTF8ITER_CHECK assert( (((unsigned char)m_s[p]) & 240) == 224 && (((unsigned char)m_s[p+1]) & 192) == 128 && (((unsigned char)m_s[p+2]) & 192) == 128 ); #endif return ((unsigned char)m_s[p] - 224) * 4096 + ((unsigned char)m_s[p+1] - 128) * 64 + (unsigned char)m_s[p+2] - 128; case 4: #ifdef UTF8ITER_CHECK assert( (((unsigned char)m_s[p]) & 248) == 240 && (((unsigned char)m_s[p+1]) & 192) == 128 && (((unsigned char)m_s[p+2]) & 192) == 128 && (((unsigned char)m_s[p+3]) & 192) == 128 ); #endif return ((unsigned char)m_s[p]-240)*262144 + ((unsigned char)m_s[p+1]-128)*4096 + ((unsigned char)m_s[p+2]-128)*64 + (unsigned char)m_s[p+3]-128; default: #ifdef UTF8ITER_CHECK assert(l <= 4); #endif m_error = true; return (unsigned int)-1; } } }; #endif /* _UTF8ITER_H_INCLUDED_ */ recoll-1.17.3/utils/utf8testin.txt000644 001750 000000 00000033350 11740755063 017516 0ustar00dockeswheel000000 000000 UTF-8 encoded sample plain-text file ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ Markus Kuhn [ˈmaʳkÊŠs kuËn] — 2002-07-25 The ASCII compatible UTF-8 encoding used in this plain-text file is defined in Unicode, ISO 10646-1, and RFC 2279. Using Unicode/UTF-8, you can write in emails and source code things such as Mathematics and sciences: ∮ Eâ‹…da = Q, n → ∞, ∑ f(i) = ∠g(i), ⎧⎡⎛┌─────â”⎞⎤⎫ ⎪⎢⎜│a²+b³ ⎟⎥⎪ ∀x∈â„: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ ⎪⎢⎜⎷ c₈ ⎟⎥⎪ â„• ⊆ â„•â‚€ ⊂ ℤ ⊂ ℚ ⊂ ℠⊂ â„‚, ⎨⎢⎜ ⎟⎥⎬ ⎪⎢⎜ ∞ ⎟⎥⎪ ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ ⎪⎢⎜ ⎳aâ±-bâ±âŽŸâŽ¥âŽª 2Hâ‚‚ + Oâ‚‚ ⇌ 2Hâ‚‚O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣âŽi=1 ⎠⎦⎭ Linguistics and dictionaries: ði ıntəˈnæʃənÉ™l fəˈnÉ›tık É™soÊŠsiˈeıʃn Y [ˈÊpsilÉ”n], Yen [jÉ›n], Yoga [ˈjoËgÉ‘] APL: ((Vâ³V)=â³â´V)/Vâ†,V ⌷â†â³â†’â´âˆ†âˆ‡âŠƒâ€¾âŽâ•⌈ Nicer typography in plain text files: â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•— â•‘ â•‘ â•‘ • ‘single’ and “double†quotes â•‘ â•‘ â•‘ â•‘ • Curly apostrophes: “We’ve been here†║ â•‘ â•‘ â•‘ • Latin-1 apostrophe and accents: '´` â•‘ â•‘ â•‘ â•‘ • ‚deutsche‘ „Anführungszeichen“ â•‘ â•‘ â•‘ â•‘ • †, ‡, ‰, •, 3–4, —, −5/+5, â„¢, … â•‘ â•‘ â•‘ â•‘ • ASCII safety test: 1lI|, 0OD, 8B â•‘ â•‘ ╭─────────╮ â•‘ â•‘ • the euro symbol: │ 14.95 € │ â•‘ â•‘ ╰─────────╯ â•‘ ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â• Combining characters: STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ Greek (in Polytonic): The Greek anthem: Σὲ γνωÏίζω ἀπὸ τὴν κόψη τοῦ σπαθιοῦ τὴν Ï„ÏομεÏá½µ, σὲ γνωÏίζω ἀπὸ τὴν ὄψη ποὺ μὲ βία μετÏάει τὴ γῆ. ᾿Απ᾿ τὰ κόκκαλα βγαλμένη τῶν ῾Ελλήνων τὰ ἱεÏá½± καὶ σὰν Ï€Ïῶτα ἀνδÏειωμένη χαῖÏε, ὦ χαῖÏε, ᾿ΕλευθεÏιά! From a speech of Demosthenes in the 4th century BC: Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι, ὅταν τ᾿ εἰς τὰ Ï€Ïάγματα ἀποβλέψω καὶ ὅταν Ï€Ïὸς τοὺς λόγους οὓς ἀκούω· τοὺς μὲν Î³á½°Ï Î»á½¹Î³Î¿Ï…Ï‚ πεÏá½¶ τοῦ τιμωÏήσασθαι Φίλιππον á½Ïá¿¶ γιγνομένους, τὰ δὲ Ï€Ïάγματ᾿ εἰς τοῦτο Ï€Ïοήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αá½Ï„οὶ Ï€ÏότεÏον κακῶς σκέψασθαι δέον. οá½Î´á½³Î½ οὖν ἄλλο μοι δοκοῦσιν οἱ τὰ τοιαῦτα λέγοντες á¼¢ τὴν ὑπόθεσιν, πεÏá½¶ á¼§Ï‚ βουλεύεσθαι, οá½Ï‡á½¶ τὴν οὖσαν παÏιστάντες ὑμῖν á¼Î¼Î±Ïτάνειν. á¼Î³á½¼ δέ, ὅτι μέν ποτ᾿ á¼Î¾á¿†Î½ τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον τιμωÏήσασθαι, καὶ μάλ᾿ ἀκÏιβῶς οἶδα· á¼Ï€á¾¿ á¼Î¼Î¿á¿¦ γάÏ, οὠπάλαι γέγονεν ταῦτ᾿ ἀμφότεÏα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν Ï€Ïολαβεῖν ἡμῖν εἶναι τὴν Ï€Ïώτην, ὅπως τοὺς συμμάχους σώσομεν. á¼á½°Î½ Î³á½°Ï Ï„Î¿á¿¦Ï„Î¿ βεβαίως ὑπάÏξῃ, τότε καὶ πεÏá½¶ τοῦ τίνα τιμωÏήσεταί τις καὶ ὃν Ï„Ïόπον á¼Î¾á½³ÏƒÏ„αι σκοπεῖν· Ï€Ïὶν δὲ τὴν á¼€Ïχὴν á½€Ïθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι πεÏá½¶ τῆς τελευτῆς á½Î½Ï„ινοῦν ποιεῖσθαι λόγον. Δημοσθένους, Γ´ ᾿Ολυνθιακὸς Georgian: From a Unicode conference invitation: გთხáƒáƒ•თ áƒáƒ®áƒšáƒáƒ•ე გáƒáƒ˜áƒáƒ áƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ Unicode-ის მეáƒáƒ—ე სáƒáƒ”რთáƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ კáƒáƒœáƒ¤áƒ”რენციáƒáƒ–ე დáƒáƒ¡áƒáƒ¡áƒ¬áƒ áƒ”ბáƒáƒ“, რáƒáƒ›áƒ”ლიც გáƒáƒ˜áƒ›áƒáƒ áƒ—ებრ10-12 მáƒáƒ áƒ¢áƒ¡, ქ. მáƒáƒ˜áƒœáƒªáƒ¨áƒ˜, გერმáƒáƒœáƒ˜áƒáƒ¨áƒ˜. კáƒáƒœáƒ¤áƒ”რენცირშეჰკრებს ერთáƒáƒ“ მსáƒáƒ¤áƒšáƒ˜áƒáƒ¡ ექსპერტებს ისეთ დáƒáƒ áƒ’ებში რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ ინტერნეტი დრUnicode-ი, ინტერნáƒáƒªáƒ˜áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ, Unicode-ის გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒš სისტემებსáƒ, დრგáƒáƒ›áƒáƒ§áƒ”ნებით პრáƒáƒ’რáƒáƒ›áƒ”ბში, შრიფტებში, ტექსტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡áƒ დრმრáƒáƒ•áƒáƒšáƒ”ნáƒáƒ•áƒáƒœ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რულ სისტემებში. Russian: From a Unicode conference invitation: ЗарегиÑтрируйтеÑÑŒ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° ДеÑÑтую Международную Конференцию по Unicode, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоÑтоитÑÑ 10-12 марта 1997 года в Майнце в Германии. ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñоберет широкий круг ÑкÑпертов по вопроÑам глобального Интернета и Unicode, локализации и интернационализации, воплощению и применению Unicode в различных операционных ÑиÑтемах и программных приложениÑÑ…, шрифтах, верÑтке и многоÑзычных компьютерных ÑиÑтемах. Thai (UCS Level 2): Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese classic 'San Gua'): [----------------------------|------------------------] ๠à¹à¸œà¹ˆà¸™à¸”ินฮั่นเสื่อมโทรมà¹à¸ªà¸™à¸ªà¸±à¸‡à¹€à¸§à¸Š พระปà¸à¹€à¸à¸¨à¸à¸­à¸‡à¸šà¸¹à¹Šà¸à¸¹à¹‰à¸‚ึ้นใหม่ สิบสองà¸à¸©à¸±à¸•ริย์à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¹à¸¥à¸–ัดไป สององค์ไซร้โง่เขลาเบาปัà¸à¸à¸² ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนัà¸à¸«à¸™à¸² โฮจิ๋นเรียà¸à¸—ัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัภเหมือนขับไสไล่เสือจาà¸à¹€à¸„หา รับหมาป่าเข้ามาเลยอาสัภà¸à¹ˆà¸²à¸¢à¸­à¹‰à¸­à¸‡à¸­à¸¸à¹‰à¸™à¸¢à¸¸à¹à¸¢à¸à¹ƒà¸«à¹‰à¹à¸•à¸à¸à¸±à¸™ ใช้สาวนั้นเป็นชนวนชื่นชวนใจ พลันลิฉุยà¸à¸¸à¸¢à¸à¸µà¸à¸¥à¸±à¸šà¸à¹ˆà¸­à¹€à¸«à¸•ุ ช่างอาเพศจริงหนาฟ้าร้องไห้ ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูà¸à¸¹à¹‰à¸šà¸£à¸£à¸¥à¸±à¸‡à¸à¹Œ ฯ (The above is a two-column text. If combining characters are handled correctly, the lines of the second column should be aligned with the | character above.) Ethiopian: Proverbs in the Amharic language: ሰማይ አይታረስ ንጉሥ አይከሰስᢠብላ ካለአእንደአባቴ በቆመጠáŠá¢ ጌጥ ያለቤቱ á‰áˆáŒ¥áŠ“ áŠá‹á¢ ደሀ በሕáˆáˆ™ ቅቤ ባይጠጣ ንጣት በገደለá‹á¢ የአá ወለáˆá‰³ በቅቤ አይታሽáˆá¢ አይጥ በበላ ዳዋ ተመታᢠሲተረጉሙ ይደረáŒáˆ™á¢ ቀስ በቀስᥠዕንá‰áˆ‹áˆ በእáŒáˆ© ይሄዳáˆá¢ ድር ቢያብር አንበሳ ያስርᢠሰዠእንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርáˆá¢ እáŒá‹œáˆ­ የከáˆá‰°á‹áŠ• ጉሮሮ ሳይዘጋዠአይድርáˆá¢ የጎረቤት ሌባᥠቢያዩት ይስቅ ባያዩት ያጠáˆá‰…ᢠሥራ ከመáታት áˆáŒ„ን ላá‹á‰³á‰µá¢ ዓባይ ማደሪያ የለá‹á¥ áŒáŠ•á‹µ ይዞ ይዞራáˆá¢ የእስላሠአገሩ መካ የአሞራ አገሩ ዋርካᢠተንጋሎ ቢተበተመáˆáˆ¶ ባá‰á¢ ወዳጅህ ማር ቢሆን ጨርስህ አትላሰá‹á¢ እáŒáˆ­áˆ…ን በáራሽህ áˆáŠ­ ዘርጋᢠRunes: ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛠᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ áš¹á›áš¦ ᚦᚪ ᚹᛖᛥᚫ (Old English, which transcribed into Latin reads 'He cwaeth that he bude thaem lande northweardum with tha Westsae.' and means 'He said that he lived in the northern land near the Western Sea.') Braille: ⡌â â §â ‘ â ¼â â ’ â¡â œâ ‡â ‘⠹⠰⠎ ⡣⠕⠌ â¡â œâ ‡â ‘â ¹ â ºâ â Ž ⠙⠑â â ™â ’ â žâ • ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ â Šâ Ž â â • ⠙⠳⠃⠞ â ±â â žâ ‘â §â » â â ƒâ ³â ž â ¹â â žâ ² ⡹⠑ ⠗⠑⠛⠊⠌⠻ â •â ‹ ⠙⠊⠎ ⠃⠥⠗⠊â â ‡ â ºâ â Ž â Žâ Šâ ›â â « ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹â â â â ‚ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ â ¥â â ™â »â žâ â …⠻⠂ â â â ™ ⠹⠑ â ¡â Šâ ‘â ‹ â â ³â —â â »â ² ⡎⠊⠗⠕⠕⠛⠑ â Žâ Šâ ›â â « â Šâ žâ ² â¡â â ™ ⡎⠊⠗⠕⠕⠛⠑⠰⠎ â â â â ‘ â ºâ â Ž ⠛⠕⠕⠙ â ¥â â •â  â °â¡¡â â â ›â ‘â ‚ â ‹â •â — â â â ¹â ¹â ”â › ⠙⠑ â ¡â •â Žâ ‘ â žâ • â â ¥â ž ⠙⠊⠎ â ™â â â ™ â žâ •â ² ⡕⠇⠙ â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² â¡â ”⠙⠖ ⡊ ⠙⠕â â °â ž â â ‘â â  â žâ • â Žâ â ¹ â ¹â â ž ⡊ â …â â ªâ ‚ â •â ‹ â â ¹ â ªâ  â …â â ªâ ‡â «â ›â ‘â ‚ â ±â â ž ⠹⠻⠑ â Šâ Ž â â œâ žâ Šâ Šâ ¥â ‡â œâ ‡â ¹ ⠙⠑â â ™ â â ƒâ ³â ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² ⡊ â â Šâ £â ž â ™â â §â ‘ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ â â ¹â Žâ ‘⠇⠋⠂ â žâ • ⠗⠑⠛⠜⠙ â  â Šâ •â ‹â ‹â ”â ¤â â â Šâ ‡ â â Ž ⠹⠑ ⠙⠑â â ™â ‘â Œ â â Šâ ‘â Šâ ‘ â •â ‹ â Šâ —â •â â â •â â ›â »â ¹ â ” ⠹⠑ â žâ —â â ™â ‘â ² ⡃⠥⠞ ⠹⠑ â ºâ Šâ Žâ ™â •â  â •â ‹ ⠳⠗ â â â Šâ ‘⠌⠕⠗⠎ â Šâ Ž â ” ⠹⠑ â Žâ Šâ â Šâ ‡â ‘â † â â â ™ â â ¹ â ¥â â ™â â ‡â ‡â ªâ « â ™â â â ™â Ž â ©â â ‡â ‡ â â •â ž ⠙⠊⠌⠥⠗⠃ â Šâ žâ ‚ â •â — ⠹⠑ ⡊⠳â â žâ —⠹⠰⠎ ⠙⠕â â ‘ â ‹â •â —â ² ⡹⠳ ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ â â »â â Šâ ž â â ‘ â žâ • â —â ‘â â ‘â â žâ ‚ â ‘â â â ™â â žâ Šâ Šâ â ‡â ‡â ¹â ‚ â ¹â â ž â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² (The first couple of paragraphs of "A Christmas Carol" by Dickens) Compact font selection example text: ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ –—‘“â€â€žâ€ â€¢â€¦â€°â„¢Å“ŠŸž€ ΑΒΓΔΩαβγδω ÐБВГДабвгд ∀∂∈â„∧∪≡∞ ↑↗↨↻⇣ â”┼╔╘░►☺♀ ï¬ï¿½â‘€â‚‚ἠḂӥẄÉËâŽ×ԱრGreetings in various languages: Hello world, ΚαλημέÏα κόσμε, コンニãƒãƒ Box drawing alignment tests: â–ˆ â–‰ â•”â•â•╦â•â•â•— ┌──┬──┠╭──┬──╮ ╭──┬──╮ â”â”â”┳â”â”┓ ┎┒â”┑ â•· â•» â”┯┓ ┌┰┠▊ ╱╲╱╲╳╳╳ ║┌─╨─â”â•‘ │╔â•â•§â•╗│ │╒â•╪â•╕│ │╓─â•─╖│ ┃┌─╂─â”┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ â”╋┥ â–‹ ╲╱╲╱╳╳╳ ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ â•¿ │┃ â”╅╆┓ ╵ ╹ â”—â”·â”› └┸┘ â–Œ ╱╲╱╲╳╳╳ â• â•¡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┠╎ â”┅┅┓ ┋ ■╲╱╲╱╳╳╳ ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â–Ž ║└─╥─┘║ │╚â•╤â•â•│ │╘â•╪â•╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ ■╚â•â•â•©â•â•╠└──┴──┘ ╰──┴──╯ ╰──┴──╯ â”—â”â”â”»â”â”â”› ▗▄▖▛▀▜ └╌╌┘ ╎ â”—â•â•â”› ┋ â–▂▃▄▅▆▇█ â–▀▘▙▄▟ recoll-1.17.3/utils/wipedir.cpp000644 001750 000000 00000007317 11740755063 017013 0ustar00dockeswheel000000 000000 /* 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_WIPEDIR #include "autoconfig.h" #include #include #include #include #include #include #include #ifndef NO_NAMESPACES using namespace std; #endif /* NO_NAMESPACES */ #include "debuglog.h" #include "pathut.h" #include "wipedir.h" int wipedir(const string& dir, bool selfalso, bool recurse) { struct stat st; int statret; int ret = -1; statret = stat(dir.c_str(), &st); if (statret == -1) { LOGERR(("wipedir: cant stat %s, errno %d\n", dir.c_str(), errno)); return -1; } if (!S_ISDIR(st.st_mode)) { LOGERR(("wipedir: %s not a directory\n", dir.c_str())); return -1; } if (access(dir.c_str(), R_OK|W_OK|X_OK) < 0) { LOGERR(("wipedir: no write access to %s\n", dir.c_str())); return -1; } DIR *d = opendir(dir.c_str()); if (d == 0) { LOGERR(("wipedir: cant opendir %s, errno %d\n", dir.c_str(), errno)); return -1; } int remaining = 0; struct dirent *ent; while ((ent = readdir(d)) != 0) { if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) continue; string fn = path_cat(dir, ent->d_name); struct stat st; int statret = stat(fn.c_str(), &st); if (statret == -1) { LOGERR(("wipedir: cant stat %s, errno %d\n", fn.c_str(), errno)); goto out; } if (S_ISDIR(st.st_mode)) { if (recurse) { int rr = wipedir(fn, true, true); if (rr == -1) goto out; else remaining += rr; } else { remaining++; } } else { if (unlink(fn.c_str()) < 0) { LOGERR(("wipedir: cant unlink %s, errno %d\n", fn.c_str(), errno)); goto out; } } } ret = remaining; if (selfalso && ret == 0) { if (rmdir(dir.c_str()) < 0) { LOGERR(("wipedir: rmdir(%s) failed, errno %d\n", dir.c_str(), errno)); ret = -1; } } out: if (d) closedir(d); return ret; } #else // FILEUT_TEST #include #include #include #include "wipedir.h" using namespace std; static const char *thisprog; static int op_flags; #define OPT_MOINS 0x1 #define OPT_r 0x2 #define OPT_s 0x4 static char usage [] = "wipedir [-r -s] topdir\n" " -r : recurse\n" " -s : also delete topdir\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } int main(int argc, const char **argv) { thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'r': op_flags |= OPT_r; break; case 's': op_flags |= OPT_s; break; default: Usage(); break; } b1: argc--; argv++; } if (argc != 1) Usage(); string dir = *argv++;argc--; bool topalso = ((op_flags&OPT_s) != 0); bool recurse = ((op_flags&OPT_r) != 0); int cnt = wipedir(dir, topalso, recurse); printf("wipedir returned %d\n", cnt); exit(0); } #endif recoll-1.17.3/utils/wipedir.h000644 001750 000000 00000002112 11740755063 016444 0ustar00dockeswheel000000 000000 /* * 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 _FILEUT_H_INCLUDED_ #define _FILEUT_H_INCLUDED_ /* Copyright (C) 2004 J.F.Dockes */ #include /** * Remove all files inside directory. * @return 0 if ok, count of remaining entries (ie: subdirs), or -1 for error */ int wipedir(const std::string& dirname, bool topalso = 0, bool recurse = 0); #endif /* _FILEUT_H_INCLUDED_ */ recoll-1.17.3/utils/workqueue.cpp000644 001750 000000 00000003345 11740755063 017374 0ustar00dockeswheel000000 000000 #include #include #include #include #include #include "workqueue.h" static char *thisprog; static char usage [] = " \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 class Task { public: Task() : m_id(o_id++) {} int m_id; static int o_id; }; int Task::o_id; void *worker(void *vtp) { fprintf(stderr, "Worker working\n"); WorkQueue *tqp = (WorkQueue *)vtp; Task tsk; for (;;) { if (!tqp->take(&tsk)) { fprintf(stderr, "Worker: take failed\n"); return (void*)0; } fprintf(stderr, "WORKER: got task %d\n", tsk.m_id); if (tsk.m_id > 20) { tqp->workerExit(); break; } } return (void*)1; } int main(int argc, char **argv) { int count = 10; 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 != 0) Usage(); WorkQueue wq(10); if (!wq.start(&worker, &wq)) { fprintf(stderr, "Start failed\n"); exit(1); } for (;;) { Task tsk; fprintf(stderr, "BOSS: put task %d\n", tsk.m_id); if (!wq.put(tsk)) { fprintf(stderr, "Boss: put failed\n"); exit(1); } if ((tsk.m_id % 10) == 0) sleep(1); } exit(0); } recoll-1.17.3/utils/workqueue.h000644 001750 000000 00000012417 11740755063 017041 0ustar00dockeswheel000000 000000 /* * 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 _WORKQUEUE_H_INCLUDED_ #define _WORKQUEUE_H_INCLUDED_ #include "pthread.h" #include #include using std::queue; using std::string; /** * A WorkQueue manages the synchronisation around a queue of work items, * where a single client thread queues tasks and a single worker takes * and executes them. The goal is to introduce some level of * parallelism between the successive steps of a previously single * threaded pipe-line (data extraction / data preparation / index * update). * * There is no individual task status return. In case of fatal error, * the client or worker sets an end condition on the queue. A second * queue could conceivably be used for returning individual task * status. */ template class WorkQueue { public: WorkQueue(int hi = 0, int lo = 1) : m_high(hi), m_low(lo), m_size(0), m_worker_up(false), m_worker_waiting(false), m_jobcnt(0), m_lenacc(0) { m_ok = (pthread_cond_init(&m_cond, 0) == 0) && (pthread_mutex_init(&m_mutex, 0) == 0); } ~WorkQueue() { if (m_worker_up) setTerminateAndWait(); } /** Start the worker thread. The start_routine will loop * taking and executing tasks. */ bool start(void *(*start_routine)(void *), void *arg) { bool status = pthread_create(&m_worker_thread, 0, start_routine, arg) == 0; if (status) m_worker_up = true; return status; } /** * Add item to work queue. Sleep if there are already too many. * Called from client. */ bool put(T t) { if (!ok() || pthread_mutex_lock(&m_mutex) != 0) return false; while (ok() && m_high > 0 && m_queue.size() >= m_high) { // Keep the order: we test ok() AFTER the sleep... if (pthread_cond_wait(&m_cond, &m_mutex) || !ok()) { pthread_mutex_unlock(&m_mutex); return false; } } m_queue.push(t); ++m_size; pthread_cond_broadcast(&m_cond); pthread_mutex_unlock(&m_mutex); return true; } /** Wait until the queue is empty and the worker is * back waiting for task. Called from the client when it needs to * perform work that couldn't be done in parallel with the * worker's tasks. */ bool waitIdle() { if (!ok() || pthread_mutex_lock(&m_mutex) != 0) return false; // We're done when the queue is empty AND the worker is back // for a task (has finished the last) while (ok() && (m_queue.size() > 0 || !m_worker_waiting)) { if (pthread_cond_wait(&m_cond, &m_mutex)) { pthread_mutex_unlock(&m_mutex); return false; } } pthread_mutex_unlock(&m_mutex); return ok(); } /** Tell the worker to exit, and wait for it. There may still be tasks on the queue. */ void* setTerminateAndWait() { if (!m_worker_up) return (void *)0; pthread_mutex_lock(&m_mutex); m_ok = false; pthread_cond_broadcast(&m_cond); pthread_mutex_unlock(&m_mutex); void *status; pthread_join(m_worker_thread, &status); m_worker_up = false; return status; } /** Remove task from queue. Sleep if there are not enough. Signal if we go to sleep on empty queue: client may be waiting for our going idle */ bool take(T* tp) { if (!ok() || pthread_mutex_lock(&m_mutex) != 0) return false; while (ok() && m_queue.size() < m_low) { m_worker_waiting = true; if (m_queue.empty()) pthread_cond_broadcast(&m_cond); if (pthread_cond_wait(&m_cond, &m_mutex) || !ok()) { pthread_mutex_unlock(&m_mutex); m_worker_waiting = false; return false; } m_worker_waiting = false; } ++m_jobcnt; m_lenacc += m_size; *tp = m_queue.front(); m_queue.pop(); --m_size; pthread_cond_broadcast(&m_cond); pthread_mutex_unlock(&m_mutex); return true; } /** Take note of the worker exit. This would normally happen after an unrecoverable error */ void workerExit() { if (!ok() || pthread_mutex_lock(&m_mutex) != 0) return; m_ok = false; pthread_cond_broadcast(&m_cond); pthread_mutex_unlock(&m_mutex); } /** Debug only: as the size is returned while the queue is unlocked, there * is no warranty on its consistency. Not that we use the member size, not * the container size() call which would need locking. */ size_t size() {return m_size;} private: bool ok() {return m_ok && m_worker_up;} size_t m_high; size_t m_low; size_t m_size; bool m_worker_up; bool m_worker_waiting; int m_jobcnt; int m_lenacc; pthread_t m_worker_thread; queue m_queue; pthread_cond_t m_cond; pthread_mutex_t m_mutex; bool m_ok; }; #endif /* _WORKQUEUE_H_INCLUDED_ */ recoll-1.17.3/utils/x11mon.cpp000644 001750 000000 00000003327 11740755063 016470 0ustar00dockeswheel000000 000000 #ifndef TEST_X11MON /* Copyright (C) 2006 J.F.Dockes */ // Poll state of X11 connectibility (to detect end of user session). #include "autoconfig.h" #ifndef DISABLE_X11MON #include #include #include #include #define DODEBUG #ifdef DODEBUG #define DEBUG(X) fprintf X #else #define DEBUG(X) fprintf X #endif static Display *m_display; static bool m_ok; static jmp_buf env; static int errorHandler(Display *, XErrorEvent*) { DEBUG((stderr, "x11mon: error handler: Got X11 error\n")); m_ok = false; return 0; } static int ioErrorHandler(Display *) { DEBUG((stderr, "x11mon: error handler: Got X11 IO error\n")); m_ok = false; m_display = 0; longjmp(env, 1); } bool x11IsAlive() { // Xlib always exits on IO errors. Need a setjmp to avoid this (will jump // from IO error handler instead of returning). if (setjmp(env)) { DEBUG((stderr, "x11IsAlive: Long jump\n")); return false; } if (m_display == 0) { signal(SIGPIPE, SIG_IGN); XSetErrorHandler(errorHandler); XSetIOErrorHandler(ioErrorHandler); if ((m_display = XOpenDisplay(0)) == 0) { DEBUG((stderr, "x11IsAlive: cant connect\n")); m_ok = false; return false; } } m_ok = true; bool sync= XSynchronize(m_display, true); XNoOp(m_display); XSynchronize(m_display, sync); return m_ok; } #else bool x11IsAlive() { return true; } #endif /* DISABLE_X11MON */ #else // Test driver #include #include #include #include "x11mon.h" int main(int argc, char **argv) { for (;;) { if (!x11IsAlive()) { fprintf(stderr, "x11IsAlive failed\n"); } else { fprintf(stderr, "x11IsAlive Ok\n"); } sleep(1); } } #endif recoll-1.17.3/utils/x11mon.h000644 001750 000000 00000001657 11740755063 016141 0ustar00dockeswheel000000 000000 #ifndef _X11MON_H_INCLUDED_ #define _X11MON_H_INCLUDED_ /* 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. */ /** Poll X11 server status and connectivity */ extern bool x11IsAlive(); #endif /* _X11MON_H_INCLUDED_ */ recoll-1.17.3/unac/AUTHORS000644 001750 000000 00000000034 11740755063 015467 0ustar00dockeswheel000000 000000 Loic Dachary loic@senga.org recoll-1.17.3/unac/COPYING000644 001750 000000 00000043127 11740755063 015464 0ustar00dockeswheel000000 000000 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) 19yy 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) 19yy 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. recoll-1.17.3/unac/README000644 001750 000000 00000006264 11740755063 015312 0ustar00dockeswheel000000 000000 $Header: /cvsroot/unac/unac/README,v 1.5 2002/09/02 10:40:09 loic Exp $ What is it ? ------------ unac is a C library that removes accents from characters, regardless of the character set (ISO-8859-15, ISO-CELTIC, KOI8-RU...) as long as iconv(3) is able to convert it into UTF-16 (Unicode). For instance the string été will become ete. It provides a command line interface (unaccent) that removes accents from an input flow or a string given in argument. When using the library function or the command, the charset of the input must be specified. The input is converted to UTF-16 using iconv(3), accents are removed and the result is converted back to the original charset. The iconv -l command on GNU/Linux will show all charset supported. Where is the documentation ? ---------------------------- The manual page of the unaccent command : man unaccent. The manual page of the unac library : man unac. How to install it ? ------------------- For OS that are not GNU/Linux we recommend to use the iconv library provided by Bruno Haible at ftp://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.8.tar.gz. ./configure [--with-iconv=/my/local] make all make check make install How to link with unac ? ------------------------- Assuming you've installed unac in the /usr/local directory use something similar to the following: In the sources: ... #include ... On the command line: cc -I/usr/local/include -o prog prog.cc -L/usr/local/lib -lunac Where can I download it ? ------------------------- The main distribution site is http://www.senga.org/unac/. What is the license ? --------------------- unac is distributed under the GNU GPL, as found at http://www.gnu.org/licenses/gpl.txt. Unicode data files are under the following license, which is compatible with the GNU GPL: http://www.unicode.org/Public/3.2-Update/UnicodeData-3.2.0.html#UCD_Terms UCD Terms of Use Disclaimer The Unicode Character Database is provided as is by Unicode, Inc. No claims are made as to fitness for any particular purpose. No warranties of any kind are expressed or implied. The recipient agrees to determine applicability of information provided. If this file has been purchased on magnetic or optical media from Unicode, Inc., the sole remedy for any claim will be exchange of defective media within 90 days of receipt. This disclaimer is applicable for all other data files accompanying the Unicode Character Database, some of which have been compiled by the Unicode Consortium, and some of which have been supplied by other sources. Limitations on Rights to Redistribute This Data Recipient is granted the right to make copies in any form for internal distribution and to freely use the information supplied in the creation of products supporting the Unicode(TM) Standard. The files in the Unicode Character Database can be redistributed to third parties or other organizations (whether for profit or not) as long as this notice and the disclaimer notice are retained. Information can be extracted from these files and used in documentation or programs, as long as there is an accompanying notice indicating the source. Loic Dachary loic@senga.org http://www.senga.org/ recoll-1.17.3/unac/README.recoll000644 001750 000000 00000000611 11740755063 016557 0ustar00dockeswheel000000 000000 This is a stripped down and modified version of unac-1.7.0 You can find the full original distribution at http://www.senga.org/unac/ You can find the full version used by Recoll at the following url: http://bitbucket.org/medoc/recoll/src/tip/unac/ See AUTHORS and COPYING for tributes, etc. Dont bother Loic Dachary about bugs in this version, you can find the culprit here: jfd@recoll.org recoll-1.17.3/unac/unac.c000644 001750 000000 00002176175 11740755063 015537 0ustar00dockeswheel000000 000000 /* * Copyright (C) 2000, 2001, 2002 Loic Dachary * * 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 #ifdef RECOLL_DATADIR #include "autoconfig.h" #else #include "config.h" #endif /* RECOLL */ #endif /* HAVE_CONFIG_H */ #ifdef RECOLL_DATADIR /* Yes, recoll unac is actually c++, lets face modernity, I will not be caught writing another binary search */ #include #include #include #include using std::string; using std::vector; using std::map; #include "smallut.h" /* Storage for the exception translations. These are chars which should not be translated according to what UnicodeData says, but instead according to some local rule. There will usually be very few of them, but they must be looked up for every translated char. We use a sorted vector for fastest elimination by binary search and a vector to store the translations */ static vector except_chars; static vector except_trans; static inline size_t is_except_char(unsigned short c) { vector::iterator it = std::lower_bound(except_chars.begin(), except_chars.end(), c); if (it == except_chars.end() || *it != c) { return (size_t(-1)); } return std::distance(except_chars.begin(), it); } #endif /* RECOLL_DATADIR */ /* * If configure.in has not defined this symbol, assume const. It * does not harm much: a warning will be issued during compilation. */ #ifndef ICONV_CONST #ifdef RCL_ICONV_INBUF_CONST #define ICONV_CONST const #else #define ICONV_CONST #endif #endif /* ICONV_CONST */ #include #include #include #include #ifdef HAVE_VSNPRINTF #include #include #endif /* HAVE_VSNPRINTF */ #include #include "unac.h" #include "unac_version.h" /* Generated by builder. Do not modify. Start tables */ /* * 00A0 NO-BREAK SPACE * 0020 SPACE * 00A8 DIAERESIS * 0020 SPACE * 00AA FEMININE ORDINAL INDICATOR * 0061 LATIN SMALL LETTER A * 00AF MACRON * 0020 SPACE * 00B2 SUPERSCRIPT TWO * 0032 DIGIT TWO * 00B3 SUPERSCRIPT THREE * 0033 DIGIT THREE * 00B4 ACUTE ACCENT * 0020 SPACE * 00B5 MICRO SIGN * 03BC GREEK SMALL LETTER MU * 00B8 CEDILLA * 0020 SPACE * 00B9 SUPERSCRIPT ONE * 0031 DIGIT ONE * 00BA MASCULINE ORDINAL INDICATOR * 006F LATIN SMALL LETTER O * 00BC VULGAR FRACTION ONE QUARTER * 0031 DIGIT ONE * 2044 FRACTION SLASH * 0034 DIGIT FOUR * 00BD VULGAR FRACTION ONE HALF * 0031 DIGIT ONE * 2044 FRACTION SLASH * 0032 DIGIT TWO * 00BE VULGAR FRACTION THREE QUARTERS * 0033 DIGIT THREE * 2044 FRACTION SLASH * 0034 DIGIT FOUR * 00C0 LATIN CAPITAL LETTER A WITH GRAVE * 0041 LATIN CAPITAL LETTER A * 00C1 LATIN CAPITAL LETTER A WITH ACUTE * 0041 LATIN CAPITAL LETTER A * 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX * 0041 LATIN CAPITAL LETTER A * 00C3 LATIN CAPITAL LETTER A WITH TILDE * 0041 LATIN CAPITAL LETTER A * 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS * 0041 LATIN CAPITAL LETTER A * 00C5 LATIN CAPITAL LETTER A WITH RING ABOVE * 0041 LATIN CAPITAL LETTER A * 00C7 LATIN CAPITAL LETTER C WITH CEDILLA * 0043 LATIN CAPITAL LETTER C * 00C8 LATIN CAPITAL LETTER E WITH GRAVE * 0045 LATIN CAPITAL LETTER E * 00C9 LATIN CAPITAL LETTER E WITH ACUTE * 0045 LATIN CAPITAL LETTER E * 00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX * 0045 LATIN CAPITAL LETTER E * 00CB LATIN CAPITAL LETTER E WITH DIAERESIS * 0045 LATIN CAPITAL LETTER E * 00CC LATIN CAPITAL LETTER I WITH GRAVE * 0049 LATIN CAPITAL LETTER I * 00CD LATIN CAPITAL LETTER I WITH ACUTE * 0049 LATIN CAPITAL LETTER I * 00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX * 0049 LATIN CAPITAL LETTER I * 00CF LATIN CAPITAL LETTER I WITH DIAERESIS * 0049 LATIN CAPITAL LETTER I * 00D1 LATIN CAPITAL LETTER N WITH TILDE * 004E LATIN CAPITAL LETTER N * 00D2 LATIN CAPITAL LETTER O WITH GRAVE * 004F LATIN CAPITAL LETTER O * 00D3 LATIN CAPITAL LETTER O WITH ACUTE * 004F LATIN CAPITAL LETTER O * 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX * 004F LATIN CAPITAL LETTER O * 00D5 LATIN CAPITAL LETTER O WITH TILDE * 004F LATIN CAPITAL LETTER O * 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS * 004F LATIN CAPITAL LETTER O * 00D9 LATIN CAPITAL LETTER U WITH GRAVE * 0055 LATIN CAPITAL LETTER U * 00DA LATIN CAPITAL LETTER U WITH ACUTE * 0055 LATIN CAPITAL LETTER U * 00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX * 0055 LATIN CAPITAL LETTER U * 00DC LATIN CAPITAL LETTER U WITH DIAERESIS * 0055 LATIN CAPITAL LETTER U * 00DD LATIN CAPITAL LETTER Y WITH ACUTE * 0059 LATIN CAPITAL LETTER Y * 00E0 LATIN SMALL LETTER A WITH GRAVE * 0061 LATIN SMALL LETTER A * 00E1 LATIN SMALL LETTER A WITH ACUTE * 0061 LATIN SMALL LETTER A * 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX * 0061 LATIN SMALL LETTER A * 00E3 LATIN SMALL LETTER A WITH TILDE * 0061 LATIN SMALL LETTER A * 00E4 LATIN SMALL LETTER A WITH DIAERESIS * 0061 LATIN SMALL LETTER A * 00E5 LATIN SMALL LETTER A WITH RING ABOVE * 0061 LATIN SMALL LETTER A * 00E7 LATIN SMALL LETTER C WITH CEDILLA * 0063 LATIN SMALL LETTER C * 00E8 LATIN SMALL LETTER E WITH GRAVE * 0065 LATIN SMALL LETTER E * 00E9 LATIN SMALL LETTER E WITH ACUTE * 0065 LATIN SMALL LETTER E * 00EA LATIN SMALL LETTER E WITH CIRCUMFLEX * 0065 LATIN SMALL LETTER E * 00EB LATIN SMALL LETTER E WITH DIAERESIS * 0065 LATIN SMALL LETTER E * 00EC LATIN SMALL LETTER I WITH GRAVE * 0069 LATIN SMALL LETTER I * 00ED LATIN SMALL LETTER I WITH ACUTE * 0069 LATIN SMALL LETTER I * 00EE LATIN SMALL LETTER I WITH CIRCUMFLEX * 0069 LATIN SMALL LETTER I * 00EF LATIN SMALL LETTER I WITH DIAERESIS * 0069 LATIN SMALL LETTER I * 00F1 LATIN SMALL LETTER N WITH TILDE * 006E LATIN SMALL LETTER N * 00F2 LATIN SMALL LETTER O WITH GRAVE * 006F LATIN SMALL LETTER O * 00F3 LATIN SMALL LETTER O WITH ACUTE * 006F LATIN SMALL LETTER O * 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX * 006F LATIN SMALL LETTER O * 00F5 LATIN SMALL LETTER O WITH TILDE * 006F LATIN SMALL LETTER O * 00F6 LATIN SMALL LETTER O WITH DIAERESIS * 006F LATIN SMALL LETTER O * 00F9 LATIN SMALL LETTER U WITH GRAVE * 0075 LATIN SMALL LETTER U * 00FA LATIN SMALL LETTER U WITH ACUTE * 0075 LATIN SMALL LETTER U * 00FB LATIN SMALL LETTER U WITH CIRCUMFLEX * 0075 LATIN SMALL LETTER U * 00FC LATIN SMALL LETTER U WITH DIAERESIS * 0075 LATIN SMALL LETTER U * 00FD LATIN SMALL LETTER Y WITH ACUTE * 0079 LATIN SMALL LETTER Y * 00FF LATIN SMALL LETTER Y WITH DIAERESIS * 0079 LATIN SMALL LETTER Y * 0100 LATIN CAPITAL LETTER A WITH MACRON * 0041 LATIN CAPITAL LETTER A * 0101 LATIN SMALL LETTER A WITH MACRON * 0061 LATIN SMALL LETTER A * 0102 LATIN CAPITAL LETTER A WITH BREVE * 0041 LATIN CAPITAL LETTER A * 0103 LATIN SMALL LETTER A WITH BREVE * 0061 LATIN SMALL LETTER A * 0104 LATIN CAPITAL LETTER A WITH OGONEK * 0041 LATIN CAPITAL LETTER A * 0105 LATIN SMALL LETTER A WITH OGONEK * 0061 LATIN SMALL LETTER A * 0106 LATIN CAPITAL LETTER C WITH ACUTE * 0043 LATIN CAPITAL LETTER C * 0107 LATIN SMALL LETTER C WITH ACUTE * 0063 LATIN SMALL LETTER C * 0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX * 0043 LATIN CAPITAL LETTER C * 0109 LATIN SMALL LETTER C WITH CIRCUMFLEX * 0063 LATIN SMALL LETTER C * 010A LATIN CAPITAL LETTER C WITH DOT ABOVE * 0043 LATIN CAPITAL LETTER C * 010B LATIN SMALL LETTER C WITH DOT ABOVE * 0063 LATIN SMALL LETTER C * 010C LATIN CAPITAL LETTER C WITH CARON * 0043 LATIN CAPITAL LETTER C * 010D LATIN SMALL LETTER C WITH CARON * 0063 LATIN SMALL LETTER C * 010E LATIN CAPITAL LETTER D WITH CARON * 0044 LATIN CAPITAL LETTER D * 010F LATIN SMALL LETTER D WITH CARON * 0064 LATIN SMALL LETTER D * 0112 LATIN CAPITAL LETTER E WITH MACRON * 0045 LATIN CAPITAL LETTER E * 0113 LATIN SMALL LETTER E WITH MACRON * 0065 LATIN SMALL LETTER E * 0114 LATIN CAPITAL LETTER E WITH BREVE * 0045 LATIN CAPITAL LETTER E * 0115 LATIN SMALL LETTER E WITH BREVE * 0065 LATIN SMALL LETTER E * 0116 LATIN CAPITAL LETTER E WITH DOT ABOVE * 0045 LATIN CAPITAL LETTER E * 0117 LATIN SMALL LETTER E WITH DOT ABOVE * 0065 LATIN SMALL LETTER E * 0118 LATIN CAPITAL LETTER E WITH OGONEK * 0045 LATIN CAPITAL LETTER E * 0119 LATIN SMALL LETTER E WITH OGONEK * 0065 LATIN SMALL LETTER E * 011A LATIN CAPITAL LETTER E WITH CARON * 0045 LATIN CAPITAL LETTER E * 011B LATIN SMALL LETTER E WITH CARON * 0065 LATIN SMALL LETTER E * 011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX * 0047 LATIN CAPITAL LETTER G * 011D LATIN SMALL LETTER G WITH CIRCUMFLEX * 0067 LATIN SMALL LETTER G * 011E LATIN CAPITAL LETTER G WITH BREVE * 0047 LATIN CAPITAL LETTER G * 011F LATIN SMALL LETTER G WITH BREVE * 0067 LATIN SMALL LETTER G * 0120 LATIN CAPITAL LETTER G WITH DOT ABOVE * 0047 LATIN CAPITAL LETTER G * 0121 LATIN SMALL LETTER G WITH DOT ABOVE * 0067 LATIN SMALL LETTER G * 0122 LATIN CAPITAL LETTER G WITH CEDILLA * 0047 LATIN CAPITAL LETTER G * 0123 LATIN SMALL LETTER G WITH CEDILLA * 0067 LATIN SMALL LETTER G * 0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX * 0048 LATIN CAPITAL LETTER H * 0125 LATIN SMALL LETTER H WITH CIRCUMFLEX * 0068 LATIN SMALL LETTER H * 0128 LATIN CAPITAL LETTER I WITH TILDE * 0049 LATIN CAPITAL LETTER I * 0129 LATIN SMALL LETTER I WITH TILDE * 0069 LATIN SMALL LETTER I * 012A LATIN CAPITAL LETTER I WITH MACRON * 0049 LATIN CAPITAL LETTER I * 012B LATIN SMALL LETTER I WITH MACRON * 0069 LATIN SMALL LETTER I * 012C LATIN CAPITAL LETTER I WITH BREVE * 0049 LATIN CAPITAL LETTER I * 012D LATIN SMALL LETTER I WITH BREVE * 0069 LATIN SMALL LETTER I * 012E LATIN CAPITAL LETTER I WITH OGONEK * 0049 LATIN CAPITAL LETTER I * 012F LATIN SMALL LETTER I WITH OGONEK * 0069 LATIN SMALL LETTER I * 0130 LATIN CAPITAL LETTER I WITH DOT ABOVE * 0049 LATIN CAPITAL LETTER I * 0132 LATIN CAPITAL LIGATURE IJ * 0049 LATIN CAPITAL LETTER I * 004A LATIN CAPITAL LETTER J * 0133 LATIN SMALL LIGATURE IJ * 0069 LATIN SMALL LETTER I * 006A LATIN SMALL LETTER J * 0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX * 004A LATIN CAPITAL LETTER J * 0135 LATIN SMALL LETTER J WITH CIRCUMFLEX * 006A LATIN SMALL LETTER J * 0136 LATIN CAPITAL LETTER K WITH CEDILLA * 004B LATIN CAPITAL LETTER K * 0137 LATIN SMALL LETTER K WITH CEDILLA * 006B LATIN SMALL LETTER K * 0139 LATIN CAPITAL LETTER L WITH ACUTE * 004C LATIN CAPITAL LETTER L * 013A LATIN SMALL LETTER L WITH ACUTE * 006C LATIN SMALL LETTER L * 013B LATIN CAPITAL LETTER L WITH CEDILLA * 004C LATIN CAPITAL LETTER L * 013C LATIN SMALL LETTER L WITH CEDILLA * 006C LATIN SMALL LETTER L * 013D LATIN CAPITAL LETTER L WITH CARON * 004C LATIN CAPITAL LETTER L * 013E LATIN SMALL LETTER L WITH CARON * 006C LATIN SMALL LETTER L * 013F LATIN CAPITAL LETTER L WITH MIDDLE DOT * 004C LATIN CAPITAL LETTER L * 00B7 MIDDLE DOT * 0140 LATIN SMALL LETTER L WITH MIDDLE DOT * 006C LATIN SMALL LETTER L * 00B7 MIDDLE DOT * 0143 LATIN CAPITAL LETTER N WITH ACUTE * 004E LATIN CAPITAL LETTER N * 0144 LATIN SMALL LETTER N WITH ACUTE * 006E LATIN SMALL LETTER N * 0145 LATIN CAPITAL LETTER N WITH CEDILLA * 004E LATIN CAPITAL LETTER N * 0146 LATIN SMALL LETTER N WITH CEDILLA * 006E LATIN SMALL LETTER N * 0147 LATIN CAPITAL LETTER N WITH CARON * 004E LATIN CAPITAL LETTER N * 0148 LATIN SMALL LETTER N WITH CARON * 006E LATIN SMALL LETTER N * 0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE * 02BC MODIFIER LETTER APOSTROPHE * 006E LATIN SMALL LETTER N * 014C LATIN CAPITAL LETTER O WITH MACRON * 004F LATIN CAPITAL LETTER O * 014D LATIN SMALL LETTER O WITH MACRON * 006F LATIN SMALL LETTER O * 014E LATIN CAPITAL LETTER O WITH BREVE * 004F LATIN CAPITAL LETTER O * 014F LATIN SMALL LETTER O WITH BREVE * 006F LATIN SMALL LETTER O * 0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE * 004F LATIN CAPITAL LETTER O * 0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE * 006F LATIN SMALL LETTER O * 0154 LATIN CAPITAL LETTER R WITH ACUTE * 0052 LATIN CAPITAL LETTER R * 0155 LATIN SMALL LETTER R WITH ACUTE * 0072 LATIN SMALL LETTER R * 0156 LATIN CAPITAL LETTER R WITH CEDILLA * 0052 LATIN CAPITAL LETTER R * 0157 LATIN SMALL LETTER R WITH CEDILLA * 0072 LATIN SMALL LETTER R * 0158 LATIN CAPITAL LETTER R WITH CARON * 0052 LATIN CAPITAL LETTER R * 0159 LATIN SMALL LETTER R WITH CARON * 0072 LATIN SMALL LETTER R * 015A LATIN CAPITAL LETTER S WITH ACUTE * 0053 LATIN CAPITAL LETTER S * 015B LATIN SMALL LETTER S WITH ACUTE * 0073 LATIN SMALL LETTER S * 015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX * 0053 LATIN CAPITAL LETTER S * 015D LATIN SMALL LETTER S WITH CIRCUMFLEX * 0073 LATIN SMALL LETTER S * 015E LATIN CAPITAL LETTER S WITH CEDILLA * 0053 LATIN CAPITAL LETTER S * 015F LATIN SMALL LETTER S WITH CEDILLA * 0073 LATIN SMALL LETTER S * 0160 LATIN CAPITAL LETTER S WITH CARON * 0053 LATIN CAPITAL LETTER S * 0161 LATIN SMALL LETTER S WITH CARON * 0073 LATIN SMALL LETTER S * 0162 LATIN CAPITAL LETTER T WITH CEDILLA * 0054 LATIN CAPITAL LETTER T * 0163 LATIN SMALL LETTER T WITH CEDILLA * 0074 LATIN SMALL LETTER T * 0164 LATIN CAPITAL LETTER T WITH CARON * 0054 LATIN CAPITAL LETTER T * 0165 LATIN SMALL LETTER T WITH CARON * 0074 LATIN SMALL LETTER T * 0168 LATIN CAPITAL LETTER U WITH TILDE * 0055 LATIN CAPITAL LETTER U * 0169 LATIN SMALL LETTER U WITH TILDE * 0075 LATIN SMALL LETTER U * 016A LATIN CAPITAL LETTER U WITH MACRON * 0055 LATIN CAPITAL LETTER U * 016B LATIN SMALL LETTER U WITH MACRON * 0075 LATIN SMALL LETTER U * 016C LATIN CAPITAL LETTER U WITH BREVE * 0055 LATIN CAPITAL LETTER U * 016D LATIN SMALL LETTER U WITH BREVE * 0075 LATIN SMALL LETTER U * 016E LATIN CAPITAL LETTER U WITH RING ABOVE * 0055 LATIN CAPITAL LETTER U * 016F LATIN SMALL LETTER U WITH RING ABOVE * 0075 LATIN SMALL LETTER U * 0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE * 0055 LATIN CAPITAL LETTER U * 0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE * 0075 LATIN SMALL LETTER U * 0172 LATIN CAPITAL LETTER U WITH OGONEK * 0055 LATIN CAPITAL LETTER U * 0173 LATIN SMALL LETTER U WITH OGONEK * 0075 LATIN SMALL LETTER U * 0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX * 0057 LATIN CAPITAL LETTER W * 0175 LATIN SMALL LETTER W WITH CIRCUMFLEX * 0077 LATIN SMALL LETTER W * 0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX * 0059 LATIN CAPITAL LETTER Y * 0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX * 0079 LATIN SMALL LETTER Y * 0178 LATIN CAPITAL LETTER Y WITH DIAERESIS * 0059 LATIN CAPITAL LETTER Y * 0179 LATIN CAPITAL LETTER Z WITH ACUTE * 005A LATIN CAPITAL LETTER Z * 017A LATIN SMALL LETTER Z WITH ACUTE * 007A LATIN SMALL LETTER Z * 017B LATIN CAPITAL LETTER Z WITH DOT ABOVE * 005A LATIN CAPITAL LETTER Z * 017C LATIN SMALL LETTER Z WITH DOT ABOVE * 007A LATIN SMALL LETTER Z * 017D LATIN CAPITAL LETTER Z WITH CARON * 005A LATIN CAPITAL LETTER Z * 017E LATIN SMALL LETTER Z WITH CARON * 007A LATIN SMALL LETTER Z * 017F LATIN SMALL LETTER LONG S * 0073 LATIN SMALL LETTER S * 01A0 LATIN CAPITAL LETTER O WITH HORN * 004F LATIN CAPITAL LETTER O * 01A1 LATIN SMALL LETTER O WITH HORN * 006F LATIN SMALL LETTER O * 01AF LATIN CAPITAL LETTER U WITH HORN * 0055 LATIN CAPITAL LETTER U * 01B0 LATIN SMALL LETTER U WITH HORN * 0075 LATIN SMALL LETTER U * 01C4 LATIN CAPITAL LETTER DZ WITH CARON * 0044 LATIN CAPITAL LETTER D * 005A LATIN CAPITAL LETTER Z * 01C5 LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON * 0044 LATIN CAPITAL LETTER D * 007A LATIN SMALL LETTER Z * 01C6 LATIN SMALL LETTER DZ WITH CARON * 0064 LATIN SMALL LETTER D * 007A LATIN SMALL LETTER Z * 01C7 LATIN CAPITAL LETTER LJ * 004C LATIN CAPITAL LETTER L * 004A LATIN CAPITAL LETTER J * 01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J * 004C LATIN CAPITAL LETTER L * 006A LATIN SMALL LETTER J * 01C9 LATIN SMALL LETTER LJ * 006C LATIN SMALL LETTER L * 006A LATIN SMALL LETTER J * 01CA LATIN CAPITAL LETTER NJ * 004E LATIN CAPITAL LETTER N * 004A LATIN CAPITAL LETTER J * 01CB LATIN CAPITAL LETTER N WITH SMALL LETTER J * 004E LATIN CAPITAL LETTER N * 006A LATIN SMALL LETTER J * 01CC LATIN SMALL LETTER NJ * 006E LATIN SMALL LETTER N * 006A LATIN SMALL LETTER J * 01CD LATIN CAPITAL LETTER A WITH CARON * 0041 LATIN CAPITAL LETTER A * 01CE LATIN SMALL LETTER A WITH CARON * 0061 LATIN SMALL LETTER A * 01CF LATIN CAPITAL LETTER I WITH CARON * 0049 LATIN CAPITAL LETTER I * 01D0 LATIN SMALL LETTER I WITH CARON * 0069 LATIN SMALL LETTER I * 01D1 LATIN CAPITAL LETTER O WITH CARON * 004F LATIN CAPITAL LETTER O * 01D2 LATIN SMALL LETTER O WITH CARON * 006F LATIN SMALL LETTER O * 01D3 LATIN CAPITAL LETTER U WITH CARON * 0055 LATIN CAPITAL LETTER U * 01D4 LATIN SMALL LETTER U WITH CARON * 0075 LATIN SMALL LETTER U * 01D5 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON * 0055 LATIN CAPITAL LETTER U * 01D6 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON * 0075 LATIN SMALL LETTER U * 01D7 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE * 0055 LATIN CAPITAL LETTER U * 01D8 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE * 0075 LATIN SMALL LETTER U * 01D9 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON * 0055 LATIN CAPITAL LETTER U * 01DA LATIN SMALL LETTER U WITH DIAERESIS AND CARON * 0075 LATIN SMALL LETTER U * 01DB LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE * 0055 LATIN CAPITAL LETTER U * 01DC LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE * 0075 LATIN SMALL LETTER U * 01DE LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON * 0041 LATIN CAPITAL LETTER A * 01DF LATIN SMALL LETTER A WITH DIAERESIS AND MACRON * 0061 LATIN SMALL LETTER A * 01E0 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON * 0041 LATIN CAPITAL LETTER A * 01E1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON * 0061 LATIN SMALL LETTER A * 01E2 LATIN CAPITAL LETTER AE WITH MACRON * 00C6 LATIN CAPITAL LETTER AE * 01E3 LATIN SMALL LETTER AE WITH MACRON * 00E6 LATIN SMALL LETTER AE * 01E6 LATIN CAPITAL LETTER G WITH CARON * 0047 LATIN CAPITAL LETTER G * 01E7 LATIN SMALL LETTER G WITH CARON * 0067 LATIN SMALL LETTER G * 01E8 LATIN CAPITAL LETTER K WITH CARON * 004B LATIN CAPITAL LETTER K * 01E9 LATIN SMALL LETTER K WITH CARON * 006B LATIN SMALL LETTER K * 01EA LATIN CAPITAL LETTER O WITH OGONEK * 004F LATIN CAPITAL LETTER O * 01EB LATIN SMALL LETTER O WITH OGONEK * 006F LATIN SMALL LETTER O * 01EC LATIN CAPITAL LETTER O WITH OGONEK AND MACRON * 004F LATIN CAPITAL LETTER O * 01ED LATIN SMALL LETTER O WITH OGONEK AND MACRON * 006F LATIN SMALL LETTER O * 01EE LATIN CAPITAL LETTER EZH WITH CARON * 01B7 LATIN CAPITAL LETTER EZH * 01EF LATIN SMALL LETTER EZH WITH CARON * 0292 LATIN SMALL LETTER EZH * 01F0 LATIN SMALL LETTER J WITH CARON * 006A LATIN SMALL LETTER J * 01F1 LATIN CAPITAL LETTER DZ * 0044 LATIN CAPITAL LETTER D * 005A LATIN CAPITAL LETTER Z * 01F2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z * 0044 LATIN CAPITAL LETTER D * 007A LATIN SMALL LETTER Z * 01F3 LATIN SMALL LETTER DZ * 0064 LATIN SMALL LETTER D * 007A LATIN SMALL LETTER Z * 01F4 LATIN CAPITAL LETTER G WITH ACUTE * 0047 LATIN CAPITAL LETTER G * 01F5 LATIN SMALL LETTER G WITH ACUTE * 0067 LATIN SMALL LETTER G * 01F8 LATIN CAPITAL LETTER N WITH GRAVE * 004E LATIN CAPITAL LETTER N * 01F9 LATIN SMALL LETTER N WITH GRAVE * 006E LATIN SMALL LETTER N * 01FA LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE * 0041 LATIN CAPITAL LETTER A * 01FB LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE * 0061 LATIN SMALL LETTER A * 01FC LATIN CAPITAL LETTER AE WITH ACUTE * 00C6 LATIN CAPITAL LETTER AE * 01FD LATIN SMALL LETTER AE WITH ACUTE * 00E6 LATIN SMALL LETTER AE * 01FE LATIN CAPITAL LETTER O WITH STROKE AND ACUTE * 00D8 LATIN CAPITAL LETTER O WITH STROKE * 01FF LATIN SMALL LETTER O WITH STROKE AND ACUTE * 00F8 LATIN SMALL LETTER O WITH STROKE * 0200 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE * 0041 LATIN CAPITAL LETTER A * 0201 LATIN SMALL LETTER A WITH DOUBLE GRAVE * 0061 LATIN SMALL LETTER A * 0202 LATIN CAPITAL LETTER A WITH INVERTED BREVE * 0041 LATIN CAPITAL LETTER A * 0203 LATIN SMALL LETTER A WITH INVERTED BREVE * 0061 LATIN SMALL LETTER A * 0204 LATIN CAPITAL LETTER E WITH DOUBLE GRAVE * 0045 LATIN CAPITAL LETTER E * 0205 LATIN SMALL LETTER E WITH DOUBLE GRAVE * 0065 LATIN SMALL LETTER E * 0206 LATIN CAPITAL LETTER E WITH INVERTED BREVE * 0045 LATIN CAPITAL LETTER E * 0207 LATIN SMALL LETTER E WITH INVERTED BREVE * 0065 LATIN SMALL LETTER E * 0208 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE * 0049 LATIN CAPITAL LETTER I * 0209 LATIN SMALL LETTER I WITH DOUBLE GRAVE * 0069 LATIN SMALL LETTER I * 020A LATIN CAPITAL LETTER I WITH INVERTED BREVE * 0049 LATIN CAPITAL LETTER I * 020B LATIN SMALL LETTER I WITH INVERTED BREVE * 0069 LATIN SMALL LETTER I * 020C LATIN CAPITAL LETTER O WITH DOUBLE GRAVE * 004F LATIN CAPITAL LETTER O * 020D LATIN SMALL LETTER O WITH DOUBLE GRAVE * 006F LATIN SMALL LETTER O * 020E LATIN CAPITAL LETTER O WITH INVERTED BREVE * 004F LATIN CAPITAL LETTER O * 020F LATIN SMALL LETTER O WITH INVERTED BREVE * 006F LATIN SMALL LETTER O * 0210 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE * 0052 LATIN CAPITAL LETTER R * 0211 LATIN SMALL LETTER R WITH DOUBLE GRAVE * 0072 LATIN SMALL LETTER R * 0212 LATIN CAPITAL LETTER R WITH INVERTED BREVE * 0052 LATIN CAPITAL LETTER R * 0213 LATIN SMALL LETTER R WITH INVERTED BREVE * 0072 LATIN SMALL LETTER R * 0214 LATIN CAPITAL LETTER U WITH DOUBLE GRAVE * 0055 LATIN CAPITAL LETTER U * 0215 LATIN SMALL LETTER U WITH DOUBLE GRAVE * 0075 LATIN SMALL LETTER U * 0216 LATIN CAPITAL LETTER U WITH INVERTED BREVE * 0055 LATIN CAPITAL LETTER U * 0217 LATIN SMALL LETTER U WITH INVERTED BREVE * 0075 LATIN SMALL LETTER U * 0218 LATIN CAPITAL LETTER S WITH COMMA BELOW * 0053 LATIN CAPITAL LETTER S * 0219 LATIN SMALL LETTER S WITH COMMA BELOW * 0073 LATIN SMALL LETTER S * 021A LATIN CAPITAL LETTER T WITH COMMA BELOW * 0054 LATIN CAPITAL LETTER T * 021B LATIN SMALL LETTER T WITH COMMA BELOW * 0074 LATIN SMALL LETTER T * 021E LATIN CAPITAL LETTER H WITH CARON * 0048 LATIN CAPITAL LETTER H * 021F LATIN SMALL LETTER H WITH CARON * 0068 LATIN SMALL LETTER H * 0226 LATIN CAPITAL LETTER A WITH DOT ABOVE * 0041 LATIN CAPITAL LETTER A * 0227 LATIN SMALL LETTER A WITH DOT ABOVE * 0061 LATIN SMALL LETTER A * 0228 LATIN CAPITAL LETTER E WITH CEDILLA * 0045 LATIN CAPITAL LETTER E * 0229 LATIN SMALL LETTER E WITH CEDILLA * 0065 LATIN SMALL LETTER E * 022A LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON * 004F LATIN CAPITAL LETTER O * 022B LATIN SMALL LETTER O WITH DIAERESIS AND MACRON * 006F LATIN SMALL LETTER O * 022C LATIN CAPITAL LETTER O WITH TILDE AND MACRON * 004F LATIN CAPITAL LETTER O * 022D LATIN SMALL LETTER O WITH TILDE AND MACRON * 006F LATIN SMALL LETTER O * 022E LATIN CAPITAL LETTER O WITH DOT ABOVE * 004F LATIN CAPITAL LETTER O * 022F LATIN SMALL LETTER O WITH DOT ABOVE * 006F LATIN SMALL LETTER O * 0230 LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON * 004F LATIN CAPITAL LETTER O * 0231 LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON * 006F LATIN SMALL LETTER O * 0232 LATIN CAPITAL LETTER Y WITH MACRON * 0059 LATIN CAPITAL LETTER Y * 0233 LATIN SMALL LETTER Y WITH MACRON * 0079 LATIN SMALL LETTER Y * 02B0 MODIFIER LETTER SMALL H * 0068 LATIN SMALL LETTER H * 02B1 MODIFIER LETTER SMALL H WITH HOOK * 0266 LATIN SMALL LETTER H WITH HOOK * 02B2 MODIFIER LETTER SMALL J * 006A LATIN SMALL LETTER J * 02B3 MODIFIER LETTER SMALL R * 0072 LATIN SMALL LETTER R * 02B4 MODIFIER LETTER SMALL TURNED R * 0279 LATIN SMALL LETTER TURNED R * 02B5 MODIFIER LETTER SMALL TURNED R WITH HOOK * 027B LATIN SMALL LETTER TURNED R WITH HOOK * 02B6 MODIFIER LETTER SMALL CAPITAL INVERTED R * 0281 LATIN LETTER SMALL CAPITAL INVERTED R * 02B7 MODIFIER LETTER SMALL W * 0077 LATIN SMALL LETTER W * 02B8 MODIFIER LETTER SMALL Y * 0079 LATIN SMALL LETTER Y * 02D8 BREVE * 0020 SPACE * 02D9 DOT ABOVE * 0020 SPACE * 02DA RING ABOVE * 0020 SPACE * 02DB OGONEK * 0020 SPACE * 02DC SMALL TILDE * 0020 SPACE * 02DD DOUBLE ACUTE ACCENT * 0020 SPACE * 02E0 MODIFIER LETTER SMALL GAMMA * 0263 LATIN SMALL LETTER GAMMA * 02E1 MODIFIER LETTER SMALL L * 006C LATIN SMALL LETTER L * 02E2 MODIFIER LETTER SMALL S * 0073 LATIN SMALL LETTER S * 02E3 MODIFIER LETTER SMALL X * 0078 LATIN SMALL LETTER X * 02E4 MODIFIER LETTER SMALL REVERSED GLOTTAL STOP * 0295 LATIN LETTER PHARYNGEAL VOICED FRICATIVE * 0300 COMBINING GRAVE ACCENT * 0000 * 0301 COMBINING ACUTE ACCENT * 0000 * 0302 COMBINING CIRCUMFLEX ACCENT * 0000 * 0303 COMBINING TILDE * 0000 * 0304 COMBINING MACRON * 0000 * 0305 COMBINING OVERLINE * 0000 * 0306 COMBINING BREVE * 0000 * 0307 COMBINING DOT ABOVE * 0000 * 0308 COMBINING DIAERESIS * 0000 * 0309 COMBINING HOOK ABOVE * 0000 * 030A COMBINING RING ABOVE * 0000 * 030B COMBINING DOUBLE ACUTE ACCENT * 0000 * 030C COMBINING CARON * 0000 * 030D COMBINING VERTICAL LINE ABOVE * 0000 * 030E COMBINING DOUBLE VERTICAL LINE ABOVE * 0000 * 030F COMBINING DOUBLE GRAVE ACCENT * 0000 * 0310 COMBINING CANDRABINDU * 0000 * 0311 COMBINING INVERTED BREVE * 0000 * 0312 COMBINING TURNED COMMA ABOVE * 0000 * 0313 COMBINING COMMA ABOVE * 0000 * 0314 COMBINING REVERSED COMMA ABOVE * 0000 * 0315 COMBINING COMMA ABOVE RIGHT * 0000 * 0316 COMBINING GRAVE ACCENT BELOW * 0000 * 0317 COMBINING ACUTE ACCENT BELOW * 0000 * 0318 COMBINING LEFT TACK BELOW * 0000 * 0319 COMBINING RIGHT TACK BELOW * 0000 * 031A COMBINING LEFT ANGLE ABOVE * 0000 * 031B COMBINING HORN * 0000 * 031C COMBINING LEFT HALF RING BELOW * 0000 * 031D COMBINING UP TACK BELOW * 0000 * 031E COMBINING DOWN TACK BELOW * 0000 * 031F COMBINING PLUS SIGN BELOW * 0000 * 0320 COMBINING MINUS SIGN BELOW * 0000 * 0321 COMBINING PALATALIZED HOOK BELOW * 0000 * 0322 COMBINING RETROFLEX HOOK BELOW * 0000 * 0323 COMBINING DOT BELOW * 0000 * 0324 COMBINING DIAERESIS BELOW * 0000 * 0325 COMBINING RING BELOW * 0000 * 0326 COMBINING COMMA BELOW * 0000 * 0327 COMBINING CEDILLA * 0000 * 0328 COMBINING OGONEK * 0000 * 0329 COMBINING VERTICAL LINE BELOW * 0000 * 032A COMBINING BRIDGE BELOW * 0000 * 032B COMBINING INVERTED DOUBLE ARCH BELOW * 0000 * 032C COMBINING CARON BELOW * 0000 * 032D COMBINING CIRCUMFLEX ACCENT BELOW * 0000 * 032E COMBINING BREVE BELOW * 0000 * 032F COMBINING INVERTED BREVE BELOW * 0000 * 0330 COMBINING TILDE BELOW * 0000 * 0331 COMBINING MACRON BELOW * 0000 * 0332 COMBINING LOW LINE * 0000 * 0333 COMBINING DOUBLE LOW LINE * 0000 * 0334 COMBINING TILDE OVERLAY * 0000 * 0335 COMBINING SHORT STROKE OVERLAY * 0000 * 0336 COMBINING LONG STROKE OVERLAY * 0000 * 0337 COMBINING SHORT SOLIDUS OVERLAY * 0000 * 0338 COMBINING LONG SOLIDUS OVERLAY * 0000 * 0339 COMBINING RIGHT HALF RING BELOW * 0000 * 033A COMBINING INVERTED BRIDGE BELOW * 0000 * 033B COMBINING SQUARE BELOW * 0000 * 033C COMBINING SEAGULL BELOW * 0000 * 033D COMBINING X ABOVE * 0000 * 033E COMBINING VERTICAL TILDE * 0000 * 033F COMBINING DOUBLE OVERLINE * 0000 * 0340 COMBINING GRAVE TONE MARK * 0000 * 0341 COMBINING ACUTE TONE MARK * 0000 * 0342 COMBINING GREEK PERISPOMENI * 0000 * 0343 COMBINING GREEK KORONIS * 0000 * 0344 COMBINING GREEK DIALYTIKA TONOS * 0000 * 0345 COMBINING GREEK YPOGEGRAMMENI * 0000 * 0346 COMBINING BRIDGE ABOVE * 0000 * 0347 COMBINING EQUALS SIGN BELOW * 0000 * 0348 COMBINING DOUBLE VERTICAL LINE BELOW * 0000 * 0349 COMBINING LEFT ANGLE BELOW * 0000 * 034A COMBINING NOT TILDE ABOVE * 0000 * 034B COMBINING HOMOTHETIC ABOVE * 0000 * 034C COMBINING ALMOST EQUAL TO ABOVE * 0000 * 034D COMBINING LEFT RIGHT ARROW BELOW * 0000 * 034E COMBINING UPWARDS ARROW BELOW * 0000 * 034F COMBINING GRAPHEME JOINER * 0000 * 0350 COMBINING RIGHT ARROWHEAD ABOVE * 0000 * 0351 COMBINING LEFT HALF RING ABOVE * 0000 * 0352 COMBINING FERMATA * 0000 * 0353 COMBINING X BELOW * 0000 * 0354 COMBINING LEFT ARROWHEAD BELOW * 0000 * 0355 COMBINING RIGHT ARROWHEAD BELOW * 0000 * 0356 COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW * 0000 * 0357 COMBINING RIGHT HALF RING ABOVE * 0000 * 0358 COMBINING DOT ABOVE RIGHT * 0000 * 0359 COMBINING ASTERISK BELOW * 0000 * 035A COMBINING DOUBLE RING BELOW * 0000 * 035B COMBINING ZIGZAG ABOVE * 0000 * 035C COMBINING DOUBLE BREVE BELOW * 0000 * 035D COMBINING DOUBLE BREVE * 0000 * 035E COMBINING DOUBLE MACRON * 0000 * 035F COMBINING DOUBLE MACRON BELOW * 0000 * 0360 COMBINING DOUBLE TILDE * 0000 * 0361 COMBINING DOUBLE INVERTED BREVE * 0000 * 0362 COMBINING DOUBLE RIGHTWARDS ARROW BELOW * 0000 * 0363 COMBINING LATIN SMALL LETTER A * 0000 * 0364 COMBINING LATIN SMALL LETTER E * 0000 * 0365 COMBINING LATIN SMALL LETTER I * 0000 * 0366 COMBINING LATIN SMALL LETTER O * 0000 * 0367 COMBINING LATIN SMALL LETTER U * 0000 * 0368 COMBINING LATIN SMALL LETTER C * 0000 * 0369 COMBINING LATIN SMALL LETTER D * 0000 * 036A COMBINING LATIN SMALL LETTER H * 0000 * 036B COMBINING LATIN SMALL LETTER M * 0000 * 036C COMBINING LATIN SMALL LETTER R * 0000 * 036D COMBINING LATIN SMALL LETTER T * 0000 * 036E COMBINING LATIN SMALL LETTER V * 0000 * 036F COMBINING LATIN SMALL LETTER X * 0000 * 0374 GREEK NUMERAL SIGN * 02B9 MODIFIER LETTER PRIME * 037A GREEK YPOGEGRAMMENI * 0020 SPACE * 037E GREEK QUESTION MARK * 003B SEMICOLON * 0384 GREEK TONOS * 0020 SPACE * 0385 GREEK DIALYTIKA TONOS * 0020 SPACE * 0386 GREEK CAPITAL LETTER ALPHA WITH TONOS * 0391 GREEK CAPITAL LETTER ALPHA * 0387 GREEK ANO TELEIA * 00B7 MIDDLE DOT * 0388 GREEK CAPITAL LETTER EPSILON WITH TONOS * 0395 GREEK CAPITAL LETTER EPSILON * 0389 GREEK CAPITAL LETTER ETA WITH TONOS * 0397 GREEK CAPITAL LETTER ETA * 038A GREEK CAPITAL LETTER IOTA WITH TONOS * 0399 GREEK CAPITAL LETTER IOTA * 038C GREEK CAPITAL LETTER OMICRON WITH TONOS * 039F GREEK CAPITAL LETTER OMICRON * 038E GREEK CAPITAL LETTER UPSILON WITH TONOS * 03A5 GREEK CAPITAL LETTER UPSILON * 038F GREEK CAPITAL LETTER OMEGA WITH TONOS * 03A9 GREEK CAPITAL LETTER OMEGA * 0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS * 03B9 GREEK SMALL LETTER IOTA * 03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA * 0399 GREEK CAPITAL LETTER IOTA * 03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA * 03A5 GREEK CAPITAL LETTER UPSILON * 03AC GREEK SMALL LETTER ALPHA WITH TONOS * 03B1 GREEK SMALL LETTER ALPHA * 03AD GREEK SMALL LETTER EPSILON WITH TONOS * 03B5 GREEK SMALL LETTER EPSILON * 03AE GREEK SMALL LETTER ETA WITH TONOS * 03B7 GREEK SMALL LETTER ETA * 03AF GREEK SMALL LETTER IOTA WITH TONOS * 03B9 GREEK SMALL LETTER IOTA * 03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS * 03C5 GREEK SMALL LETTER UPSILON * 03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA * 03B9 GREEK SMALL LETTER IOTA * 03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA * 03C5 GREEK SMALL LETTER UPSILON * 03CC GREEK SMALL LETTER OMICRON WITH TONOS * 03BF GREEK SMALL LETTER OMICRON * 03CD GREEK SMALL LETTER UPSILON WITH TONOS * 03C5 GREEK SMALL LETTER UPSILON * 03CE GREEK SMALL LETTER OMEGA WITH TONOS * 03C9 GREEK SMALL LETTER OMEGA * 03D0 GREEK BETA SYMBOL * 03B2 GREEK SMALL LETTER BETA * 03D1 GREEK THETA SYMBOL * 03B8 GREEK SMALL LETTER THETA * 03D2 GREEK UPSILON WITH HOOK SYMBOL * 03A5 GREEK CAPITAL LETTER UPSILON * 03D3 GREEK UPSILON WITH ACUTE AND HOOK SYMBOL * 03A5 GREEK CAPITAL LETTER UPSILON * 03D4 GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL * 03A5 GREEK CAPITAL LETTER UPSILON * 03D5 GREEK PHI SYMBOL * 03C6 GREEK SMALL LETTER PHI * 03D6 GREEK PI SYMBOL * 03C0 GREEK SMALL LETTER PI * 03F0 GREEK KAPPA SYMBOL * 03BA GREEK SMALL LETTER KAPPA * 03F1 GREEK RHO SYMBOL * 03C1 GREEK SMALL LETTER RHO * 03F2 GREEK LUNATE SIGMA SYMBOL * 03C2 GREEK SMALL LETTER FINAL SIGMA * 03F4 GREEK CAPITAL THETA SYMBOL * 0398 GREEK CAPITAL LETTER THETA * 03F5 GREEK LUNATE EPSILON SYMBOL * 03B5 GREEK SMALL LETTER EPSILON * 03F9 GREEK CAPITAL LUNATE SIGMA SYMBOL * 03A3 GREEK CAPITAL LETTER SIGMA * 0400 CYRILLIC CAPITAL LETTER IE WITH GRAVE * 0415 CYRILLIC CAPITAL LETTER IE * 0401 CYRILLIC CAPITAL LETTER IO * 0415 CYRILLIC CAPITAL LETTER IE * 0403 CYRILLIC CAPITAL LETTER GJE * 0413 CYRILLIC CAPITAL LETTER GHE * 0407 CYRILLIC CAPITAL LETTER YI * 0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I * 040C CYRILLIC CAPITAL LETTER KJE * 041A CYRILLIC CAPITAL LETTER KA * 040D CYRILLIC CAPITAL LETTER I WITH GRAVE * 0418 CYRILLIC CAPITAL LETTER I * 040E CYRILLIC CAPITAL LETTER SHORT U * 0423 CYRILLIC CAPITAL LETTER U * 0419 CYRILLIC CAPITAL LETTER SHORT I * 0418 CYRILLIC CAPITAL LETTER I * 0439 CYRILLIC SMALL LETTER SHORT I * 0438 CYRILLIC SMALL LETTER I * 0450 CYRILLIC SMALL LETTER IE WITH GRAVE * 0435 CYRILLIC SMALL LETTER IE * 0451 CYRILLIC SMALL LETTER IO * 0435 CYRILLIC SMALL LETTER IE * 0453 CYRILLIC SMALL LETTER GJE * 0433 CYRILLIC SMALL LETTER GHE * 0457 CYRILLIC SMALL LETTER YI * 0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I * 045C CYRILLIC SMALL LETTER KJE * 043A CYRILLIC SMALL LETTER KA * 045D CYRILLIC SMALL LETTER I WITH GRAVE * 0438 CYRILLIC SMALL LETTER I * 045E CYRILLIC SMALL LETTER SHORT U * 0443 CYRILLIC SMALL LETTER U * 0476 CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT * 0474 CYRILLIC CAPITAL LETTER IZHITSA * 0477 CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT * 0475 CYRILLIC SMALL LETTER IZHITSA * 0483 COMBINING CYRILLIC TITLO * 0000 * 0484 COMBINING CYRILLIC PALATALIZATION * 0000 * 0485 COMBINING CYRILLIC DASIA PNEUMATA * 0000 * 0486 COMBINING CYRILLIC PSILI PNEUMATA * 0000 * 0487 COMBINING CYRILLIC POKRYTIE * 0000 * 0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN * 0000 * 0489 COMBINING CYRILLIC MILLIONS SIGN * 0000 * 04C1 CYRILLIC CAPITAL LETTER ZHE WITH BREVE * 0416 CYRILLIC CAPITAL LETTER ZHE * 04C2 CYRILLIC SMALL LETTER ZHE WITH BREVE * 0436 CYRILLIC SMALL LETTER ZHE * 04D0 CYRILLIC CAPITAL LETTER A WITH BREVE * 0410 CYRILLIC CAPITAL LETTER A * 04D1 CYRILLIC SMALL LETTER A WITH BREVE * 0430 CYRILLIC SMALL LETTER A * 04D2 CYRILLIC CAPITAL LETTER A WITH DIAERESIS * 0410 CYRILLIC CAPITAL LETTER A * 04D3 CYRILLIC SMALL LETTER A WITH DIAERESIS * 0430 CYRILLIC SMALL LETTER A * 04D6 CYRILLIC CAPITAL LETTER IE WITH BREVE * 0415 CYRILLIC CAPITAL LETTER IE * 04D7 CYRILLIC SMALL LETTER IE WITH BREVE * 0435 CYRILLIC SMALL LETTER IE * 04DA CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS * 04D8 CYRILLIC CAPITAL LETTER SCHWA * 04DB CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS * 04D9 CYRILLIC SMALL LETTER SCHWA * 04DC CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS * 0416 CYRILLIC CAPITAL LETTER ZHE * 04DD CYRILLIC SMALL LETTER ZHE WITH DIAERESIS * 0436 CYRILLIC SMALL LETTER ZHE * 04DE CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS * 0417 CYRILLIC CAPITAL LETTER ZE * 04DF CYRILLIC SMALL LETTER ZE WITH DIAERESIS * 0437 CYRILLIC SMALL LETTER ZE * 04E2 CYRILLIC CAPITAL LETTER I WITH MACRON * 0418 CYRILLIC CAPITAL LETTER I * 04E3 CYRILLIC SMALL LETTER I WITH MACRON * 0438 CYRILLIC SMALL LETTER I * 04E4 CYRILLIC CAPITAL LETTER I WITH DIAERESIS * 0418 CYRILLIC CAPITAL LETTER I * 04E5 CYRILLIC SMALL LETTER I WITH DIAERESIS * 0438 CYRILLIC SMALL LETTER I * 04E6 CYRILLIC CAPITAL LETTER O WITH DIAERESIS * 041E CYRILLIC CAPITAL LETTER O * 04E7 CYRILLIC SMALL LETTER O WITH DIAERESIS * 043E CYRILLIC SMALL LETTER O * 04EA CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS * 04E8 CYRILLIC CAPITAL LETTER BARRED O * 04EB CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS * 04E9 CYRILLIC SMALL LETTER BARRED O * 04EC CYRILLIC CAPITAL LETTER E WITH DIAERESIS * 042D CYRILLIC CAPITAL LETTER E * 04ED CYRILLIC SMALL LETTER E WITH DIAERESIS * 044D CYRILLIC SMALL LETTER E * 04EE CYRILLIC CAPITAL LETTER U WITH MACRON * 0423 CYRILLIC CAPITAL LETTER U * 04EF CYRILLIC SMALL LETTER U WITH MACRON * 0443 CYRILLIC SMALL LETTER U * 04F0 CYRILLIC CAPITAL LETTER U WITH DIAERESIS * 0423 CYRILLIC CAPITAL LETTER U * 04F1 CYRILLIC SMALL LETTER U WITH DIAERESIS * 0443 CYRILLIC SMALL LETTER U * 04F2 CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE * 0423 CYRILLIC CAPITAL LETTER U * 04F3 CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE * 0443 CYRILLIC SMALL LETTER U * 04F4 CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS * 0427 CYRILLIC CAPITAL LETTER CHE * 04F5 CYRILLIC SMALL LETTER CHE WITH DIAERESIS * 0447 CYRILLIC SMALL LETTER CHE * 04F8 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS * 042B CYRILLIC CAPITAL LETTER YERU * 04F9 CYRILLIC SMALL LETTER YERU WITH DIAERESIS * 044B CYRILLIC SMALL LETTER YERU * 0587 ARMENIAN SMALL LIGATURE ECH YIWN * 0565 ARMENIAN SMALL LETTER ECH * 0582 ARMENIAN SMALL LETTER YIWN * 0591 HEBREW ACCENT ETNAHTA * 0000 * 0592 HEBREW ACCENT SEGOL * 0000 * 0593 HEBREW ACCENT SHALSHELET * 0000 * 0594 HEBREW ACCENT ZAQEF QATAN * 0000 * 0595 HEBREW ACCENT ZAQEF GADOL * 0000 * 0596 HEBREW ACCENT TIPEHA * 0000 * 0597 HEBREW ACCENT REVIA * 0000 * 0598 HEBREW ACCENT ZARQA * 0000 * 0599 HEBREW ACCENT PASHTA * 0000 * 059A HEBREW ACCENT YETIV * 0000 * 059B HEBREW ACCENT TEVIR * 0000 * 059C HEBREW ACCENT GERESH * 0000 * 059D HEBREW ACCENT GERESH MUQDAM * 0000 * 059E HEBREW ACCENT GERSHAYIM * 0000 * 059F HEBREW ACCENT QARNEY PARA * 0000 * 05A0 HEBREW ACCENT TELISHA GEDOLA * 0000 * 05A1 HEBREW ACCENT PAZER * 0000 * 05A2 HEBREW ACCENT ATNAH HAFUKH * 0000 * 05A3 HEBREW ACCENT MUNAH * 0000 * 05A4 HEBREW ACCENT MAHAPAKH * 0000 * 05A5 HEBREW ACCENT MERKHA * 0000 * 05A6 HEBREW ACCENT MERKHA KEFULA * 0000 * 05A7 HEBREW ACCENT DARGA * 0000 * 05A8 HEBREW ACCENT QADMA * 0000 * 05A9 HEBREW ACCENT TELISHA QETANA * 0000 * 05AA HEBREW ACCENT YERAH BEN YOMO * 0000 * 05AB HEBREW ACCENT OLE * 0000 * 05AC HEBREW ACCENT ILUY * 0000 * 05AD HEBREW ACCENT DEHI * 0000 * 05AE HEBREW ACCENT ZINOR * 0000 * 05AF HEBREW MARK MASORA CIRCLE * 0000 * 05B0 HEBREW POINT SHEVA * 0000 * 05B1 HEBREW POINT HATAF SEGOL * 0000 * 05B2 HEBREW POINT HATAF PATAH * 0000 * 05B3 HEBREW POINT HATAF QAMATS * 0000 * 05B4 HEBREW POINT HIRIQ * 0000 * 05B5 HEBREW POINT TSERE * 0000 * 05B6 HEBREW POINT SEGOL * 0000 * 05B7 HEBREW POINT PATAH * 0000 * 05B8 HEBREW POINT QAMATS * 0000 * 05B9 HEBREW POINT HOLAM * 0000 * 05BA HEBREW POINT HOLAM HASER FOR VAV * 0000 * 05BB HEBREW POINT QUBUTS * 0000 * 05BC HEBREW POINT DAGESH OR MAPIQ * 0000 * 05BD HEBREW POINT METEG * 0000 * 05BF HEBREW POINT RAFE * 0000 * 05C1 HEBREW POINT SHIN DOT * 0000 * 05C2 HEBREW POINT SIN DOT * 0000 * 05C4 HEBREW MARK UPPER DOT * 0000 * 05C5 HEBREW MARK LOWER DOT * 0000 * 05C7 HEBREW POINT QAMATS QATAN * 0000 * 0610 ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM * 0000 * 0611 ARABIC SIGN ALAYHE ASSALLAM * 0000 * 0612 ARABIC SIGN RAHMATULLAH ALAYHE * 0000 * 0613 ARABIC SIGN RADI ALLAHOU ANHU * 0000 * 0614 ARABIC SIGN TAKHALLUS * 0000 * 0615 ARABIC SMALL HIGH TAH * 0000 * 0616 ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH * 0000 * 0617 ARABIC SMALL HIGH ZAIN * 0000 * 0618 ARABIC SMALL FATHA * 0000 * 0619 ARABIC SMALL DAMMA * 0000 * 061A ARABIC SMALL KASRA * 0000 * 0622 ARABIC LETTER ALEF WITH MADDA ABOVE * 0627 ARABIC LETTER ALEF * 0623 ARABIC LETTER ALEF WITH HAMZA ABOVE * 0627 ARABIC LETTER ALEF * 0624 ARABIC LETTER WAW WITH HAMZA ABOVE * 0648 ARABIC LETTER WAW * 0625 ARABIC LETTER ALEF WITH HAMZA BELOW * 0627 ARABIC LETTER ALEF * 0626 ARABIC LETTER YEH WITH HAMZA ABOVE * 064A ARABIC LETTER YEH * 064B ARABIC FATHATAN * 0000 * 064C ARABIC DAMMATAN * 0000 * 064D ARABIC KASRATAN * 0000 * 064E ARABIC FATHA * 0000 * 064F ARABIC DAMMA * 0000 * 0650 ARABIC KASRA * 0000 * 0651 ARABIC SHADDA * 0000 * 0652 ARABIC SUKUN * 0000 * 0653 ARABIC MADDAH ABOVE * 0000 * 0654 ARABIC HAMZA ABOVE * 0000 * 0655 ARABIC HAMZA BELOW * 0000 * 0656 ARABIC SUBSCRIPT ALEF * 0000 * 0657 ARABIC INVERTED DAMMA * 0000 * 0658 ARABIC MARK NOON GHUNNA * 0000 * 0659 ARABIC ZWARAKAY * 0000 * 065A ARABIC VOWEL SIGN SMALL V ABOVE * 0000 * 065B ARABIC VOWEL SIGN INVERTED SMALL V ABOVE * 0000 * 065C ARABIC VOWEL SIGN DOT BELOW * 0000 * 065D ARABIC REVERSED DAMMA * 0000 * 065E ARABIC FATHA WITH TWO DOTS * 0000 * 0670 ARABIC LETTER SUPERSCRIPT ALEF * 0000 * 0675 ARABIC LETTER HIGH HAMZA ALEF * 0627 ARABIC LETTER ALEF * 0674 ARABIC LETTER HIGH HAMZA * 0676 ARABIC LETTER HIGH HAMZA WAW * 0648 ARABIC LETTER WAW * 0674 ARABIC LETTER HIGH HAMZA * 0677 ARABIC LETTER U WITH HAMZA ABOVE * 06C7 ARABIC LETTER U * 0674 ARABIC LETTER HIGH HAMZA * 0678 ARABIC LETTER HIGH HAMZA YEH * 064A ARABIC LETTER YEH * 0674 ARABIC LETTER HIGH HAMZA * 06C0 ARABIC LETTER HEH WITH YEH ABOVE * 06D5 ARABIC LETTER AE * 06C2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE * 06C1 ARABIC LETTER HEH GOAL * 06D3 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE * 06D2 ARABIC LETTER YEH BARREE * 06D6 ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA * 0000 * 06D7 ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA * 0000 * 06D8 ARABIC SMALL HIGH MEEM INITIAL FORM * 0000 * 06D9 ARABIC SMALL HIGH LAM ALEF * 0000 * 06DA ARABIC SMALL HIGH JEEM * 0000 * 06DB ARABIC SMALL HIGH THREE DOTS * 0000 * 06DC ARABIC SMALL HIGH SEEN * 0000 * 06DE ARABIC START OF RUB EL HIZB * 0000 * 06DF ARABIC SMALL HIGH ROUNDED ZERO * 0000 * 06E0 ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO * 0000 * 06E1 ARABIC SMALL HIGH DOTLESS HEAD OF KHAH * 0000 * 06E2 ARABIC SMALL HIGH MEEM ISOLATED FORM * 0000 * 06E3 ARABIC SMALL LOW SEEN * 0000 * 06E4 ARABIC SMALL HIGH MADDA * 0000 * 06E7 ARABIC SMALL HIGH YEH * 0000 * 06E8 ARABIC SMALL HIGH NOON * 0000 * 06EA ARABIC EMPTY CENTRE LOW STOP * 0000 * 06EB ARABIC EMPTY CENTRE HIGH STOP * 0000 * 06EC ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE * 0000 * 06ED ARABIC SMALL LOW MEEM * 0000 * 0711 SYRIAC LETTER SUPERSCRIPT ALAPH * 0000 * 0730 SYRIAC PTHAHA ABOVE * 0000 * 0731 SYRIAC PTHAHA BELOW * 0000 * 0732 SYRIAC PTHAHA DOTTED * 0000 * 0733 SYRIAC ZQAPHA ABOVE * 0000 * 0734 SYRIAC ZQAPHA BELOW * 0000 * 0735 SYRIAC ZQAPHA DOTTED * 0000 * 0736 SYRIAC RBASA ABOVE * 0000 * 0737 SYRIAC RBASA BELOW * 0000 * 0738 SYRIAC DOTTED ZLAMA HORIZONTAL * 0000 * 0739 SYRIAC DOTTED ZLAMA ANGULAR * 0000 * 073A SYRIAC HBASA ABOVE * 0000 * 073B SYRIAC HBASA BELOW * 0000 * 073C SYRIAC HBASA-ESASA DOTTED * 0000 * 073D SYRIAC ESASA ABOVE * 0000 * 073E SYRIAC ESASA BELOW * 0000 * 073F SYRIAC RWAHA * 0000 * 0740 SYRIAC FEMININE DOT * 0000 * 0741 SYRIAC QUSHSHAYA * 0000 * 0742 SYRIAC RUKKAKHA * 0000 * 0743 SYRIAC TWO VERTICAL DOTS ABOVE * 0000 * 0744 SYRIAC TWO VERTICAL DOTS BELOW * 0000 * 0745 SYRIAC THREE DOTS ABOVE * 0000 * 0746 SYRIAC THREE DOTS BELOW * 0000 * 0747 SYRIAC OBLIQUE LINE ABOVE * 0000 * 0748 SYRIAC OBLIQUE LINE BELOW * 0000 * 0749 SYRIAC MUSIC * 0000 * 074A SYRIAC BARREKH * 0000 * 07A6 THAANA ABAFILI * 0000 * 07A7 THAANA AABAAFILI * 0000 * 07A8 THAANA IBIFILI * 0000 * 07A9 THAANA EEBEEFILI * 0000 * 07AA THAANA UBUFILI * 0000 * 07AB THAANA OOBOOFILI * 0000 * 07AC THAANA EBEFILI * 0000 * 07AD THAANA EYBEYFILI * 0000 * 07AE THAANA OBOFILI * 0000 * 07AF THAANA OABOAFILI * 0000 * 07B0 THAANA SUKUN * 0000 * 07EB NKO COMBINING SHORT HIGH TONE * 0000 * 07EC NKO COMBINING SHORT LOW TONE * 0000 * 07ED NKO COMBINING SHORT RISING TONE * 0000 * 07EE NKO COMBINING LONG DESCENDING TONE * 0000 * 07EF NKO COMBINING LONG HIGH TONE * 0000 * 07F0 NKO COMBINING LONG LOW TONE * 0000 * 07F1 NKO COMBINING LONG RISING TONE * 0000 * 07F2 NKO COMBINING NASALIZATION MARK * 0000 * 07F3 NKO COMBINING DOUBLE DOT ABOVE * 0000 * 0901 DEVANAGARI SIGN CANDRABINDU * 0000 * 0902 DEVANAGARI SIGN ANUSVARA * 0000 * 0903 DEVANAGARI SIGN VISARGA * 0000 * 0929 DEVANAGARI LETTER NNNA * 0928 DEVANAGARI LETTER NA * 0931 DEVANAGARI LETTER RRA * 0930 DEVANAGARI LETTER RA * 0934 DEVANAGARI LETTER LLLA * 0933 DEVANAGARI LETTER LLA * 093C DEVANAGARI SIGN NUKTA * 0000 * 093E DEVANAGARI VOWEL SIGN AA * 0000 * 093F DEVANAGARI VOWEL SIGN I * 0000 * 0940 DEVANAGARI VOWEL SIGN II * 0000 * 0941 DEVANAGARI VOWEL SIGN U * 0000 * 0942 DEVANAGARI VOWEL SIGN UU * 0000 * 0943 DEVANAGARI VOWEL SIGN VOCALIC R * 0000 * 0944 DEVANAGARI VOWEL SIGN VOCALIC RR * 0000 * 0945 DEVANAGARI VOWEL SIGN CANDRA E * 0000 * 0946 DEVANAGARI VOWEL SIGN SHORT E * 0000 * 0947 DEVANAGARI VOWEL SIGN E * 0000 * 0948 DEVANAGARI VOWEL SIGN AI * 0000 * 0949 DEVANAGARI VOWEL SIGN CANDRA O * 0000 * 094A DEVANAGARI VOWEL SIGN SHORT O * 0000 * 094B DEVANAGARI VOWEL SIGN O * 0000 * 094C DEVANAGARI VOWEL SIGN AU * 0000 * 094D DEVANAGARI SIGN VIRAMA * 0000 * 0951 DEVANAGARI STRESS SIGN UDATTA * 0000 * 0952 DEVANAGARI STRESS SIGN ANUDATTA * 0000 * 0953 DEVANAGARI GRAVE ACCENT * 0000 * 0954 DEVANAGARI ACUTE ACCENT * 0000 * 0958 DEVANAGARI LETTER QA * 0915 DEVANAGARI LETTER KA * 0959 DEVANAGARI LETTER KHHA * 0916 DEVANAGARI LETTER KHA * 095A DEVANAGARI LETTER GHHA * 0917 DEVANAGARI LETTER GA * 095B DEVANAGARI LETTER ZA * 091C DEVANAGARI LETTER JA * 095C DEVANAGARI LETTER DDDHA * 0921 DEVANAGARI LETTER DDA * 095D DEVANAGARI LETTER RHA * 0922 DEVANAGARI LETTER DDHA * 095E DEVANAGARI LETTER FA * 092B DEVANAGARI LETTER PHA * 095F DEVANAGARI LETTER YYA * 092F DEVANAGARI LETTER YA * 0962 DEVANAGARI VOWEL SIGN VOCALIC L * 0000 * 0963 DEVANAGARI VOWEL SIGN VOCALIC LL * 0000 * 0981 BENGALI SIGN CANDRABINDU * 0000 * 0982 BENGALI SIGN ANUSVARA * 0000 * 0983 BENGALI SIGN VISARGA * 0000 * 09BC BENGALI SIGN NUKTA * 0000 * 09BE BENGALI VOWEL SIGN AA * 0000 * 09BF BENGALI VOWEL SIGN I * 0000 * 09C0 BENGALI VOWEL SIGN II * 0000 * 09C1 BENGALI VOWEL SIGN U * 0000 * 09C2 BENGALI VOWEL SIGN UU * 0000 * 09C3 BENGALI VOWEL SIGN VOCALIC R * 0000 * 09C4 BENGALI VOWEL SIGN VOCALIC RR * 0000 * 09C7 BENGALI VOWEL SIGN E * 0000 * 09C8 BENGALI VOWEL SIGN AI * 0000 * 09CB BENGALI VOWEL SIGN O * 0000 * 09CC BENGALI VOWEL SIGN AU * 0000 * 09CD BENGALI SIGN VIRAMA * 0000 * 09D7 BENGALI AU LENGTH MARK * 0000 * 09DC BENGALI LETTER RRA * 09A1 BENGALI LETTER DDA * 09DD BENGALI LETTER RHA * 09A2 BENGALI LETTER DDHA * 09DF BENGALI LETTER YYA * 09AF BENGALI LETTER YA * 09E2 BENGALI VOWEL SIGN VOCALIC L * 0000 * 09E3 BENGALI VOWEL SIGN VOCALIC LL * 0000 * 0A01 GURMUKHI SIGN ADAK BINDI * 0000 * 0A02 GURMUKHI SIGN BINDI * 0000 * 0A03 GURMUKHI SIGN VISARGA * 0000 * 0A33 GURMUKHI LETTER LLA * 0A32 GURMUKHI LETTER LA * 0A36 GURMUKHI LETTER SHA * 0A38 GURMUKHI LETTER SA * 0A3C GURMUKHI SIGN NUKTA * 0000 * 0A3E GURMUKHI VOWEL SIGN AA * 0000 * 0A3F GURMUKHI VOWEL SIGN I * 0000 * 0A40 GURMUKHI VOWEL SIGN II * 0000 * 0A41 GURMUKHI VOWEL SIGN U * 0000 * 0A42 GURMUKHI VOWEL SIGN UU * 0000 * 0A47 GURMUKHI VOWEL SIGN EE * 0000 * 0A48 GURMUKHI VOWEL SIGN AI * 0000 * 0A4B GURMUKHI VOWEL SIGN OO * 0000 * 0A4C GURMUKHI VOWEL SIGN AU * 0000 * 0A4D GURMUKHI SIGN VIRAMA * 0000 * 0A51 GURMUKHI SIGN UDAAT * 0000 * 0A59 GURMUKHI LETTER KHHA * 0A16 GURMUKHI LETTER KHA * 0A5A GURMUKHI LETTER GHHA * 0A17 GURMUKHI LETTER GA * 0A5B GURMUKHI LETTER ZA * 0A1C GURMUKHI LETTER JA * 0A5E GURMUKHI LETTER FA * 0A2B GURMUKHI LETTER PHA * 0A70 GURMUKHI TIPPI * 0000 * 0A71 GURMUKHI ADDAK * 0000 * 0A75 GURMUKHI SIGN YAKASH * 0000 * 0A81 GUJARATI SIGN CANDRABINDU * 0000 * 0A82 GUJARATI SIGN ANUSVARA * 0000 * 0A83 GUJARATI SIGN VISARGA * 0000 * 0ABC GUJARATI SIGN NUKTA * 0000 * 0ABE GUJARATI VOWEL SIGN AA * 0000 * 0ABF GUJARATI VOWEL SIGN I * 0000 * 0AC0 GUJARATI VOWEL SIGN II * 0000 * 0AC1 GUJARATI VOWEL SIGN U * 0000 * 0AC2 GUJARATI VOWEL SIGN UU * 0000 * 0AC3 GUJARATI VOWEL SIGN VOCALIC R * 0000 * 0AC4 GUJARATI VOWEL SIGN VOCALIC RR * 0000 * 0AC5 GUJARATI VOWEL SIGN CANDRA E * 0000 * 0AC7 GUJARATI VOWEL SIGN E * 0000 * 0AC8 GUJARATI VOWEL SIGN AI * 0000 * 0AC9 GUJARATI VOWEL SIGN CANDRA O * 0000 * 0ACB GUJARATI VOWEL SIGN O * 0000 * 0ACC GUJARATI VOWEL SIGN AU * 0000 * 0ACD GUJARATI SIGN VIRAMA * 0000 * 0AE2 GUJARATI VOWEL SIGN VOCALIC L * 0000 * 0AE3 GUJARATI VOWEL SIGN VOCALIC LL * 0000 * 0B01 ORIYA SIGN CANDRABINDU * 0000 * 0B02 ORIYA SIGN ANUSVARA * 0000 * 0B03 ORIYA SIGN VISARGA * 0000 * 0B3C ORIYA SIGN NUKTA * 0000 * 0B3E ORIYA VOWEL SIGN AA * 0000 * 0B3F ORIYA VOWEL SIGN I * 0000 * 0B40 ORIYA VOWEL SIGN II * 0000 * 0B41 ORIYA VOWEL SIGN U * 0000 * 0B42 ORIYA VOWEL SIGN UU * 0000 * 0B43 ORIYA VOWEL SIGN VOCALIC R * 0000 * 0B44 ORIYA VOWEL SIGN VOCALIC RR * 0000 * 0B47 ORIYA VOWEL SIGN E * 0000 * 0B48 ORIYA VOWEL SIGN AI * 0000 * 0B4B ORIYA VOWEL SIGN O * 0000 * 0B4C ORIYA VOWEL SIGN AU * 0000 * 0B4D ORIYA SIGN VIRAMA * 0000 * 0B56 ORIYA AI LENGTH MARK * 0000 * 0B57 ORIYA AU LENGTH MARK * 0000 * 0B5C ORIYA LETTER RRA * 0B21 ORIYA LETTER DDA * 0B5D ORIYA LETTER RHA * 0B22 ORIYA LETTER DDHA * 0B62 ORIYA VOWEL SIGN VOCALIC L * 0000 * 0B63 ORIYA VOWEL SIGN VOCALIC LL * 0000 * 0B82 TAMIL SIGN ANUSVARA * 0000 * 0B94 TAMIL LETTER AU * 0B92 TAMIL LETTER O * 0BBE TAMIL VOWEL SIGN AA * 0000 * 0BBF TAMIL VOWEL SIGN I * 0000 * 0BC0 TAMIL VOWEL SIGN II * 0000 * 0BC1 TAMIL VOWEL SIGN U * 0000 * 0BC2 TAMIL VOWEL SIGN UU * 0000 * 0BC6 TAMIL VOWEL SIGN E * 0000 * 0BC7 TAMIL VOWEL SIGN EE * 0000 * 0BC8 TAMIL VOWEL SIGN AI * 0000 * 0BCA TAMIL VOWEL SIGN O * 0000 * 0BCB TAMIL VOWEL SIGN OO * 0000 * 0BCC TAMIL VOWEL SIGN AU * 0000 * 0BCD TAMIL SIGN VIRAMA * 0000 * 0BD7 TAMIL AU LENGTH MARK * 0000 * 0C01 TELUGU SIGN CANDRABINDU * 0000 * 0C02 TELUGU SIGN ANUSVARA * 0000 * 0C03 TELUGU SIGN VISARGA * 0000 * 0C3E TELUGU VOWEL SIGN AA * 0000 * 0C3F TELUGU VOWEL SIGN I * 0000 * 0C40 TELUGU VOWEL SIGN II * 0000 * 0C41 TELUGU VOWEL SIGN U * 0000 * 0C42 TELUGU VOWEL SIGN UU * 0000 * 0C43 TELUGU VOWEL SIGN VOCALIC R * 0000 * 0C44 TELUGU VOWEL SIGN VOCALIC RR * 0000 * 0C46 TELUGU VOWEL SIGN E * 0000 * 0C47 TELUGU VOWEL SIGN EE * 0000 * 0C48 TELUGU VOWEL SIGN AI * 0000 * 0C4A TELUGU VOWEL SIGN O * 0000 * 0C4B TELUGU VOWEL SIGN OO * 0000 * 0C4C TELUGU VOWEL SIGN AU * 0000 * 0C4D TELUGU SIGN VIRAMA * 0000 * 0C55 TELUGU LENGTH MARK * 0000 * 0C56 TELUGU AI LENGTH MARK * 0000 * 0C62 TELUGU VOWEL SIGN VOCALIC L * 0000 * 0C63 TELUGU VOWEL SIGN VOCALIC LL * 0000 * 0C82 KANNADA SIGN ANUSVARA * 0000 * 0C83 KANNADA SIGN VISARGA * 0000 * 0CBC KANNADA SIGN NUKTA * 0000 * 0CBE KANNADA VOWEL SIGN AA * 0000 * 0CBF KANNADA VOWEL SIGN I * 0000 * 0CC0 KANNADA VOWEL SIGN II * 0000 * 0CC1 KANNADA VOWEL SIGN U * 0000 * 0CC2 KANNADA VOWEL SIGN UU * 0000 * 0CC3 KANNADA VOWEL SIGN VOCALIC R * 0000 * 0CC4 KANNADA VOWEL SIGN VOCALIC RR * 0000 * 0CC6 KANNADA VOWEL SIGN E * 0000 * 0CC7 KANNADA VOWEL SIGN EE * 0000 * 0CC8 KANNADA VOWEL SIGN AI * 0000 * 0CCA KANNADA VOWEL SIGN O * 0000 * 0CCB KANNADA VOWEL SIGN OO * 0000 * 0CCC KANNADA VOWEL SIGN AU * 0000 * 0CCD KANNADA SIGN VIRAMA * 0000 * 0CD5 KANNADA LENGTH MARK * 0000 * 0CD6 KANNADA AI LENGTH MARK * 0000 * 0CE2 KANNADA VOWEL SIGN VOCALIC L * 0000 * 0CE3 KANNADA VOWEL SIGN VOCALIC LL * 0000 * 0D02 MALAYALAM SIGN ANUSVARA * 0000 * 0D03 MALAYALAM SIGN VISARGA * 0000 * 0D3E MALAYALAM VOWEL SIGN AA * 0000 * 0D3F MALAYALAM VOWEL SIGN I * 0000 * 0D40 MALAYALAM VOWEL SIGN II * 0000 * 0D41 MALAYALAM VOWEL SIGN U * 0000 * 0D42 MALAYALAM VOWEL SIGN UU * 0000 * 0D43 MALAYALAM VOWEL SIGN VOCALIC R * 0000 * 0D44 MALAYALAM VOWEL SIGN VOCALIC RR * 0000 * 0D46 MALAYALAM VOWEL SIGN E * 0000 * 0D47 MALAYALAM VOWEL SIGN EE * 0000 * 0D48 MALAYALAM VOWEL SIGN AI * 0000 * 0D4A MALAYALAM VOWEL SIGN O * 0000 * 0D4B MALAYALAM VOWEL SIGN OO * 0000 * 0D4C MALAYALAM VOWEL SIGN AU * 0000 * 0D4D MALAYALAM SIGN VIRAMA * 0000 * 0D57 MALAYALAM AU LENGTH MARK * 0000 * 0D62 MALAYALAM VOWEL SIGN VOCALIC L * 0000 * 0D63 MALAYALAM VOWEL SIGN VOCALIC LL * 0000 * 0D82 SINHALA SIGN ANUSVARAYA * 0000 * 0D83 SINHALA SIGN VISARGAYA * 0000 * 0DCA SINHALA SIGN AL-LAKUNA * 0000 * 0DCF SINHALA VOWEL SIGN AELA-PILLA * 0000 * 0DD0 SINHALA VOWEL SIGN KETTI AEDA-PILLA * 0000 * 0DD1 SINHALA VOWEL SIGN DIGA AEDA-PILLA * 0000 * 0DD2 SINHALA VOWEL SIGN KETTI IS-PILLA * 0000 * 0DD3 SINHALA VOWEL SIGN DIGA IS-PILLA * 0000 * 0DD4 SINHALA VOWEL SIGN KETTI PAA-PILLA * 0000 * 0DD6 SINHALA VOWEL SIGN DIGA PAA-PILLA * 0000 * 0DD8 SINHALA VOWEL SIGN GAETTA-PILLA * 0000 * 0DD9 SINHALA VOWEL SIGN KOMBUVA * 0000 * 0DDA SINHALA VOWEL SIGN DIGA KOMBUVA * 0000 * 0DDB SINHALA VOWEL SIGN KOMBU DEKA * 0000 * 0DDC SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA * 0000 * 0DDD SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA * 0000 * 0DDE SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA * 0000 * 0DDF SINHALA VOWEL SIGN GAYANUKITTA * 0000 * 0DF2 SINHALA VOWEL SIGN DIGA GAETTA-PILLA * 0000 * 0DF3 SINHALA VOWEL SIGN DIGA GAYANUKITTA * 0000 * 0E31 THAI CHARACTER MAI HAN-AKAT * 0000 * 0E33 THAI CHARACTER SARA AM * 0E32 THAI CHARACTER SARA AA * 0E34 THAI CHARACTER SARA I * 0000 * 0E35 THAI CHARACTER SARA II * 0000 * 0E36 THAI CHARACTER SARA UE * 0000 * 0E37 THAI CHARACTER SARA UEE * 0000 * 0E38 THAI CHARACTER SARA U * 0000 * 0E39 THAI CHARACTER SARA UU * 0000 * 0E3A THAI CHARACTER PHINTHU * 0000 * 0E47 THAI CHARACTER MAITAIKHU * 0000 * 0E48 THAI CHARACTER MAI EK * 0000 * 0E49 THAI CHARACTER MAI THO * 0000 * 0E4A THAI CHARACTER MAI TRI * 0000 * 0E4B THAI CHARACTER MAI CHATTAWA * 0000 * 0E4C THAI CHARACTER THANTHAKHAT * 0000 * 0E4D THAI CHARACTER NIKHAHIT * 0000 * 0E4E THAI CHARACTER YAMAKKAN * 0000 * 0EB1 LAO VOWEL SIGN MAI KAN * 0000 * 0EB3 LAO VOWEL SIGN AM * 0EB2 LAO VOWEL SIGN AA * 0EB4 LAO VOWEL SIGN I * 0000 * 0EB5 LAO VOWEL SIGN II * 0000 * 0EB6 LAO VOWEL SIGN Y * 0000 * 0EB7 LAO VOWEL SIGN YY * 0000 * 0EB8 LAO VOWEL SIGN U * 0000 * 0EB9 LAO VOWEL SIGN UU * 0000 * 0EBB LAO VOWEL SIGN MAI KON * 0000 * 0EBC LAO SEMIVOWEL SIGN LO * 0000 * 0EC8 LAO TONE MAI EK * 0000 * 0EC9 LAO TONE MAI THO * 0000 * 0ECA LAO TONE MAI TI * 0000 * 0ECB LAO TONE MAI CATAWA * 0000 * 0ECC LAO CANCELLATION MARK * 0000 * 0ECD LAO NIGGAHITA * 0000 * 0EDC LAO HO NO * 0EAB LAO LETTER HO SUNG * 0E99 LAO LETTER NO * 0EDD LAO HO MO * 0EAB LAO LETTER HO SUNG * 0EA1 LAO LETTER MO * 0F0C TIBETAN MARK DELIMITER TSHEG BSTAR * 0F0B TIBETAN MARK INTERSYLLABIC TSHEG * 0F18 TIBETAN ASTROLOGICAL SIGN -KHYUD PA * 0000 * 0F19 TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS * 0000 * 0F35 TIBETAN MARK NGAS BZUNG NYI ZLA * 0000 * 0F37 TIBETAN MARK NGAS BZUNG SGOR RTAGS * 0000 * 0F39 TIBETAN MARK TSA -PHRU * 0000 * 0F3E TIBETAN SIGN YAR TSHES * 0000 * 0F3F TIBETAN SIGN MAR TSHES * 0000 * 0F43 TIBETAN LETTER GHA * 0F42 TIBETAN LETTER GA * 0F4D TIBETAN LETTER DDHA * 0F4C TIBETAN LETTER DDA * 0F52 TIBETAN LETTER DHA * 0F51 TIBETAN LETTER DA * 0F57 TIBETAN LETTER BHA * 0F56 TIBETAN LETTER BA * 0F5C TIBETAN LETTER DZHA * 0F5B TIBETAN LETTER DZA * 0F69 TIBETAN LETTER KSSA * 0F40 TIBETAN LETTER KA * 0F71 TIBETAN VOWEL SIGN AA * 0000 * 0F72 TIBETAN VOWEL SIGN I * 0000 * 0F73 TIBETAN VOWEL SIGN II * 0000 * 0F74 TIBETAN VOWEL SIGN U * 0000 * 0F75 TIBETAN VOWEL SIGN UU * 0000 * 0F76 TIBETAN VOWEL SIGN VOCALIC R * 0000 * 0F77 TIBETAN VOWEL SIGN VOCALIC RR * 0000 * 0F78 TIBETAN VOWEL SIGN VOCALIC L * 0000 * 0F79 TIBETAN VOWEL SIGN VOCALIC LL * 0000 * 0F7A TIBETAN VOWEL SIGN E * 0000 * 0F7B TIBETAN VOWEL SIGN EE * 0000 * 0F7C TIBETAN VOWEL SIGN O * 0000 * 0F7D TIBETAN VOWEL SIGN OO * 0000 * 0F7E TIBETAN SIGN RJES SU NGA RO * 0000 * 0F7F TIBETAN SIGN RNAM BCAD * 0000 * 0F80 TIBETAN VOWEL SIGN REVERSED I * 0000 * 0F81 TIBETAN VOWEL SIGN REVERSED II * 0000 * 0F82 TIBETAN SIGN NYI ZLA NAA DA * 0000 * 0F83 TIBETAN SIGN SNA LDAN * 0000 * 0F84 TIBETAN MARK HALANTA * 0000 * 0F86 TIBETAN SIGN LCI RTAGS * 0000 * 0F87 TIBETAN SIGN YANG RTAGS * 0000 * 0F90 TIBETAN SUBJOINED LETTER KA * 0000 * 0F91 TIBETAN SUBJOINED LETTER KHA * 0000 * 0F92 TIBETAN SUBJOINED LETTER GA * 0000 * 0F93 TIBETAN SUBJOINED LETTER GHA * 0000 * 0F94 TIBETAN SUBJOINED LETTER NGA * 0000 * 0F95 TIBETAN SUBJOINED LETTER CA * 0000 * 0F96 TIBETAN SUBJOINED LETTER CHA * 0000 * 0F97 TIBETAN SUBJOINED LETTER JA * 0000 * 0F99 TIBETAN SUBJOINED LETTER NYA * 0000 * 0F9A TIBETAN SUBJOINED LETTER TTA * 0000 * 0F9B TIBETAN SUBJOINED LETTER TTHA * 0000 * 0F9C TIBETAN SUBJOINED LETTER DDA * 0000 * 0F9D TIBETAN SUBJOINED LETTER DDHA * 0000 * 0F9E TIBETAN SUBJOINED LETTER NNA * 0000 * 0F9F TIBETAN SUBJOINED LETTER TA * 0000 * 0FA0 TIBETAN SUBJOINED LETTER THA * 0000 * 0FA1 TIBETAN SUBJOINED LETTER DA * 0000 * 0FA2 TIBETAN SUBJOINED LETTER DHA * 0000 * 0FA3 TIBETAN SUBJOINED LETTER NA * 0000 * 0FA4 TIBETAN SUBJOINED LETTER PA * 0000 * 0FA5 TIBETAN SUBJOINED LETTER PHA * 0000 * 0FA6 TIBETAN SUBJOINED LETTER BA * 0000 * 0FA7 TIBETAN SUBJOINED LETTER BHA * 0000 * 0FA8 TIBETAN SUBJOINED LETTER MA * 0000 * 0FA9 TIBETAN SUBJOINED LETTER TSA * 0000 * 0FAA TIBETAN SUBJOINED LETTER TSHA * 0000 * 0FAB TIBETAN SUBJOINED LETTER DZA * 0000 * 0FAC TIBETAN SUBJOINED LETTER DZHA * 0000 * 0FAD TIBETAN SUBJOINED LETTER WA * 0000 * 0FAE TIBETAN SUBJOINED LETTER ZHA * 0000 * 0FAF TIBETAN SUBJOINED LETTER ZA * 0000 * 0FB0 TIBETAN SUBJOINED LETTER -A * 0000 * 0FB1 TIBETAN SUBJOINED LETTER YA * 0000 * 0FB2 TIBETAN SUBJOINED LETTER RA * 0000 * 0FB3 TIBETAN SUBJOINED LETTER LA * 0000 * 0FB4 TIBETAN SUBJOINED LETTER SHA * 0000 * 0FB5 TIBETAN SUBJOINED LETTER SSA * 0000 * 0FB6 TIBETAN SUBJOINED LETTER SA * 0000 * 0FB7 TIBETAN SUBJOINED LETTER HA * 0000 * 0FB8 TIBETAN SUBJOINED LETTER A * 0000 * 0FB9 TIBETAN SUBJOINED LETTER KSSA * 0000 * 0FBA TIBETAN SUBJOINED LETTER FIXED-FORM WA * 0000 * 0FBB TIBETAN SUBJOINED LETTER FIXED-FORM YA * 0000 * 0FBC TIBETAN SUBJOINED LETTER FIXED-FORM RA * 0000 * 0FC6 TIBETAN SYMBOL PADMA GDAN * 0000 * 1026 MYANMAR LETTER UU * 1025 MYANMAR LETTER U * 102B MYANMAR VOWEL SIGN TALL AA * 0000 * 102C MYANMAR VOWEL SIGN AA * 0000 * 102D MYANMAR VOWEL SIGN I * 0000 * 102E MYANMAR VOWEL SIGN II * 0000 * 102F MYANMAR VOWEL SIGN U * 0000 * 1030 MYANMAR VOWEL SIGN UU * 0000 * 1031 MYANMAR VOWEL SIGN E * 0000 * 1032 MYANMAR VOWEL SIGN AI * 0000 * 1033 MYANMAR VOWEL SIGN MON II * 0000 * 1034 MYANMAR VOWEL SIGN MON O * 0000 * 1035 MYANMAR VOWEL SIGN E ABOVE * 0000 * 1036 MYANMAR SIGN ANUSVARA * 0000 * 1037 MYANMAR SIGN DOT BELOW * 0000 * 1038 MYANMAR SIGN VISARGA * 0000 * 1039 MYANMAR SIGN VIRAMA * 0000 * 103A MYANMAR SIGN ASAT * 0000 * 103B MYANMAR CONSONANT SIGN MEDIAL YA * 0000 * 103C MYANMAR CONSONANT SIGN MEDIAL RA * 0000 * 103D MYANMAR CONSONANT SIGN MEDIAL WA * 0000 * 103E MYANMAR CONSONANT SIGN MEDIAL HA * 0000 * 1056 MYANMAR VOWEL SIGN VOCALIC R * 0000 * 1057 MYANMAR VOWEL SIGN VOCALIC RR * 0000 * 1058 MYANMAR VOWEL SIGN VOCALIC L * 0000 * 1059 MYANMAR VOWEL SIGN VOCALIC LL * 0000 * 105E MYANMAR CONSONANT SIGN MON MEDIAL NA * 0000 * 105F MYANMAR CONSONANT SIGN MON MEDIAL MA * 0000 * 1060 MYANMAR CONSONANT SIGN MON MEDIAL LA * 0000 * 1062 MYANMAR VOWEL SIGN SGAW KAREN EU * 0000 * 1063 MYANMAR TONE MARK SGAW KAREN HATHI * 0000 * 1064 MYANMAR TONE MARK SGAW KAREN KE PHO * 0000 * 1067 MYANMAR VOWEL SIGN WESTERN PWO KAREN EU * 0000 * 1068 MYANMAR VOWEL SIGN WESTERN PWO KAREN UE * 0000 * 1069 MYANMAR SIGN WESTERN PWO KAREN TONE-1 * 0000 * 106A MYANMAR SIGN WESTERN PWO KAREN TONE-2 * 0000 * 106B MYANMAR SIGN WESTERN PWO KAREN TONE-3 * 0000 * 106C MYANMAR SIGN WESTERN PWO KAREN TONE-4 * 0000 * 106D MYANMAR SIGN WESTERN PWO KAREN TONE-5 * 0000 * 1071 MYANMAR VOWEL SIGN GEBA KAREN I * 0000 * 1072 MYANMAR VOWEL SIGN KAYAH OE * 0000 * 1073 MYANMAR VOWEL SIGN KAYAH U * 0000 * 1074 MYANMAR VOWEL SIGN KAYAH EE * 0000 * 1082 MYANMAR CONSONANT SIGN SHAN MEDIAL WA * 0000 * 1083 MYANMAR VOWEL SIGN SHAN AA * 0000 * 1084 MYANMAR VOWEL SIGN SHAN E * 0000 * 1085 MYANMAR VOWEL SIGN SHAN E ABOVE * 0000 * 1086 MYANMAR VOWEL SIGN SHAN FINAL Y * 0000 * 1087 MYANMAR SIGN SHAN TONE-2 * 0000 * 1088 MYANMAR SIGN SHAN TONE-3 * 0000 * 1089 MYANMAR SIGN SHAN TONE-5 * 0000 * 108A MYANMAR SIGN SHAN TONE-6 * 0000 * 108B MYANMAR SIGN SHAN COUNCIL TONE-2 * 0000 * 108C MYANMAR SIGN SHAN COUNCIL TONE-3 * 0000 * 108D MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE * 0000 * 108F MYANMAR SIGN RUMAI PALAUNG TONE-5 * 0000 * 10FC MODIFIER LETTER GEORGIAN NAR * 10DC GEORGIAN LETTER NAR * 135F ETHIOPIC COMBINING GEMINATION MARK * 0000 * 1712 TAGALOG VOWEL SIGN I * 0000 * 1713 TAGALOG VOWEL SIGN U * 0000 * 1714 TAGALOG SIGN VIRAMA * 0000 * 1732 HANUNOO VOWEL SIGN I * 0000 * 1733 HANUNOO VOWEL SIGN U * 0000 * 1734 HANUNOO SIGN PAMUDPOD * 0000 * 1752 BUHID VOWEL SIGN I * 0000 * 1753 BUHID VOWEL SIGN U * 0000 * 1772 TAGBANWA VOWEL SIGN I * 0000 * 1773 TAGBANWA VOWEL SIGN U * 0000 * 17B6 KHMER VOWEL SIGN AA * 0000 * 17B7 KHMER VOWEL SIGN I * 0000 * 17B8 KHMER VOWEL SIGN II * 0000 * 17B9 KHMER VOWEL SIGN Y * 0000 * 17BA KHMER VOWEL SIGN YY * 0000 * 17BB KHMER VOWEL SIGN U * 0000 * 17BC KHMER VOWEL SIGN UU * 0000 * 17BD KHMER VOWEL SIGN UA * 0000 * 17BE KHMER VOWEL SIGN OE * 0000 * 17BF KHMER VOWEL SIGN YA * 0000 * 17C0 KHMER VOWEL SIGN IE * 0000 * 17C1 KHMER VOWEL SIGN E * 0000 * 17C2 KHMER VOWEL SIGN AE * 0000 * 17C3 KHMER VOWEL SIGN AI * 0000 * 17C4 KHMER VOWEL SIGN OO * 0000 * 17C5 KHMER VOWEL SIGN AU * 0000 * 17C6 KHMER SIGN NIKAHIT * 0000 * 17C7 KHMER SIGN REAHMUK * 0000 * 17C8 KHMER SIGN YUUKALEAPINTU * 0000 * 17C9 KHMER SIGN MUUSIKATOAN * 0000 * 17CA KHMER SIGN TRIISAP * 0000 * 17CB KHMER SIGN BANTOC * 0000 * 17CC KHMER SIGN ROBAT * 0000 * 17CD KHMER SIGN TOANDAKHIAT * 0000 * 17CE KHMER SIGN KAKABAT * 0000 * 17CF KHMER SIGN AHSDA * 0000 * 17D0 KHMER SIGN SAMYOK SANNYA * 0000 * 17D1 KHMER SIGN VIRIAM * 0000 * 17D2 KHMER SIGN COENG * 0000 * 17D3 KHMER SIGN BATHAMASAT * 0000 * 17DD KHMER SIGN ATTHACAN * 0000 * 180B MONGOLIAN FREE VARIATION SELECTOR ONE * 0000 * 180C MONGOLIAN FREE VARIATION SELECTOR TWO * 0000 * 180D MONGOLIAN FREE VARIATION SELECTOR THREE * 0000 * 18A9 MONGOLIAN LETTER ALI GALI DAGALGA * 0000 * 1920 LIMBU VOWEL SIGN A * 0000 * 1921 LIMBU VOWEL SIGN I * 0000 * 1922 LIMBU VOWEL SIGN U * 0000 * 1923 LIMBU VOWEL SIGN EE * 0000 * 1924 LIMBU VOWEL SIGN AI * 0000 * 1925 LIMBU VOWEL SIGN OO * 0000 * 1926 LIMBU VOWEL SIGN AU * 0000 * 1927 LIMBU VOWEL SIGN E * 0000 * 1928 LIMBU VOWEL SIGN O * 0000 * 1929 LIMBU SUBJOINED LETTER YA * 0000 * 192A LIMBU SUBJOINED LETTER RA * 0000 * 192B LIMBU SUBJOINED LETTER WA * 0000 * 1930 LIMBU SMALL LETTER KA * 0000 * 1931 LIMBU SMALL LETTER NGA * 0000 * 1932 LIMBU SMALL LETTER ANUSVARA * 0000 * 1933 LIMBU SMALL LETTER TA * 0000 * 1934 LIMBU SMALL LETTER NA * 0000 * 1935 LIMBU SMALL LETTER PA * 0000 * 1936 LIMBU SMALL LETTER MA * 0000 * 1937 LIMBU SMALL LETTER RA * 0000 * 1938 LIMBU SMALL LETTER LA * 0000 * 1939 LIMBU SIGN MUKPHRENG * 0000 * 193A LIMBU SIGN KEMPHRENG * 0000 * 193B LIMBU SIGN SA-I * 0000 * 19B0 NEW TAI LUE VOWEL SIGN VOWEL SHORTENER * 0000 * 19B1 NEW TAI LUE VOWEL SIGN AA * 0000 * 19B2 NEW TAI LUE VOWEL SIGN II * 0000 * 19B3 NEW TAI LUE VOWEL SIGN U * 0000 * 19B4 NEW TAI LUE VOWEL SIGN UU * 0000 * 19B5 NEW TAI LUE VOWEL SIGN E * 0000 * 19B6 NEW TAI LUE VOWEL SIGN AE * 0000 * 19B7 NEW TAI LUE VOWEL SIGN O * 0000 * 19B8 NEW TAI LUE VOWEL SIGN OA * 0000 * 19B9 NEW TAI LUE VOWEL SIGN UE * 0000 * 19BA NEW TAI LUE VOWEL SIGN AY * 0000 * 19BB NEW TAI LUE VOWEL SIGN AAY * 0000 * 19BC NEW TAI LUE VOWEL SIGN UY * 0000 * 19BD NEW TAI LUE VOWEL SIGN OY * 0000 * 19BE NEW TAI LUE VOWEL SIGN OAY * 0000 * 19BF NEW TAI LUE VOWEL SIGN UEY * 0000 * 19C0 NEW TAI LUE VOWEL SIGN IY * 0000 * 19C8 NEW TAI LUE TONE MARK-1 * 0000 * 19C9 NEW TAI LUE TONE MARK-2 * 0000 * 1A17 BUGINESE VOWEL SIGN I * 0000 * 1A18 BUGINESE VOWEL SIGN U * 0000 * 1A19 BUGINESE VOWEL SIGN E * 0000 * 1A1A BUGINESE VOWEL SIGN O * 0000 * 1A1B BUGINESE VOWEL SIGN AE * 0000 * 1B00 BALINESE SIGN ULU RICEM * 0000 * 1B01 BALINESE SIGN ULU CANDRA * 0000 * 1B02 BALINESE SIGN CECEK * 0000 * 1B03 BALINESE SIGN SURANG * 0000 * 1B04 BALINESE SIGN BISAH * 0000 * 1B06 BALINESE LETTER AKARA TEDUNG * 1B05 BALINESE LETTER AKARA * 1B08 BALINESE LETTER IKARA TEDUNG * 1B07 BALINESE LETTER IKARA * 1B0A BALINESE LETTER UKARA TEDUNG * 1B09 BALINESE LETTER UKARA * 1B0C BALINESE LETTER RA REPA TEDUNG * 1B0B BALINESE LETTER RA REPA * 1B0E BALINESE LETTER LA LENGA TEDUNG * 1B0D BALINESE LETTER LA LENGA * 1B12 BALINESE LETTER OKARA TEDUNG * 1B11 BALINESE LETTER OKARA * 1B34 BALINESE SIGN REREKAN * 0000 * 1B35 BALINESE VOWEL SIGN TEDUNG * 0000 * 1B36 BALINESE VOWEL SIGN ULU * 0000 * 1B37 BALINESE VOWEL SIGN ULU SARI * 0000 * 1B38 BALINESE VOWEL SIGN SUKU * 0000 * 1B39 BALINESE VOWEL SIGN SUKU ILUT * 0000 * 1B3A BALINESE VOWEL SIGN RA REPA * 0000 * 1B3B BALINESE VOWEL SIGN RA REPA TEDUNG * 0000 * 1B3C BALINESE VOWEL SIGN LA LENGA * 0000 * 1B3D BALINESE VOWEL SIGN LA LENGA TEDUNG * 0000 * 1B3E BALINESE VOWEL SIGN TALING * 0000 * 1B3F BALINESE VOWEL SIGN TALING REPA * 0000 * 1B40 BALINESE VOWEL SIGN TALING TEDUNG * 0000 * 1B41 BALINESE VOWEL SIGN TALING REPA TEDUNG * 0000 * 1B42 BALINESE VOWEL SIGN PEPET * 0000 * 1B43 BALINESE VOWEL SIGN PEPET TEDUNG * 0000 * 1B44 BALINESE ADEG ADEG * 0000 * 1B6B BALINESE MUSICAL SYMBOL COMBINING TEGEH * 0000 * 1B6C BALINESE MUSICAL SYMBOL COMBINING ENDEP * 0000 * 1B6D BALINESE MUSICAL SYMBOL COMBINING KEMPUL * 0000 * 1B6E BALINESE MUSICAL SYMBOL COMBINING KEMPLI * 0000 * 1B6F BALINESE MUSICAL SYMBOL COMBINING JEGOGAN * 0000 * 1B70 BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN * 0000 * 1B71 BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN * 0000 * 1B72 BALINESE MUSICAL SYMBOL COMBINING BENDE * 0000 * 1B73 BALINESE MUSICAL SYMBOL COMBINING GONG * 0000 * 1B80 SUNDANESE SIGN PANYECEK * 0000 * 1B81 SUNDANESE SIGN PANGLAYAR * 0000 * 1B82 SUNDANESE SIGN PANGWISAD * 0000 * 1BA1 SUNDANESE CONSONANT SIGN PAMINGKAL * 0000 * 1BA2 SUNDANESE CONSONANT SIGN PANYAKRA * 0000 * 1BA3 SUNDANESE CONSONANT SIGN PANYIKU * 0000 * 1BA4 SUNDANESE VOWEL SIGN PANGHULU * 0000 * 1BA5 SUNDANESE VOWEL SIGN PANYUKU * 0000 * 1BA6 SUNDANESE VOWEL SIGN PANAELAENG * 0000 * 1BA7 SUNDANESE VOWEL SIGN PANOLONG * 0000 * 1BA8 SUNDANESE VOWEL SIGN PAMEPET * 0000 * 1BA9 SUNDANESE VOWEL SIGN PANEULEUNG * 0000 * 1BAA SUNDANESE SIGN PAMAAEH * 0000 * 1C24 LEPCHA SUBJOINED LETTER YA * 0000 * 1C25 LEPCHA SUBJOINED LETTER RA * 0000 * 1C26 LEPCHA VOWEL SIGN AA * 0000 * 1C27 LEPCHA VOWEL SIGN I * 0000 * 1C28 LEPCHA VOWEL SIGN O * 0000 * 1C29 LEPCHA VOWEL SIGN OO * 0000 * 1C2A LEPCHA VOWEL SIGN U * 0000 * 1C2B LEPCHA VOWEL SIGN UU * 0000 * 1C2C LEPCHA VOWEL SIGN E * 0000 * 1C2D LEPCHA CONSONANT SIGN K * 0000 * 1C2E LEPCHA CONSONANT SIGN M * 0000 * 1C2F LEPCHA CONSONANT SIGN L * 0000 * 1C30 LEPCHA CONSONANT SIGN N * 0000 * 1C31 LEPCHA CONSONANT SIGN P * 0000 * 1C32 LEPCHA CONSONANT SIGN R * 0000 * 1C33 LEPCHA CONSONANT SIGN T * 0000 * 1C34 LEPCHA CONSONANT SIGN NYIN-DO * 0000 * 1C35 LEPCHA CONSONANT SIGN KANG * 0000 * 1C36 LEPCHA SIGN RAN * 0000 * 1C37 LEPCHA SIGN NUKTA * 0000 * 1D2C MODIFIER LETTER CAPITAL A * 0041 LATIN CAPITAL LETTER A * 1D2D MODIFIER LETTER CAPITAL AE * 00C6 LATIN CAPITAL LETTER AE * 1D2E MODIFIER LETTER CAPITAL B * 0042 LATIN CAPITAL LETTER B * 1D30 MODIFIER LETTER CAPITAL D * 0044 LATIN CAPITAL LETTER D * 1D31 MODIFIER LETTER CAPITAL E * 0045 LATIN CAPITAL LETTER E * 1D32 MODIFIER LETTER CAPITAL REVERSED E * 018E LATIN CAPITAL LETTER REVERSED E * 1D33 MODIFIER LETTER CAPITAL G * 0047 LATIN CAPITAL LETTER G * 1D34 MODIFIER LETTER CAPITAL H * 0048 LATIN CAPITAL LETTER H * 1D35 MODIFIER LETTER CAPITAL I * 0049 LATIN CAPITAL LETTER I * 1D36 MODIFIER LETTER CAPITAL J * 004A LATIN CAPITAL LETTER J * 1D37 MODIFIER LETTER CAPITAL K * 004B LATIN CAPITAL LETTER K * 1D38 MODIFIER LETTER CAPITAL L * 004C LATIN CAPITAL LETTER L * 1D39 MODIFIER LETTER CAPITAL M * 004D LATIN CAPITAL LETTER M * 1D3A MODIFIER LETTER CAPITAL N * 004E LATIN CAPITAL LETTER N * 1D3C MODIFIER LETTER CAPITAL O * 004F LATIN CAPITAL LETTER O * 1D3D MODIFIER LETTER CAPITAL OU * 0222 LATIN CAPITAL LETTER OU * 1D3E MODIFIER LETTER CAPITAL P * 0050 LATIN CAPITAL LETTER P * 1D3F MODIFIER LETTER CAPITAL R * 0052 LATIN CAPITAL LETTER R * 1D40 MODIFIER LETTER CAPITAL T * 0054 LATIN CAPITAL LETTER T * 1D41 MODIFIER LETTER CAPITAL U * 0055 LATIN CAPITAL LETTER U * 1D42 MODIFIER LETTER CAPITAL W * 0057 LATIN CAPITAL LETTER W * 1D43 MODIFIER LETTER SMALL A * 0061 LATIN SMALL LETTER A * 1D44 MODIFIER LETTER SMALL TURNED A * 0250 LATIN SMALL LETTER TURNED A * 1D45 MODIFIER LETTER SMALL ALPHA * 0251 LATIN SMALL LETTER ALPHA * 1D46 MODIFIER LETTER SMALL TURNED AE * 1D02 LATIN SMALL LETTER TURNED AE * 1D47 MODIFIER LETTER SMALL B * 0062 LATIN SMALL LETTER B * 1D48 MODIFIER LETTER SMALL D * 0064 LATIN SMALL LETTER D * 1D49 MODIFIER LETTER SMALL E * 0065 LATIN SMALL LETTER E * 1D4A MODIFIER LETTER SMALL SCHWA * 0259 LATIN SMALL LETTER SCHWA * 1D4B MODIFIER LETTER SMALL OPEN E * 025B LATIN SMALL LETTER OPEN E * 1D4C MODIFIER LETTER SMALL TURNED OPEN E * 025C LATIN SMALL LETTER REVERSED OPEN E * 1D4D MODIFIER LETTER SMALL G * 0067 LATIN SMALL LETTER G * 1D4F MODIFIER LETTER SMALL K * 006B LATIN SMALL LETTER K * 1D50 MODIFIER LETTER SMALL M * 006D LATIN SMALL LETTER M * 1D51 MODIFIER LETTER SMALL ENG * 014B LATIN SMALL LETTER ENG * 1D52 MODIFIER LETTER SMALL O * 006F LATIN SMALL LETTER O * 1D53 MODIFIER LETTER SMALL OPEN O * 0254 LATIN SMALL LETTER OPEN O * 1D54 MODIFIER LETTER SMALL TOP HALF O * 1D16 LATIN SMALL LETTER TOP HALF O * 1D55 MODIFIER LETTER SMALL BOTTOM HALF O * 1D17 LATIN SMALL LETTER BOTTOM HALF O * 1D56 MODIFIER LETTER SMALL P * 0070 LATIN SMALL LETTER P * 1D57 MODIFIER LETTER SMALL T * 0074 LATIN SMALL LETTER T * 1D58 MODIFIER LETTER SMALL U * 0075 LATIN SMALL LETTER U * 1D59 MODIFIER LETTER SMALL SIDEWAYS U * 1D1D LATIN SMALL LETTER SIDEWAYS U * 1D5A MODIFIER LETTER SMALL TURNED M * 026F LATIN SMALL LETTER TURNED M * 1D5B MODIFIER LETTER SMALL V * 0076 LATIN SMALL LETTER V * 1D5C MODIFIER LETTER SMALL AIN * 1D25 LATIN LETTER AIN * 1D5D MODIFIER LETTER SMALL BETA * 03B2 GREEK SMALL LETTER BETA * 1D5E MODIFIER LETTER SMALL GREEK GAMMA * 03B3 GREEK SMALL LETTER GAMMA * 1D5F MODIFIER LETTER SMALL DELTA * 03B4 GREEK SMALL LETTER DELTA * 1D60 MODIFIER LETTER SMALL GREEK PHI * 03C6 GREEK SMALL LETTER PHI * 1D61 MODIFIER LETTER SMALL CHI * 03C7 GREEK SMALL LETTER CHI * 1D62 LATIN SUBSCRIPT SMALL LETTER I * 0069 LATIN SMALL LETTER I * 1D63 LATIN SUBSCRIPT SMALL LETTER R * 0072 LATIN SMALL LETTER R * 1D64 LATIN SUBSCRIPT SMALL LETTER U * 0075 LATIN SMALL LETTER U * 1D65 LATIN SUBSCRIPT SMALL LETTER V * 0076 LATIN SMALL LETTER V * 1D66 GREEK SUBSCRIPT SMALL LETTER BETA * 03B2 GREEK SMALL LETTER BETA * 1D67 GREEK SUBSCRIPT SMALL LETTER GAMMA * 03B3 GREEK SMALL LETTER GAMMA * 1D68 GREEK SUBSCRIPT SMALL LETTER RHO * 03C1 GREEK SMALL LETTER RHO * 1D69 GREEK SUBSCRIPT SMALL LETTER PHI * 03C6 GREEK SMALL LETTER PHI * 1D6A GREEK SUBSCRIPT SMALL LETTER CHI * 03C7 GREEK SMALL LETTER CHI * 1D78 MODIFIER LETTER CYRILLIC EN * 043D CYRILLIC SMALL LETTER EN * 1D9B MODIFIER LETTER SMALL TURNED ALPHA * 0252 LATIN SMALL LETTER TURNED ALPHA * 1D9C MODIFIER LETTER SMALL C * 0063 LATIN SMALL LETTER C * 1D9D MODIFIER LETTER SMALL C WITH CURL * 0255 LATIN SMALL LETTER C WITH CURL * 1D9E MODIFIER LETTER SMALL ETH * 00F0 LATIN SMALL LETTER ETH * 1D9F MODIFIER LETTER SMALL REVERSED OPEN E * 025C LATIN SMALL LETTER REVERSED OPEN E * 1DA0 MODIFIER LETTER SMALL F * 0066 LATIN SMALL LETTER F * 1DA1 MODIFIER LETTER SMALL DOTLESS J WITH STROKE * 025F LATIN SMALL LETTER DOTLESS J WITH STROKE * 1DA2 MODIFIER LETTER SMALL SCRIPT G * 0261 LATIN SMALL LETTER SCRIPT G * 1DA3 MODIFIER LETTER SMALL TURNED H * 0265 LATIN SMALL LETTER TURNED H * 1DA4 MODIFIER LETTER SMALL I WITH STROKE * 0268 LATIN SMALL LETTER I WITH STROKE * 1DA5 MODIFIER LETTER SMALL IOTA * 0269 LATIN SMALL LETTER IOTA * 1DA6 MODIFIER LETTER SMALL CAPITAL I * 026A LATIN LETTER SMALL CAPITAL I * 1DA7 MODIFIER LETTER SMALL CAPITAL I WITH STROKE * 1D7B LATIN SMALL CAPITAL LETTER I WITH STROKE * 1DA8 MODIFIER LETTER SMALL J WITH CROSSED-TAIL * 029D LATIN SMALL LETTER J WITH CROSSED-TAIL * 1DA9 MODIFIER LETTER SMALL L WITH RETROFLEX HOOK * 026D LATIN SMALL LETTER L WITH RETROFLEX HOOK * 1DAA MODIFIER LETTER SMALL L WITH PALATAL HOOK * 1D85 LATIN SMALL LETTER L WITH PALATAL HOOK * 1DAB MODIFIER LETTER SMALL CAPITAL L * 029F LATIN LETTER SMALL CAPITAL L * 1DAC MODIFIER LETTER SMALL M WITH HOOK * 0271 LATIN SMALL LETTER M WITH HOOK * 1DAD MODIFIER LETTER SMALL TURNED M WITH LONG LEG * 0270 LATIN SMALL LETTER TURNED M WITH LONG LEG * 1DAE MODIFIER LETTER SMALL N WITH LEFT HOOK * 0272 LATIN SMALL LETTER N WITH LEFT HOOK * 1DAF MODIFIER LETTER SMALL N WITH RETROFLEX HOOK * 0273 LATIN SMALL LETTER N WITH RETROFLEX HOOK * 1DB0 MODIFIER LETTER SMALL CAPITAL N * 0274 LATIN LETTER SMALL CAPITAL N * 1DB1 MODIFIER LETTER SMALL BARRED O * 0275 LATIN SMALL LETTER BARRED O * 1DB2 MODIFIER LETTER SMALL PHI * 0278 LATIN SMALL LETTER PHI * 1DB3 MODIFIER LETTER SMALL S WITH HOOK * 0282 LATIN SMALL LETTER S WITH HOOK * 1DB4 MODIFIER LETTER SMALL ESH * 0283 LATIN SMALL LETTER ESH * 1DB5 MODIFIER LETTER SMALL T WITH PALATAL HOOK * 01AB LATIN SMALL LETTER T WITH PALATAL HOOK * 1DB6 MODIFIER LETTER SMALL U BAR * 0289 LATIN SMALL LETTER U BAR * 1DB7 MODIFIER LETTER SMALL UPSILON * 028A LATIN SMALL LETTER UPSILON * 1DB8 MODIFIER LETTER SMALL CAPITAL U * 1D1C LATIN LETTER SMALL CAPITAL U * 1DB9 MODIFIER LETTER SMALL V WITH HOOK * 028B LATIN SMALL LETTER V WITH HOOK * 1DBA MODIFIER LETTER SMALL TURNED V * 028C LATIN SMALL LETTER TURNED V * 1DBB MODIFIER LETTER SMALL Z * 007A LATIN SMALL LETTER Z * 1DBC MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK * 0290 LATIN SMALL LETTER Z WITH RETROFLEX HOOK * 1DBD MODIFIER LETTER SMALL Z WITH CURL * 0291 LATIN SMALL LETTER Z WITH CURL * 1DBE MODIFIER LETTER SMALL EZH * 0292 LATIN SMALL LETTER EZH * 1DBF MODIFIER LETTER SMALL THETA * 03B8 GREEK SMALL LETTER THETA * 1DC0 COMBINING DOTTED GRAVE ACCENT * 0000 * 1DC1 COMBINING DOTTED ACUTE ACCENT * 0000 * 1DC2 COMBINING SNAKE BELOW * 0000 * 1DC3 COMBINING SUSPENSION MARK * 0000 * 1DC4 COMBINING MACRON-ACUTE * 0000 * 1DC5 COMBINING GRAVE-MACRON * 0000 * 1DC6 COMBINING MACRON-GRAVE * 0000 * 1DC7 COMBINING ACUTE-MACRON * 0000 * 1DC8 COMBINING GRAVE-ACUTE-GRAVE * 0000 * 1DC9 COMBINING ACUTE-GRAVE-ACUTE * 0000 * 1DCA COMBINING LATIN SMALL LETTER R BELOW * 0000 * 1DCB COMBINING BREVE-MACRON * 0000 * 1DCC COMBINING MACRON-BREVE * 0000 * 1DCD COMBINING DOUBLE CIRCUMFLEX ABOVE * 0000 * 1DCE COMBINING OGONEK ABOVE * 0000 * 1DCF COMBINING ZIGZAG BELOW * 0000 * 1DD0 COMBINING IS BELOW * 0000 * 1DD1 COMBINING UR ABOVE * 0000 * 1DD2 COMBINING US ABOVE * 0000 * 1DD3 COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE * 0000 * 1DD4 COMBINING LATIN SMALL LETTER AE * 0000 * 1DD5 COMBINING LATIN SMALL LETTER AO * 0000 * 1DD6 COMBINING LATIN SMALL LETTER AV * 0000 * 1DD7 COMBINING LATIN SMALL LETTER C CEDILLA * 0000 * 1DD8 COMBINING LATIN SMALL LETTER INSULAR D * 0000 * 1DD9 COMBINING LATIN SMALL LETTER ETH * 0000 * 1DDA COMBINING LATIN SMALL LETTER G * 0000 * 1DDB COMBINING LATIN LETTER SMALL CAPITAL G * 0000 * 1DDC COMBINING LATIN SMALL LETTER K * 0000 * 1DDD COMBINING LATIN SMALL LETTER L * 0000 * 1DDE COMBINING LATIN LETTER SMALL CAPITAL L * 0000 * 1DDF COMBINING LATIN LETTER SMALL CAPITAL M * 0000 * 1DE0 COMBINING LATIN SMALL LETTER N * 0000 * 1DE1 COMBINING LATIN LETTER SMALL CAPITAL N * 0000 * 1DE2 COMBINING LATIN LETTER SMALL CAPITAL R * 0000 * 1DE3 COMBINING LATIN SMALL LETTER R ROTUNDA * 0000 * 1DE4 COMBINING LATIN SMALL LETTER S * 0000 * 1DE5 COMBINING LATIN SMALL LETTER LONG S * 0000 * 1DE6 COMBINING LATIN SMALL LETTER Z * 0000 * 1DFE COMBINING LEFT ARROWHEAD ABOVE * 0000 * 1DFF COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW * 0000 * 1E00 LATIN CAPITAL LETTER A WITH RING BELOW * 0041 LATIN CAPITAL LETTER A * 1E01 LATIN SMALL LETTER A WITH RING BELOW * 0061 LATIN SMALL LETTER A * 1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE * 0042 LATIN CAPITAL LETTER B * 1E03 LATIN SMALL LETTER B WITH DOT ABOVE * 0062 LATIN SMALL LETTER B * 1E04 LATIN CAPITAL LETTER B WITH DOT BELOW * 0042 LATIN CAPITAL LETTER B * 1E05 LATIN SMALL LETTER B WITH DOT BELOW * 0062 LATIN SMALL LETTER B * 1E06 LATIN CAPITAL LETTER B WITH LINE BELOW * 0042 LATIN CAPITAL LETTER B * 1E07 LATIN SMALL LETTER B WITH LINE BELOW * 0062 LATIN SMALL LETTER B * 1E08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE * 0043 LATIN CAPITAL LETTER C * 1E09 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE * 0063 LATIN SMALL LETTER C * 1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE * 0044 LATIN CAPITAL LETTER D * 1E0B LATIN SMALL LETTER D WITH DOT ABOVE * 0064 LATIN SMALL LETTER D * 1E0C LATIN CAPITAL LETTER D WITH DOT BELOW * 0044 LATIN CAPITAL LETTER D * 1E0D LATIN SMALL LETTER D WITH DOT BELOW * 0064 LATIN SMALL LETTER D * 1E0E LATIN CAPITAL LETTER D WITH LINE BELOW * 0044 LATIN CAPITAL LETTER D * 1E0F LATIN SMALL LETTER D WITH LINE BELOW * 0064 LATIN SMALL LETTER D * 1E10 LATIN CAPITAL LETTER D WITH CEDILLA * 0044 LATIN CAPITAL LETTER D * 1E11 LATIN SMALL LETTER D WITH CEDILLA * 0064 LATIN SMALL LETTER D * 1E12 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW * 0044 LATIN CAPITAL LETTER D * 1E13 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW * 0064 LATIN SMALL LETTER D * 1E14 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE * 0045 LATIN CAPITAL LETTER E * 1E15 LATIN SMALL LETTER E WITH MACRON AND GRAVE * 0065 LATIN SMALL LETTER E * 1E16 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE * 0045 LATIN CAPITAL LETTER E * 1E17 LATIN SMALL LETTER E WITH MACRON AND ACUTE * 0065 LATIN SMALL LETTER E * 1E18 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW * 0045 LATIN CAPITAL LETTER E * 1E19 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW * 0065 LATIN SMALL LETTER E * 1E1A LATIN CAPITAL LETTER E WITH TILDE BELOW * 0045 LATIN CAPITAL LETTER E * 1E1B LATIN SMALL LETTER E WITH TILDE BELOW * 0065 LATIN SMALL LETTER E * 1E1C LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE * 0045 LATIN CAPITAL LETTER E * 1E1D LATIN SMALL LETTER E WITH CEDILLA AND BREVE * 0065 LATIN SMALL LETTER E * 1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE * 0046 LATIN CAPITAL LETTER F * 1E1F LATIN SMALL LETTER F WITH DOT ABOVE * 0066 LATIN SMALL LETTER F * 1E20 LATIN CAPITAL LETTER G WITH MACRON * 0047 LATIN CAPITAL LETTER G * 1E21 LATIN SMALL LETTER G WITH MACRON * 0067 LATIN SMALL LETTER G * 1E22 LATIN CAPITAL LETTER H WITH DOT ABOVE * 0048 LATIN CAPITAL LETTER H * 1E23 LATIN SMALL LETTER H WITH DOT ABOVE * 0068 LATIN SMALL LETTER H * 1E24 LATIN CAPITAL LETTER H WITH DOT BELOW * 0048 LATIN CAPITAL LETTER H * 1E25 LATIN SMALL LETTER H WITH DOT BELOW * 0068 LATIN SMALL LETTER H * 1E26 LATIN CAPITAL LETTER H WITH DIAERESIS * 0048 LATIN CAPITAL LETTER H * 1E27 LATIN SMALL LETTER H WITH DIAERESIS * 0068 LATIN SMALL LETTER H * 1E28 LATIN CAPITAL LETTER H WITH CEDILLA * 0048 LATIN CAPITAL LETTER H * 1E29 LATIN SMALL LETTER H WITH CEDILLA * 0068 LATIN SMALL LETTER H * 1E2A LATIN CAPITAL LETTER H WITH BREVE BELOW * 0048 LATIN CAPITAL LETTER H * 1E2B LATIN SMALL LETTER H WITH BREVE BELOW * 0068 LATIN SMALL LETTER H * 1E2C LATIN CAPITAL LETTER I WITH TILDE BELOW * 0049 LATIN CAPITAL LETTER I * 1E2D LATIN SMALL LETTER I WITH TILDE BELOW * 0069 LATIN SMALL LETTER I * 1E2E LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE * 0049 LATIN CAPITAL LETTER I * 1E2F LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE * 0069 LATIN SMALL LETTER I * 1E30 LATIN CAPITAL LETTER K WITH ACUTE * 004B LATIN CAPITAL LETTER K * 1E31 LATIN SMALL LETTER K WITH ACUTE * 006B LATIN SMALL LETTER K * 1E32 LATIN CAPITAL LETTER K WITH DOT BELOW * 004B LATIN CAPITAL LETTER K * 1E33 LATIN SMALL LETTER K WITH DOT BELOW * 006B LATIN SMALL LETTER K * 1E34 LATIN CAPITAL LETTER K WITH LINE BELOW * 004B LATIN CAPITAL LETTER K * 1E35 LATIN SMALL LETTER K WITH LINE BELOW * 006B LATIN SMALL LETTER K * 1E36 LATIN CAPITAL LETTER L WITH DOT BELOW * 004C LATIN CAPITAL LETTER L * 1E37 LATIN SMALL LETTER L WITH DOT BELOW * 006C LATIN SMALL LETTER L * 1E38 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON * 004C LATIN CAPITAL LETTER L * 1E39 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON * 006C LATIN SMALL LETTER L * 1E3A LATIN CAPITAL LETTER L WITH LINE BELOW * 004C LATIN CAPITAL LETTER L * 1E3B LATIN SMALL LETTER L WITH LINE BELOW * 006C LATIN SMALL LETTER L * 1E3C LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW * 004C LATIN CAPITAL LETTER L * 1E3D LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW * 006C LATIN SMALL LETTER L * 1E3E LATIN CAPITAL LETTER M WITH ACUTE * 004D LATIN CAPITAL LETTER M * 1E3F LATIN SMALL LETTER M WITH ACUTE * 006D LATIN SMALL LETTER M * 1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE * 004D LATIN CAPITAL LETTER M * 1E41 LATIN SMALL LETTER M WITH DOT ABOVE * 006D LATIN SMALL LETTER M * 1E42 LATIN CAPITAL LETTER M WITH DOT BELOW * 004D LATIN CAPITAL LETTER M * 1E43 LATIN SMALL LETTER M WITH DOT BELOW * 006D LATIN SMALL LETTER M * 1E44 LATIN CAPITAL LETTER N WITH DOT ABOVE * 004E LATIN CAPITAL LETTER N * 1E45 LATIN SMALL LETTER N WITH DOT ABOVE * 006E LATIN SMALL LETTER N * 1E46 LATIN CAPITAL LETTER N WITH DOT BELOW * 004E LATIN CAPITAL LETTER N * 1E47 LATIN SMALL LETTER N WITH DOT BELOW * 006E LATIN SMALL LETTER N * 1E48 LATIN CAPITAL LETTER N WITH LINE BELOW * 004E LATIN CAPITAL LETTER N * 1E49 LATIN SMALL LETTER N WITH LINE BELOW * 006E LATIN SMALL LETTER N * 1E4A LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW * 004E LATIN CAPITAL LETTER N * 1E4B LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW * 006E LATIN SMALL LETTER N * 1E4C LATIN CAPITAL LETTER O WITH TILDE AND ACUTE * 004F LATIN CAPITAL LETTER O * 1E4D LATIN SMALL LETTER O WITH TILDE AND ACUTE * 006F LATIN SMALL LETTER O * 1E4E LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS * 004F LATIN CAPITAL LETTER O * 1E4F LATIN SMALL LETTER O WITH TILDE AND DIAERESIS * 006F LATIN SMALL LETTER O * 1E50 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE * 004F LATIN CAPITAL LETTER O * 1E51 LATIN SMALL LETTER O WITH MACRON AND GRAVE * 006F LATIN SMALL LETTER O * 1E52 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE * 004F LATIN CAPITAL LETTER O * 1E53 LATIN SMALL LETTER O WITH MACRON AND ACUTE * 006F LATIN SMALL LETTER O * 1E54 LATIN CAPITAL LETTER P WITH ACUTE * 0050 LATIN CAPITAL LETTER P * 1E55 LATIN SMALL LETTER P WITH ACUTE * 0070 LATIN SMALL LETTER P * 1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE * 0050 LATIN CAPITAL LETTER P * 1E57 LATIN SMALL LETTER P WITH DOT ABOVE * 0070 LATIN SMALL LETTER P * 1E58 LATIN CAPITAL LETTER R WITH DOT ABOVE * 0052 LATIN CAPITAL LETTER R * 1E59 LATIN SMALL LETTER R WITH DOT ABOVE * 0072 LATIN SMALL LETTER R * 1E5A LATIN CAPITAL LETTER R WITH DOT BELOW * 0052 LATIN CAPITAL LETTER R * 1E5B LATIN SMALL LETTER R WITH DOT BELOW * 0072 LATIN SMALL LETTER R * 1E5C LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON * 0052 LATIN CAPITAL LETTER R * 1E5D LATIN SMALL LETTER R WITH DOT BELOW AND MACRON * 0072 LATIN SMALL LETTER R * 1E5E LATIN CAPITAL LETTER R WITH LINE BELOW * 0052 LATIN CAPITAL LETTER R * 1E5F LATIN SMALL LETTER R WITH LINE BELOW * 0072 LATIN SMALL LETTER R * 1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE * 0053 LATIN CAPITAL LETTER S * 1E61 LATIN SMALL LETTER S WITH DOT ABOVE * 0073 LATIN SMALL LETTER S * 1E62 LATIN CAPITAL LETTER S WITH DOT BELOW * 0053 LATIN CAPITAL LETTER S * 1E63 LATIN SMALL LETTER S WITH DOT BELOW * 0073 LATIN SMALL LETTER S * 1E64 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE * 0053 LATIN CAPITAL LETTER S * 1E65 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE * 0073 LATIN SMALL LETTER S * 1E66 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE * 0053 LATIN CAPITAL LETTER S * 1E67 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE * 0073 LATIN SMALL LETTER S * 1E68 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE * 0053 LATIN CAPITAL LETTER S * 1E69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE * 0073 LATIN SMALL LETTER S * 1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE * 0054 LATIN CAPITAL LETTER T * 1E6B LATIN SMALL LETTER T WITH DOT ABOVE * 0074 LATIN SMALL LETTER T * 1E6C LATIN CAPITAL LETTER T WITH DOT BELOW * 0054 LATIN CAPITAL LETTER T * 1E6D LATIN SMALL LETTER T WITH DOT BELOW * 0074 LATIN SMALL LETTER T * 1E6E LATIN CAPITAL LETTER T WITH LINE BELOW * 0054 LATIN CAPITAL LETTER T * 1E6F LATIN SMALL LETTER T WITH LINE BELOW * 0074 LATIN SMALL LETTER T * 1E70 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW * 0054 LATIN CAPITAL LETTER T * 1E71 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW * 0074 LATIN SMALL LETTER T * 1E72 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW * 0055 LATIN CAPITAL LETTER U * 1E73 LATIN SMALL LETTER U WITH DIAERESIS BELOW * 0075 LATIN SMALL LETTER U * 1E74 LATIN CAPITAL LETTER U WITH TILDE BELOW * 0055 LATIN CAPITAL LETTER U * 1E75 LATIN SMALL LETTER U WITH TILDE BELOW * 0075 LATIN SMALL LETTER U * 1E76 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW * 0055 LATIN CAPITAL LETTER U * 1E77 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW * 0075 LATIN SMALL LETTER U * 1E78 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE * 0055 LATIN CAPITAL LETTER U * 1E79 LATIN SMALL LETTER U WITH TILDE AND ACUTE * 0075 LATIN SMALL LETTER U * 1E7A LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS * 0055 LATIN CAPITAL LETTER U * 1E7B LATIN SMALL LETTER U WITH MACRON AND DIAERESIS * 0075 LATIN SMALL LETTER U * 1E7C LATIN CAPITAL LETTER V WITH TILDE * 0056 LATIN CAPITAL LETTER V * 1E7D LATIN SMALL LETTER V WITH TILDE * 0076 LATIN SMALL LETTER V * 1E7E LATIN CAPITAL LETTER V WITH DOT BELOW * 0056 LATIN CAPITAL LETTER V * 1E7F LATIN SMALL LETTER V WITH DOT BELOW * 0076 LATIN SMALL LETTER V * 1E80 LATIN CAPITAL LETTER W WITH GRAVE * 0057 LATIN CAPITAL LETTER W * 1E81 LATIN SMALL LETTER W WITH GRAVE * 0077 LATIN SMALL LETTER W * 1E82 LATIN CAPITAL LETTER W WITH ACUTE * 0057 LATIN CAPITAL LETTER W * 1E83 LATIN SMALL LETTER W WITH ACUTE * 0077 LATIN SMALL LETTER W * 1E84 LATIN CAPITAL LETTER W WITH DIAERESIS * 0057 LATIN CAPITAL LETTER W * 1E85 LATIN SMALL LETTER W WITH DIAERESIS * 0077 LATIN SMALL LETTER W * 1E86 LATIN CAPITAL LETTER W WITH DOT ABOVE * 0057 LATIN CAPITAL LETTER W * 1E87 LATIN SMALL LETTER W WITH DOT ABOVE * 0077 LATIN SMALL LETTER W * 1E88 LATIN CAPITAL LETTER W WITH DOT BELOW * 0057 LATIN CAPITAL LETTER W * 1E89 LATIN SMALL LETTER W WITH DOT BELOW * 0077 LATIN SMALL LETTER W * 1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE * 0058 LATIN CAPITAL LETTER X * 1E8B LATIN SMALL LETTER X WITH DOT ABOVE * 0078 LATIN SMALL LETTER X * 1E8C LATIN CAPITAL LETTER X WITH DIAERESIS * 0058 LATIN CAPITAL LETTER X * 1E8D LATIN SMALL LETTER X WITH DIAERESIS * 0078 LATIN SMALL LETTER X * 1E8E LATIN CAPITAL LETTER Y WITH DOT ABOVE * 0059 LATIN CAPITAL LETTER Y * 1E8F LATIN SMALL LETTER Y WITH DOT ABOVE * 0079 LATIN SMALL LETTER Y * 1E90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX * 005A LATIN CAPITAL LETTER Z * 1E91 LATIN SMALL LETTER Z WITH CIRCUMFLEX * 007A LATIN SMALL LETTER Z * 1E92 LATIN CAPITAL LETTER Z WITH DOT BELOW * 005A LATIN CAPITAL LETTER Z * 1E93 LATIN SMALL LETTER Z WITH DOT BELOW * 007A LATIN SMALL LETTER Z * 1E94 LATIN CAPITAL LETTER Z WITH LINE BELOW * 005A LATIN CAPITAL LETTER Z * 1E95 LATIN SMALL LETTER Z WITH LINE BELOW * 007A LATIN SMALL LETTER Z * 1E96 LATIN SMALL LETTER H WITH LINE BELOW * 0068 LATIN SMALL LETTER H * 1E97 LATIN SMALL LETTER T WITH DIAERESIS * 0074 LATIN SMALL LETTER T * 1E98 LATIN SMALL LETTER W WITH RING ABOVE * 0077 LATIN SMALL LETTER W * 1E99 LATIN SMALL LETTER Y WITH RING ABOVE * 0079 LATIN SMALL LETTER Y * 1E9A LATIN SMALL LETTER A WITH RIGHT HALF RING * 0061 LATIN SMALL LETTER A * 02BE MODIFIER LETTER RIGHT HALF RING * 1E9B LATIN SMALL LETTER LONG S WITH DOT ABOVE * 0073 LATIN SMALL LETTER S * 1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW * 0041 LATIN CAPITAL LETTER A * 1EA1 LATIN SMALL LETTER A WITH DOT BELOW * 0061 LATIN SMALL LETTER A * 1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE * 0041 LATIN CAPITAL LETTER A * 1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE * 0061 LATIN SMALL LETTER A * 1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE * 0041 LATIN CAPITAL LETTER A * 1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE * 0061 LATIN SMALL LETTER A * 1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE * 0041 LATIN CAPITAL LETTER A * 1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE * 0061 LATIN SMALL LETTER A * 1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE * 0041 LATIN CAPITAL LETTER A * 1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE * 0061 LATIN SMALL LETTER A * 1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE * 0041 LATIN CAPITAL LETTER A * 1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE * 0061 LATIN SMALL LETTER A * 1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW * 0041 LATIN CAPITAL LETTER A * 1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW * 0061 LATIN SMALL LETTER A * 1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE * 0041 LATIN CAPITAL LETTER A * 1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE * 0061 LATIN SMALL LETTER A * 1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE * 0041 LATIN CAPITAL LETTER A * 1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE * 0061 LATIN SMALL LETTER A * 1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE * 0041 LATIN CAPITAL LETTER A * 1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE * 0061 LATIN SMALL LETTER A * 1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE * 0041 LATIN CAPITAL LETTER A * 1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE * 0061 LATIN SMALL LETTER A * 1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW * 0041 LATIN CAPITAL LETTER A * 1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW * 0061 LATIN SMALL LETTER A * 1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW * 0045 LATIN CAPITAL LETTER E * 1EB9 LATIN SMALL LETTER E WITH DOT BELOW * 0065 LATIN SMALL LETTER E * 1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE * 0045 LATIN CAPITAL LETTER E * 1EBB LATIN SMALL LETTER E WITH HOOK ABOVE * 0065 LATIN SMALL LETTER E * 1EBC LATIN CAPITAL LETTER E WITH TILDE * 0045 LATIN CAPITAL LETTER E * 1EBD LATIN SMALL LETTER E WITH TILDE * 0065 LATIN SMALL LETTER E * 1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE * 0045 LATIN CAPITAL LETTER E * 1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE * 0065 LATIN SMALL LETTER E * 1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE * 0045 LATIN CAPITAL LETTER E * 1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE * 0065 LATIN SMALL LETTER E * 1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE * 0045 LATIN CAPITAL LETTER E * 1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE * 0065 LATIN SMALL LETTER E * 1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE * 0045 LATIN CAPITAL LETTER E * 1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE * 0065 LATIN SMALL LETTER E * 1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW * 0045 LATIN CAPITAL LETTER E * 1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW * 0065 LATIN SMALL LETTER E * 1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE * 0049 LATIN CAPITAL LETTER I * 1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE * 0069 LATIN SMALL LETTER I * 1ECA LATIN CAPITAL LETTER I WITH DOT BELOW * 0049 LATIN CAPITAL LETTER I * 1ECB LATIN SMALL LETTER I WITH DOT BELOW * 0069 LATIN SMALL LETTER I * 1ECC LATIN CAPITAL LETTER O WITH DOT BELOW * 004F LATIN CAPITAL LETTER O * 1ECD LATIN SMALL LETTER O WITH DOT BELOW * 006F LATIN SMALL LETTER O * 1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE * 004F LATIN CAPITAL LETTER O * 1ECF LATIN SMALL LETTER O WITH HOOK ABOVE * 006F LATIN SMALL LETTER O * 1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE * 004F LATIN CAPITAL LETTER O * 1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE * 006F LATIN SMALL LETTER O * 1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE * 004F LATIN CAPITAL LETTER O * 1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE * 006F LATIN SMALL LETTER O * 1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE * 004F LATIN CAPITAL LETTER O * 1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE * 006F LATIN SMALL LETTER O * 1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE * 004F LATIN CAPITAL LETTER O * 1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE * 006F LATIN SMALL LETTER O * 1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW * 004F LATIN CAPITAL LETTER O * 1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW * 006F LATIN SMALL LETTER O * 1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE * 004F LATIN CAPITAL LETTER O * 1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE * 006F LATIN SMALL LETTER O * 1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE * 004F LATIN CAPITAL LETTER O * 1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE * 006F LATIN SMALL LETTER O * 1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE * 004F LATIN CAPITAL LETTER O * 1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE * 006F LATIN SMALL LETTER O * 1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE * 004F LATIN CAPITAL LETTER O * 1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE * 006F LATIN SMALL LETTER O * 1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW * 004F LATIN CAPITAL LETTER O * 1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW * 006F LATIN SMALL LETTER O * 1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW * 0055 LATIN CAPITAL LETTER U * 1EE5 LATIN SMALL LETTER U WITH DOT BELOW * 0075 LATIN SMALL LETTER U * 1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE * 0055 LATIN CAPITAL LETTER U * 1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE * 0075 LATIN SMALL LETTER U * 1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE * 0055 LATIN CAPITAL LETTER U * 1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE * 0075 LATIN SMALL LETTER U * 1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE * 0055 LATIN CAPITAL LETTER U * 1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE * 0075 LATIN SMALL LETTER U * 1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE * 0055 LATIN CAPITAL LETTER U * 1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE * 0075 LATIN SMALL LETTER U * 1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE * 0055 LATIN CAPITAL LETTER U * 1EEF LATIN SMALL LETTER U WITH HORN AND TILDE * 0075 LATIN SMALL LETTER U * 1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW * 0055 LATIN CAPITAL LETTER U * 1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW * 0075 LATIN SMALL LETTER U * 1EF2 LATIN CAPITAL LETTER Y WITH GRAVE * 0059 LATIN CAPITAL LETTER Y * 1EF3 LATIN SMALL LETTER Y WITH GRAVE * 0079 LATIN SMALL LETTER Y * 1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW * 0059 LATIN CAPITAL LETTER Y * 1EF5 LATIN SMALL LETTER Y WITH DOT BELOW * 0079 LATIN SMALL LETTER Y * 1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE * 0059 LATIN CAPITAL LETTER Y * 1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE * 0079 LATIN SMALL LETTER Y * 1EF8 LATIN CAPITAL LETTER Y WITH TILDE * 0059 LATIN CAPITAL LETTER Y * 1EF9 LATIN SMALL LETTER Y WITH TILDE * 0079 LATIN SMALL LETTER Y * 1F00 GREEK SMALL LETTER ALPHA WITH PSILI * 03B1 GREEK SMALL LETTER ALPHA * 1F01 GREEK SMALL LETTER ALPHA WITH DASIA * 03B1 GREEK SMALL LETTER ALPHA * 1F02 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA * 03B1 GREEK SMALL LETTER ALPHA * 1F03 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA * 03B1 GREEK SMALL LETTER ALPHA * 1F04 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA * 03B1 GREEK SMALL LETTER ALPHA * 1F05 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA * 03B1 GREEK SMALL LETTER ALPHA * 1F06 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI * 03B1 GREEK SMALL LETTER ALPHA * 1F07 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI * 03B1 GREEK SMALL LETTER ALPHA * 1F08 GREEK CAPITAL LETTER ALPHA WITH PSILI * 0391 GREEK CAPITAL LETTER ALPHA * 1F09 GREEK CAPITAL LETTER ALPHA WITH DASIA * 0391 GREEK CAPITAL LETTER ALPHA * 1F0A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA * 0391 GREEK CAPITAL LETTER ALPHA * 1F0B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA * 0391 GREEK CAPITAL LETTER ALPHA * 1F0C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA * 0391 GREEK CAPITAL LETTER ALPHA * 1F0D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA * 0391 GREEK CAPITAL LETTER ALPHA * 1F0E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI * 0391 GREEK CAPITAL LETTER ALPHA * 1F0F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI * 0391 GREEK CAPITAL LETTER ALPHA * 1F10 GREEK SMALL LETTER EPSILON WITH PSILI * 03B5 GREEK SMALL LETTER EPSILON * 1F11 GREEK SMALL LETTER EPSILON WITH DASIA * 03B5 GREEK SMALL LETTER EPSILON * 1F12 GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA * 03B5 GREEK SMALL LETTER EPSILON * 1F13 GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA * 03B5 GREEK SMALL LETTER EPSILON * 1F14 GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA * 03B5 GREEK SMALL LETTER EPSILON * 1F15 GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA * 03B5 GREEK SMALL LETTER EPSILON * 1F18 GREEK CAPITAL LETTER EPSILON WITH PSILI * 0395 GREEK CAPITAL LETTER EPSILON * 1F19 GREEK CAPITAL LETTER EPSILON WITH DASIA * 0395 GREEK CAPITAL LETTER EPSILON * 1F1A GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA * 0395 GREEK CAPITAL LETTER EPSILON * 1F1B GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA * 0395 GREEK CAPITAL LETTER EPSILON * 1F1C GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA * 0395 GREEK CAPITAL LETTER EPSILON * 1F1D GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA * 0395 GREEK CAPITAL LETTER EPSILON * 1F20 GREEK SMALL LETTER ETA WITH PSILI * 03B7 GREEK SMALL LETTER ETA * 1F21 GREEK SMALL LETTER ETA WITH DASIA * 03B7 GREEK SMALL LETTER ETA * 1F22 GREEK SMALL LETTER ETA WITH PSILI AND VARIA * 03B7 GREEK SMALL LETTER ETA * 1F23 GREEK SMALL LETTER ETA WITH DASIA AND VARIA * 03B7 GREEK SMALL LETTER ETA * 1F24 GREEK SMALL LETTER ETA WITH PSILI AND OXIA * 03B7 GREEK SMALL LETTER ETA * 1F25 GREEK SMALL LETTER ETA WITH DASIA AND OXIA * 03B7 GREEK SMALL LETTER ETA * 1F26 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI * 03B7 GREEK SMALL LETTER ETA * 1F27 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI * 03B7 GREEK SMALL LETTER ETA * 1F28 GREEK CAPITAL LETTER ETA WITH PSILI * 0397 GREEK CAPITAL LETTER ETA * 1F29 GREEK CAPITAL LETTER ETA WITH DASIA * 0397 GREEK CAPITAL LETTER ETA * 1F2A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA * 0397 GREEK CAPITAL LETTER ETA * 1F2B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA * 0397 GREEK CAPITAL LETTER ETA * 1F2C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA * 0397 GREEK CAPITAL LETTER ETA * 1F2D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA * 0397 GREEK CAPITAL LETTER ETA * 1F2E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI * 0397 GREEK CAPITAL LETTER ETA * 1F2F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI * 0397 GREEK CAPITAL LETTER ETA * 1F30 GREEK SMALL LETTER IOTA WITH PSILI * 03B9 GREEK SMALL LETTER IOTA * 1F31 GREEK SMALL LETTER IOTA WITH DASIA * 03B9 GREEK SMALL LETTER IOTA * 1F32 GREEK SMALL LETTER IOTA WITH PSILI AND VARIA * 03B9 GREEK SMALL LETTER IOTA * 1F33 GREEK SMALL LETTER IOTA WITH DASIA AND VARIA * 03B9 GREEK SMALL LETTER IOTA * 1F34 GREEK SMALL LETTER IOTA WITH PSILI AND OXIA * 03B9 GREEK SMALL LETTER IOTA * 1F35 GREEK SMALL LETTER IOTA WITH DASIA AND OXIA * 03B9 GREEK SMALL LETTER IOTA * 1F36 GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI * 03B9 GREEK SMALL LETTER IOTA * 1F37 GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI * 03B9 GREEK SMALL LETTER IOTA * 1F38 GREEK CAPITAL LETTER IOTA WITH PSILI * 0399 GREEK CAPITAL LETTER IOTA * 1F39 GREEK CAPITAL LETTER IOTA WITH DASIA * 0399 GREEK CAPITAL LETTER IOTA * 1F3A GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA * 0399 GREEK CAPITAL LETTER IOTA * 1F3B GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA * 0399 GREEK CAPITAL LETTER IOTA * 1F3C GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA * 0399 GREEK CAPITAL LETTER IOTA * 1F3D GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA * 0399 GREEK CAPITAL LETTER IOTA * 1F3E GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI * 0399 GREEK CAPITAL LETTER IOTA * 1F3F GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI * 0399 GREEK CAPITAL LETTER IOTA * 1F40 GREEK SMALL LETTER OMICRON WITH PSILI * 03BF GREEK SMALL LETTER OMICRON * 1F41 GREEK SMALL LETTER OMICRON WITH DASIA * 03BF GREEK SMALL LETTER OMICRON * 1F42 GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA * 03BF GREEK SMALL LETTER OMICRON * 1F43 GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA * 03BF GREEK SMALL LETTER OMICRON * 1F44 GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA * 03BF GREEK SMALL LETTER OMICRON * 1F45 GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA * 03BF GREEK SMALL LETTER OMICRON * 1F48 GREEK CAPITAL LETTER OMICRON WITH PSILI * 039F GREEK CAPITAL LETTER OMICRON * 1F49 GREEK CAPITAL LETTER OMICRON WITH DASIA * 039F GREEK CAPITAL LETTER OMICRON * 1F4A GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA * 039F GREEK CAPITAL LETTER OMICRON * 1F4B GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA * 039F GREEK CAPITAL LETTER OMICRON * 1F4C GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA * 039F GREEK CAPITAL LETTER OMICRON * 1F4D GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA * 039F GREEK CAPITAL LETTER OMICRON * 1F50 GREEK SMALL LETTER UPSILON WITH PSILI * 03C5 GREEK SMALL LETTER UPSILON * 1F51 GREEK SMALL LETTER UPSILON WITH DASIA * 03C5 GREEK SMALL LETTER UPSILON * 1F52 GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA * 03C5 GREEK SMALL LETTER UPSILON * 1F53 GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA * 03C5 GREEK SMALL LETTER UPSILON * 1F54 GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA * 03C5 GREEK SMALL LETTER UPSILON * 1F55 GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA * 03C5 GREEK SMALL LETTER UPSILON * 1F56 GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI * 03C5 GREEK SMALL LETTER UPSILON * 1F57 GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI * 03C5 GREEK SMALL LETTER UPSILON * 1F59 GREEK CAPITAL LETTER UPSILON WITH DASIA * 03A5 GREEK CAPITAL LETTER UPSILON * 1F5B GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA * 03A5 GREEK CAPITAL LETTER UPSILON * 1F5D GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA * 03A5 GREEK CAPITAL LETTER UPSILON * 1F5F GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI * 03A5 GREEK CAPITAL LETTER UPSILON * 1F60 GREEK SMALL LETTER OMEGA WITH PSILI * 03C9 GREEK SMALL LETTER OMEGA * 1F61 GREEK SMALL LETTER OMEGA WITH DASIA * 03C9 GREEK SMALL LETTER OMEGA * 1F62 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA * 03C9 GREEK SMALL LETTER OMEGA * 1F63 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA * 03C9 GREEK SMALL LETTER OMEGA * 1F64 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA * 03C9 GREEK SMALL LETTER OMEGA * 1F65 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA * 03C9 GREEK SMALL LETTER OMEGA * 1F66 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI * 03C9 GREEK SMALL LETTER OMEGA * 1F67 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI * 03C9 GREEK SMALL LETTER OMEGA * 1F68 GREEK CAPITAL LETTER OMEGA WITH PSILI * 03A9 GREEK CAPITAL LETTER OMEGA * 1F69 GREEK CAPITAL LETTER OMEGA WITH DASIA * 03A9 GREEK CAPITAL LETTER OMEGA * 1F6A GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA * 03A9 GREEK CAPITAL LETTER OMEGA * 1F6B GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA * 03A9 GREEK CAPITAL LETTER OMEGA * 1F6C GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA * 03A9 GREEK CAPITAL LETTER OMEGA * 1F6D GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA * 03A9 GREEK CAPITAL LETTER OMEGA * 1F6E GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI * 03A9 GREEK CAPITAL LETTER OMEGA * 1F6F GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI * 03A9 GREEK CAPITAL LETTER OMEGA * 1F70 GREEK SMALL LETTER ALPHA WITH VARIA * 03B1 GREEK SMALL LETTER ALPHA * 1F71 GREEK SMALL LETTER ALPHA WITH OXIA * 03B1 GREEK SMALL LETTER ALPHA * 1F72 GREEK SMALL LETTER EPSILON WITH VARIA * 03B5 GREEK SMALL LETTER EPSILON * 1F73 GREEK SMALL LETTER EPSILON WITH OXIA * 03B5 GREEK SMALL LETTER EPSILON * 1F74 GREEK SMALL LETTER ETA WITH VARIA * 03B7 GREEK SMALL LETTER ETA * 1F75 GREEK SMALL LETTER ETA WITH OXIA * 03B7 GREEK SMALL LETTER ETA * 1F76 GREEK SMALL LETTER IOTA WITH VARIA * 03B9 GREEK SMALL LETTER IOTA * 1F77 GREEK SMALL LETTER IOTA WITH OXIA * 03B9 GREEK SMALL LETTER IOTA * 1F78 GREEK SMALL LETTER OMICRON WITH VARIA * 03BF GREEK SMALL LETTER OMICRON * 1F79 GREEK SMALL LETTER OMICRON WITH OXIA * 03BF GREEK SMALL LETTER OMICRON * 1F7A GREEK SMALL LETTER UPSILON WITH VARIA * 03C5 GREEK SMALL LETTER UPSILON * 1F7B GREEK SMALL LETTER UPSILON WITH OXIA * 03C5 GREEK SMALL LETTER UPSILON * 1F7C GREEK SMALL LETTER OMEGA WITH VARIA * 03C9 GREEK SMALL LETTER OMEGA * 1F7D GREEK SMALL LETTER OMEGA WITH OXIA * 03C9 GREEK SMALL LETTER OMEGA * 1F80 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI * 03B1 GREEK SMALL LETTER ALPHA * 1F81 GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI * 03B1 GREEK SMALL LETTER ALPHA * 1F82 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI * 03B1 GREEK SMALL LETTER ALPHA * 1F83 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI * 03B1 GREEK SMALL LETTER ALPHA * 1F84 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI * 03B1 GREEK SMALL LETTER ALPHA * 1F85 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI * 03B1 GREEK SMALL LETTER ALPHA * 1F86 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI * 03B1 GREEK SMALL LETTER ALPHA * 1F87 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI * 03B1 GREEK SMALL LETTER ALPHA * 1F88 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI * 0391 GREEK CAPITAL LETTER ALPHA * 1F89 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI * 0391 GREEK CAPITAL LETTER ALPHA * 1F8A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI * 0391 GREEK CAPITAL LETTER ALPHA * 1F8B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI * 0391 GREEK CAPITAL LETTER ALPHA * 1F8C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI * 0391 GREEK CAPITAL LETTER ALPHA * 1F8D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI * 0391 GREEK CAPITAL LETTER ALPHA * 1F8E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI * 0391 GREEK CAPITAL LETTER ALPHA * 1F8F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI * 0391 GREEK CAPITAL LETTER ALPHA * 1F90 GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI * 03B7 GREEK SMALL LETTER ETA * 1F91 GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI * 03B7 GREEK SMALL LETTER ETA * 1F92 GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI * 03B7 GREEK SMALL LETTER ETA * 1F93 GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI * 03B7 GREEK SMALL LETTER ETA * 1F94 GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI * 03B7 GREEK SMALL LETTER ETA * 1F95 GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI * 03B7 GREEK SMALL LETTER ETA * 1F96 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI * 03B7 GREEK SMALL LETTER ETA * 1F97 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI * 03B7 GREEK SMALL LETTER ETA * 1F98 GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI * 0397 GREEK CAPITAL LETTER ETA * 1F99 GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI * 0397 GREEK CAPITAL LETTER ETA * 1F9A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI * 0397 GREEK CAPITAL LETTER ETA * 1F9B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI * 0397 GREEK CAPITAL LETTER ETA * 1F9C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI * 0397 GREEK CAPITAL LETTER ETA * 1F9D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI * 0397 GREEK CAPITAL LETTER ETA * 1F9E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI * 0397 GREEK CAPITAL LETTER ETA * 1F9F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI * 0397 GREEK CAPITAL LETTER ETA * 1FA0 GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FA1 GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FA2 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FA3 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FA4 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FA5 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FA6 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FA7 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FA8 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI * 03A9 GREEK CAPITAL LETTER OMEGA * 1FA9 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI * 03A9 GREEK CAPITAL LETTER OMEGA * 1FAA GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI * 03A9 GREEK CAPITAL LETTER OMEGA * 1FAB GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI * 03A9 GREEK CAPITAL LETTER OMEGA * 1FAC GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI * 03A9 GREEK CAPITAL LETTER OMEGA * 1FAD GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI * 03A9 GREEK CAPITAL LETTER OMEGA * 1FAE GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI * 03A9 GREEK CAPITAL LETTER OMEGA * 1FAF GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI * 03A9 GREEK CAPITAL LETTER OMEGA * 1FB0 GREEK SMALL LETTER ALPHA WITH VRACHY * 03B1 GREEK SMALL LETTER ALPHA * 1FB1 GREEK SMALL LETTER ALPHA WITH MACRON * 03B1 GREEK SMALL LETTER ALPHA * 1FB2 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI * 03B1 GREEK SMALL LETTER ALPHA * 1FB3 GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI * 03B1 GREEK SMALL LETTER ALPHA * 1FB4 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI * 03B1 GREEK SMALL LETTER ALPHA * 1FB6 GREEK SMALL LETTER ALPHA WITH PERISPOMENI * 03B1 GREEK SMALL LETTER ALPHA * 1FB7 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI * 03B1 GREEK SMALL LETTER ALPHA * 1FB8 GREEK CAPITAL LETTER ALPHA WITH VRACHY * 0391 GREEK CAPITAL LETTER ALPHA * 1FB9 GREEK CAPITAL LETTER ALPHA WITH MACRON * 0391 GREEK CAPITAL LETTER ALPHA * 1FBA GREEK CAPITAL LETTER ALPHA WITH VARIA * 0391 GREEK CAPITAL LETTER ALPHA * 1FBB GREEK CAPITAL LETTER ALPHA WITH OXIA * 0391 GREEK CAPITAL LETTER ALPHA * 1FBC GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI * 0391 GREEK CAPITAL LETTER ALPHA * 1FBD GREEK KORONIS * 0020 SPACE * 1FBE GREEK PROSGEGRAMMENI * 03B9 GREEK SMALL LETTER IOTA * 1FBF GREEK PSILI * 0020 SPACE * 1FC0 GREEK PERISPOMENI * 0020 SPACE * 1FC1 GREEK DIALYTIKA AND PERISPOMENI * 0020 SPACE * 1FC2 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI * 03B7 GREEK SMALL LETTER ETA * 1FC3 GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI * 03B7 GREEK SMALL LETTER ETA * 1FC4 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI * 03B7 GREEK SMALL LETTER ETA * 1FC6 GREEK SMALL LETTER ETA WITH PERISPOMENI * 03B7 GREEK SMALL LETTER ETA * 1FC7 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI * 03B7 GREEK SMALL LETTER ETA * 1FC8 GREEK CAPITAL LETTER EPSILON WITH VARIA * 0395 GREEK CAPITAL LETTER EPSILON * 1FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA * 0395 GREEK CAPITAL LETTER EPSILON * 1FCA GREEK CAPITAL LETTER ETA WITH VARIA * 0397 GREEK CAPITAL LETTER ETA * 1FCB GREEK CAPITAL LETTER ETA WITH OXIA * 0397 GREEK CAPITAL LETTER ETA * 1FCC GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI * 0397 GREEK CAPITAL LETTER ETA * 1FCD GREEK PSILI AND VARIA * 0020 SPACE * 1FCE GREEK PSILI AND OXIA * 0020 SPACE * 1FCF GREEK PSILI AND PERISPOMENI * 0020 SPACE * 1FD0 GREEK SMALL LETTER IOTA WITH VRACHY * 03B9 GREEK SMALL LETTER IOTA * 1FD1 GREEK SMALL LETTER IOTA WITH MACRON * 03B9 GREEK SMALL LETTER IOTA * 1FD2 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA * 03B9 GREEK SMALL LETTER IOTA * 1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA * 03B9 GREEK SMALL LETTER IOTA * 1FD6 GREEK SMALL LETTER IOTA WITH PERISPOMENI * 03B9 GREEK SMALL LETTER IOTA * 1FD7 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI * 03B9 GREEK SMALL LETTER IOTA * 1FD8 GREEK CAPITAL LETTER IOTA WITH VRACHY * 0399 GREEK CAPITAL LETTER IOTA * 1FD9 GREEK CAPITAL LETTER IOTA WITH MACRON * 0399 GREEK CAPITAL LETTER IOTA * 1FDA GREEK CAPITAL LETTER IOTA WITH VARIA * 0399 GREEK CAPITAL LETTER IOTA * 1FDB GREEK CAPITAL LETTER IOTA WITH OXIA * 0399 GREEK CAPITAL LETTER IOTA * 1FDD GREEK DASIA AND VARIA * 0020 SPACE * 1FDE GREEK DASIA AND OXIA * 0020 SPACE * 1FDF GREEK DASIA AND PERISPOMENI * 0020 SPACE * 1FE0 GREEK SMALL LETTER UPSILON WITH VRACHY * 03C5 GREEK SMALL LETTER UPSILON * 1FE1 GREEK SMALL LETTER UPSILON WITH MACRON * 03C5 GREEK SMALL LETTER UPSILON * 1FE2 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA * 03C5 GREEK SMALL LETTER UPSILON * 1FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA * 03C5 GREEK SMALL LETTER UPSILON * 1FE4 GREEK SMALL LETTER RHO WITH PSILI * 03C1 GREEK SMALL LETTER RHO * 1FE5 GREEK SMALL LETTER RHO WITH DASIA * 03C1 GREEK SMALL LETTER RHO * 1FE6 GREEK SMALL LETTER UPSILON WITH PERISPOMENI * 03C5 GREEK SMALL LETTER UPSILON * 1FE7 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI * 03C5 GREEK SMALL LETTER UPSILON * 1FE8 GREEK CAPITAL LETTER UPSILON WITH VRACHY * 03A5 GREEK CAPITAL LETTER UPSILON * 1FE9 GREEK CAPITAL LETTER UPSILON WITH MACRON * 03A5 GREEK CAPITAL LETTER UPSILON * 1FEA GREEK CAPITAL LETTER UPSILON WITH VARIA * 03A5 GREEK CAPITAL LETTER UPSILON * 1FEB GREEK CAPITAL LETTER UPSILON WITH OXIA * 03A5 GREEK CAPITAL LETTER UPSILON * 1FEC GREEK CAPITAL LETTER RHO WITH DASIA * 03A1 GREEK CAPITAL LETTER RHO * 1FED GREEK DIALYTIKA AND VARIA * 0020 SPACE * 1FEE GREEK DIALYTIKA AND OXIA * 0020 SPACE * 1FEF GREEK VARIA * 0060 GRAVE ACCENT * 1FF2 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FF3 GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FF4 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FF6 GREEK SMALL LETTER OMEGA WITH PERISPOMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FF7 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI * 03C9 GREEK SMALL LETTER OMEGA * 1FF8 GREEK CAPITAL LETTER OMICRON WITH VARIA * 039F GREEK CAPITAL LETTER OMICRON * 1FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA * 039F GREEK CAPITAL LETTER OMICRON * 1FFA GREEK CAPITAL LETTER OMEGA WITH VARIA * 03A9 GREEK CAPITAL LETTER OMEGA * 1FFB GREEK CAPITAL LETTER OMEGA WITH OXIA * 03A9 GREEK CAPITAL LETTER OMEGA * 1FFC GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI * 03A9 GREEK CAPITAL LETTER OMEGA * 1FFD GREEK OXIA * 0020 SPACE * 1FFE GREEK DASIA * 0020 SPACE * 2000 EN QUAD * 0020 SPACE * 2001 EM QUAD * 0020 SPACE * 2002 EN SPACE * 0020 SPACE * 2003 EM SPACE * 0020 SPACE * 2004 THREE-PER-EM SPACE * 0020 SPACE * 2005 FOUR-PER-EM SPACE * 0020 SPACE * 2006 SIX-PER-EM SPACE * 0020 SPACE * 2007 FIGURE SPACE * 0020 SPACE * 2008 PUNCTUATION SPACE * 0020 SPACE * 2009 THIN SPACE * 0020 SPACE * 200A HAIR SPACE * 0020 SPACE * 2011 NON-BREAKING HYPHEN * 2010 HYPHEN * 2017 DOUBLE LOW LINE * 0020 SPACE * 2024 ONE DOT LEADER * 002E FULL STOP * 2025 TWO DOT LEADER * 002E FULL STOP * 002E FULL STOP * 2026 HORIZONTAL ELLIPSIS * 002E FULL STOP * 002E FULL STOP * 002E FULL STOP * 202F NARROW NO-BREAK SPACE * 0020 SPACE * 2033 DOUBLE PRIME * 2032 PRIME * 2032 PRIME * 2034 TRIPLE PRIME * 2032 PRIME * 2032 PRIME * 2032 PRIME * 2036 REVERSED DOUBLE PRIME * 2035 REVERSED PRIME * 2035 REVERSED PRIME * 2037 REVERSED TRIPLE PRIME * 2035 REVERSED PRIME * 2035 REVERSED PRIME * 2035 REVERSED PRIME * 203C DOUBLE EXCLAMATION MARK * 0021 EXCLAMATION MARK * 0021 EXCLAMATION MARK * 203E OVERLINE * 0020 SPACE * 2047 DOUBLE QUESTION MARK * 003F QUESTION MARK * 003F QUESTION MARK * 2048 QUESTION EXCLAMATION MARK * 003F QUESTION MARK * 0021 EXCLAMATION MARK * 2049 EXCLAMATION QUESTION MARK * 0021 EXCLAMATION MARK * 003F QUESTION MARK * 2057 QUADRUPLE PRIME * 2032 PRIME * 2032 PRIME * 2032 PRIME * 2032 PRIME * 205F MEDIUM MATHEMATICAL SPACE * 0020 SPACE * 2070 SUPERSCRIPT ZERO * 0030 DIGIT ZERO * 2071 SUPERSCRIPT LATIN SMALL LETTER I * 0069 LATIN SMALL LETTER I * 2074 SUPERSCRIPT FOUR * 0034 DIGIT FOUR * 2075 SUPERSCRIPT FIVE * 0035 DIGIT FIVE * 2076 SUPERSCRIPT SIX * 0036 DIGIT SIX * 2077 SUPERSCRIPT SEVEN * 0037 DIGIT SEVEN * 2078 SUPERSCRIPT EIGHT * 0038 DIGIT EIGHT * 2079 SUPERSCRIPT NINE * 0039 DIGIT NINE * 207A SUPERSCRIPT PLUS SIGN * 002B PLUS SIGN * 207B SUPERSCRIPT MINUS * 2212 MINUS SIGN * 207C SUPERSCRIPT EQUALS SIGN * 003D EQUALS SIGN * 207D SUPERSCRIPT LEFT PARENTHESIS * 0028 LEFT PARENTHESIS * 207E SUPERSCRIPT RIGHT PARENTHESIS * 0029 RIGHT PARENTHESIS * 207F SUPERSCRIPT LATIN SMALL LETTER N * 006E LATIN SMALL LETTER N * 2080 SUBSCRIPT ZERO * 0030 DIGIT ZERO * 2081 SUBSCRIPT ONE * 0031 DIGIT ONE * 2082 SUBSCRIPT TWO * 0032 DIGIT TWO * 2083 SUBSCRIPT THREE * 0033 DIGIT THREE * 2084 SUBSCRIPT FOUR * 0034 DIGIT FOUR * 2085 SUBSCRIPT FIVE * 0035 DIGIT FIVE * 2086 SUBSCRIPT SIX * 0036 DIGIT SIX * 2087 SUBSCRIPT SEVEN * 0037 DIGIT SEVEN * 2088 SUBSCRIPT EIGHT * 0038 DIGIT EIGHT * 2089 SUBSCRIPT NINE * 0039 DIGIT NINE * 208A SUBSCRIPT PLUS SIGN * 002B PLUS SIGN * 208B SUBSCRIPT MINUS * 2212 MINUS SIGN * 208C SUBSCRIPT EQUALS SIGN * 003D EQUALS SIGN * 208D SUBSCRIPT LEFT PARENTHESIS * 0028 LEFT PARENTHESIS * 208E SUBSCRIPT RIGHT PARENTHESIS * 0029 RIGHT PARENTHESIS * 2090 LATIN SUBSCRIPT SMALL LETTER A * 0061 LATIN SMALL LETTER A * 2091 LATIN SUBSCRIPT SMALL LETTER E * 0065 LATIN SMALL LETTER E * 2092 LATIN SUBSCRIPT SMALL LETTER O * 006F LATIN SMALL LETTER O * 2093 LATIN SUBSCRIPT SMALL LETTER X * 0078 LATIN SMALL LETTER X * 2094 LATIN SUBSCRIPT SMALL LETTER SCHWA * 0259 LATIN SMALL LETTER SCHWA * 20A8 RUPEE SIGN * 0052 LATIN CAPITAL LETTER R * 0073 LATIN SMALL LETTER S * 20D0 COMBINING LEFT HARPOON ABOVE * 0000 * 20D1 COMBINING RIGHT HARPOON ABOVE * 0000 * 20D2 COMBINING LONG VERTICAL LINE OVERLAY * 0000 * 20D3 COMBINING SHORT VERTICAL LINE OVERLAY * 0000 * 20D4 COMBINING ANTICLOCKWISE ARROW ABOVE * 0000 * 20D5 COMBINING CLOCKWISE ARROW ABOVE * 0000 * 20D6 COMBINING LEFT ARROW ABOVE * 0000 * 20D7 COMBINING RIGHT ARROW ABOVE * 0000 * 20D8 COMBINING RING OVERLAY * 0000 * 20D9 COMBINING CLOCKWISE RING OVERLAY * 0000 * 20DA COMBINING ANTICLOCKWISE RING OVERLAY * 0000 * 20DB COMBINING THREE DOTS ABOVE * 0000 * 20DC COMBINING FOUR DOTS ABOVE * 0000 * 20DD COMBINING ENCLOSING CIRCLE * 0000 * 20DE COMBINING ENCLOSING SQUARE * 0000 * 20DF COMBINING ENCLOSING DIAMOND * 0000 * 20E0 COMBINING ENCLOSING CIRCLE BACKSLASH * 0000 * 20E1 COMBINING LEFT RIGHT ARROW ABOVE * 0000 * 20E2 COMBINING ENCLOSING SCREEN * 0000 * 20E3 COMBINING ENCLOSING KEYCAP * 0000 * 20E4 COMBINING ENCLOSING UPWARD POINTING TRIANGLE * 0000 * 20E5 COMBINING REVERSE SOLIDUS OVERLAY * 0000 * 20E6 COMBINING DOUBLE VERTICAL STROKE OVERLAY * 0000 * 20E7 COMBINING ANNUITY SYMBOL * 0000 * 20E8 COMBINING TRIPLE UNDERDOT * 0000 * 20E9 COMBINING WIDE BRIDGE ABOVE * 0000 * 20EA COMBINING LEFTWARDS ARROW OVERLAY * 0000 * 20EB COMBINING LONG DOUBLE SOLIDUS OVERLAY * 0000 * 20EC COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS * 0000 * 20ED COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS * 0000 * 20EE COMBINING LEFT ARROW BELOW * 0000 * 20EF COMBINING RIGHT ARROW BELOW * 0000 * 20F0 COMBINING ASTERISK ABOVE * 0000 * 2100 ACCOUNT OF * 0061 LATIN SMALL LETTER A * 002F SOLIDUS * 0063 LATIN SMALL LETTER C * 2101 ADDRESSED TO THE SUBJECT * 0061 LATIN SMALL LETTER A * 002F SOLIDUS * 0073 LATIN SMALL LETTER S * 2102 DOUBLE-STRUCK CAPITAL C * 0043 LATIN CAPITAL LETTER C * 2103 DEGREE CELSIUS * 00B0 DEGREE SIGN * 0043 LATIN CAPITAL LETTER C * 2105 CARE OF * 0063 LATIN SMALL LETTER C * 002F SOLIDUS * 006F LATIN SMALL LETTER O * 2106 CADA UNA * 0063 LATIN SMALL LETTER C * 002F SOLIDUS * 0075 LATIN SMALL LETTER U * 2107 EULER CONSTANT * 0190 LATIN CAPITAL LETTER OPEN E * 2109 DEGREE FAHRENHEIT * 00B0 DEGREE SIGN * 0046 LATIN CAPITAL LETTER F * 210A SCRIPT SMALL G * 0067 LATIN SMALL LETTER G * 210B SCRIPT CAPITAL H * 0048 LATIN CAPITAL LETTER H * 210C BLACK-LETTER CAPITAL H * 0048 LATIN CAPITAL LETTER H * 210D DOUBLE-STRUCK CAPITAL H * 0048 LATIN CAPITAL LETTER H * 210E PLANCK CONSTANT * 0068 LATIN SMALL LETTER H * 210F PLANCK CONSTANT OVER TWO PI * 0127 LATIN SMALL LETTER H WITH STROKE * 2110 SCRIPT CAPITAL I * 0049 LATIN CAPITAL LETTER I * 2111 BLACK-LETTER CAPITAL I * 0049 LATIN CAPITAL LETTER I * 2112 SCRIPT CAPITAL L * 004C LATIN CAPITAL LETTER L * 2113 SCRIPT SMALL L * 006C LATIN SMALL LETTER L * 2115 DOUBLE-STRUCK CAPITAL N * 004E LATIN CAPITAL LETTER N * 2116 NUMERO SIGN * 004E LATIN CAPITAL LETTER N * 006F LATIN SMALL LETTER O * 2119 DOUBLE-STRUCK CAPITAL P * 0050 LATIN CAPITAL LETTER P * 211A DOUBLE-STRUCK CAPITAL Q * 0051 LATIN CAPITAL LETTER Q * 211B SCRIPT CAPITAL R * 0052 LATIN CAPITAL LETTER R * 211C BLACK-LETTER CAPITAL R * 0052 LATIN CAPITAL LETTER R * 211D DOUBLE-STRUCK CAPITAL R * 0052 LATIN CAPITAL LETTER R * 2120 SERVICE MARK * 0053 LATIN CAPITAL LETTER S * 004D LATIN CAPITAL LETTER M * 2121 TELEPHONE SIGN * 0054 LATIN CAPITAL LETTER T * 0045 LATIN CAPITAL LETTER E * 004C LATIN CAPITAL LETTER L * 2122 TRADE MARK SIGN * 0054 LATIN CAPITAL LETTER T * 004D LATIN CAPITAL LETTER M * 2124 DOUBLE-STRUCK CAPITAL Z * 005A LATIN CAPITAL LETTER Z * 2126 OHM SIGN * 03A9 GREEK CAPITAL LETTER OMEGA * 2128 BLACK-LETTER CAPITAL Z * 005A LATIN CAPITAL LETTER Z * 212A KELVIN SIGN * 004B LATIN CAPITAL LETTER K * 212B ANGSTROM SIGN * 0041 LATIN CAPITAL LETTER A * 212C SCRIPT CAPITAL B * 0042 LATIN CAPITAL LETTER B * 212D BLACK-LETTER CAPITAL C * 0043 LATIN CAPITAL LETTER C * 212F SCRIPT SMALL E * 0065 LATIN SMALL LETTER E * 2130 SCRIPT CAPITAL E * 0045 LATIN CAPITAL LETTER E * 2131 SCRIPT CAPITAL F * 0046 LATIN CAPITAL LETTER F * 2133 SCRIPT CAPITAL M * 004D LATIN CAPITAL LETTER M * 2134 SCRIPT SMALL O * 006F LATIN SMALL LETTER O * 2135 ALEF SYMBOL * 05D0 HEBREW LETTER ALEF * 2136 BET SYMBOL * 05D1 HEBREW LETTER BET * 2137 GIMEL SYMBOL * 05D2 HEBREW LETTER GIMEL * 2138 DALET SYMBOL * 05D3 HEBREW LETTER DALET * 2139 INFORMATION SOURCE * 0069 LATIN SMALL LETTER I * 213B FACSIMILE SIGN * 0046 LATIN CAPITAL LETTER F * 0041 LATIN CAPITAL LETTER A * 0058 LATIN CAPITAL LETTER X * 213C DOUBLE-STRUCK SMALL PI * 03C0 GREEK SMALL LETTER PI * 213D DOUBLE-STRUCK SMALL GAMMA * 03B3 GREEK SMALL LETTER GAMMA * 213E DOUBLE-STRUCK CAPITAL GAMMA * 0393 GREEK CAPITAL LETTER GAMMA * 213F DOUBLE-STRUCK CAPITAL PI * 03A0 GREEK CAPITAL LETTER PI * 2140 DOUBLE-STRUCK N-ARY SUMMATION * 2211 N-ARY SUMMATION * 2145 DOUBLE-STRUCK ITALIC CAPITAL D * 0044 LATIN CAPITAL LETTER D * 2146 DOUBLE-STRUCK ITALIC SMALL D * 0064 LATIN SMALL LETTER D * 2147 DOUBLE-STRUCK ITALIC SMALL E * 0065 LATIN SMALL LETTER E * 2148 DOUBLE-STRUCK ITALIC SMALL I * 0069 LATIN SMALL LETTER I * 2149 DOUBLE-STRUCK ITALIC SMALL J * 006A LATIN SMALL LETTER J * 2153 VULGAR FRACTION ONE THIRD * 0031 DIGIT ONE * 2044 FRACTION SLASH * 0033 DIGIT THREE * 2154 VULGAR FRACTION TWO THIRDS * 0032 DIGIT TWO * 2044 FRACTION SLASH * 0033 DIGIT THREE * 2155 VULGAR FRACTION ONE FIFTH * 0031 DIGIT ONE * 2044 FRACTION SLASH * 0035 DIGIT FIVE * 2156 VULGAR FRACTION TWO FIFTHS * 0032 DIGIT TWO * 2044 FRACTION SLASH * 0035 DIGIT FIVE * 2157 VULGAR FRACTION THREE FIFTHS * 0033 DIGIT THREE * 2044 FRACTION SLASH * 0035 DIGIT FIVE * 2158 VULGAR FRACTION FOUR FIFTHS * 0034 DIGIT FOUR * 2044 FRACTION SLASH * 0035 DIGIT FIVE * 2159 VULGAR FRACTION ONE SIXTH * 0031 DIGIT ONE * 2044 FRACTION SLASH * 0036 DIGIT SIX * 215A VULGAR FRACTION FIVE SIXTHS * 0035 DIGIT FIVE * 2044 FRACTION SLASH * 0036 DIGIT SIX * 215B VULGAR FRACTION ONE EIGHTH * 0031 DIGIT ONE * 2044 FRACTION SLASH * 0038 DIGIT EIGHT * 215C VULGAR FRACTION THREE EIGHTHS * 0033 DIGIT THREE * 2044 FRACTION SLASH * 0038 DIGIT EIGHT * 215D VULGAR FRACTION FIVE EIGHTHS * 0035 DIGIT FIVE * 2044 FRACTION SLASH * 0038 DIGIT EIGHT * 215E VULGAR FRACTION SEVEN EIGHTHS * 0037 DIGIT SEVEN * 2044 FRACTION SLASH * 0038 DIGIT EIGHT * 215F FRACTION NUMERATOR ONE * 0031 DIGIT ONE * 2044 FRACTION SLASH * 2160 ROMAN NUMERAL ONE * 0049 LATIN CAPITAL LETTER I * 2161 ROMAN NUMERAL TWO * 0049 LATIN CAPITAL LETTER I * 0049 LATIN CAPITAL LETTER I * 2162 ROMAN NUMERAL THREE * 0049 LATIN CAPITAL LETTER I * 0049 LATIN CAPITAL LETTER I * 0049 LATIN CAPITAL LETTER I * 2163 ROMAN NUMERAL FOUR * 0049 LATIN CAPITAL LETTER I * 0056 LATIN CAPITAL LETTER V * 2164 ROMAN NUMERAL FIVE * 0056 LATIN CAPITAL LETTER V * 2165 ROMAN NUMERAL SIX * 0056 LATIN CAPITAL LETTER V * 0049 LATIN CAPITAL LETTER I * 2166 ROMAN NUMERAL SEVEN * 0056 LATIN CAPITAL LETTER V * 0049 LATIN CAPITAL LETTER I * 0049 LATIN CAPITAL LETTER I * 2167 ROMAN NUMERAL EIGHT * 0056 LATIN CAPITAL LETTER V * 0049 LATIN CAPITAL LETTER I * 0049 LATIN CAPITAL LETTER I * 0049 LATIN CAPITAL LETTER I * 2168 ROMAN NUMERAL NINE * 0049 LATIN CAPITAL LETTER I * 0058 LATIN CAPITAL LETTER X * 2169 ROMAN NUMERAL TEN * 0058 LATIN CAPITAL LETTER X * 216A ROMAN NUMERAL ELEVEN * 0058 LATIN CAPITAL LETTER X * 0049 LATIN CAPITAL LETTER I * 216B ROMAN NUMERAL TWELVE * 0058 LATIN CAPITAL LETTER X * 0049 LATIN CAPITAL LETTER I * 0049 LATIN CAPITAL LETTER I * 216C ROMAN NUMERAL FIFTY * 004C LATIN CAPITAL LETTER L * 216D ROMAN NUMERAL ONE HUNDRED * 0043 LATIN CAPITAL LETTER C * 216E ROMAN NUMERAL FIVE HUNDRED * 0044 LATIN CAPITAL LETTER D * 216F ROMAN NUMERAL ONE THOUSAND * 004D LATIN CAPITAL LETTER M * 2170 SMALL ROMAN NUMERAL ONE * 0069 LATIN SMALL LETTER I * 2171 SMALL ROMAN NUMERAL TWO * 0069 LATIN SMALL LETTER I * 0069 LATIN SMALL LETTER I * 2172 SMALL ROMAN NUMERAL THREE * 0069 LATIN SMALL LETTER I * 0069 LATIN SMALL LETTER I * 0069 LATIN SMALL LETTER I * 2173 SMALL ROMAN NUMERAL FOUR * 0069 LATIN SMALL LETTER I * 0076 LATIN SMALL LETTER V * 2174 SMALL ROMAN NUMERAL FIVE * 0076 LATIN SMALL LETTER V * 2175 SMALL ROMAN NUMERAL SIX * 0076 LATIN SMALL LETTER V * 0069 LATIN SMALL LETTER I * 2176 SMALL ROMAN NUMERAL SEVEN * 0076 LATIN SMALL LETTER V * 0069 LATIN SMALL LETTER I * 0069 LATIN SMALL LETTER I * 2177 SMALL ROMAN NUMERAL EIGHT * 0076 LATIN SMALL LETTER V * 0069 LATIN SMALL LETTER I * 0069 LATIN SMALL LETTER I * 0069 LATIN SMALL LETTER I * 2178 SMALL ROMAN NUMERAL NINE * 0069 LATIN SMALL LETTER I * 0078 LATIN SMALL LETTER X * 2179 SMALL ROMAN NUMERAL TEN * 0078 LATIN SMALL LETTER X * 217A SMALL ROMAN NUMERAL ELEVEN * 0078 LATIN SMALL LETTER X * 0069 LATIN SMALL LETTER I * 217B SMALL ROMAN NUMERAL TWELVE * 0078 LATIN SMALL LETTER X * 0069 LATIN SMALL LETTER I * 0069 LATIN SMALL LETTER I * 217C SMALL ROMAN NUMERAL FIFTY * 006C LATIN SMALL LETTER L * 217D SMALL ROMAN NUMERAL ONE HUNDRED * 0063 LATIN SMALL LETTER C * 217E SMALL ROMAN NUMERAL FIVE HUNDRED * 0064 LATIN SMALL LETTER D * 217F SMALL ROMAN NUMERAL ONE THOUSAND * 006D LATIN SMALL LETTER M * 219A LEFTWARDS ARROW WITH STROKE * 2190 LEFTWARDS ARROW * 219B RIGHTWARDS ARROW WITH STROKE * 2192 RIGHTWARDS ARROW * 21AE LEFT RIGHT ARROW WITH STROKE * 2194 LEFT RIGHT ARROW * 21CD LEFTWARDS DOUBLE ARROW WITH STROKE * 21D0 LEFTWARDS DOUBLE ARROW * 21CE LEFT RIGHT DOUBLE ARROW WITH STROKE * 21D4 LEFT RIGHT DOUBLE ARROW * 21CF RIGHTWARDS DOUBLE ARROW WITH STROKE * 21D2 RIGHTWARDS DOUBLE ARROW * 2204 THERE DOES NOT EXIST * 2203 THERE EXISTS * 2209 NOT AN ELEMENT OF * 2208 ELEMENT OF * 220C DOES NOT CONTAIN AS MEMBER * 220B CONTAINS AS MEMBER * 2224 DOES NOT DIVIDE * 2223 DIVIDES * 2226 NOT PARALLEL TO * 2225 PARALLEL TO * 222C DOUBLE INTEGRAL * 222B INTEGRAL * 222B INTEGRAL * 222D TRIPLE INTEGRAL * 222B INTEGRAL * 222B INTEGRAL * 222B INTEGRAL * 222F SURFACE INTEGRAL * 222E CONTOUR INTEGRAL * 222E CONTOUR INTEGRAL * 2230 VOLUME INTEGRAL * 222E CONTOUR INTEGRAL * 222E CONTOUR INTEGRAL * 222E CONTOUR INTEGRAL * 2241 NOT TILDE * 223C TILDE OPERATOR * 2244 NOT ASYMPTOTICALLY EQUAL TO * 2243 ASYMPTOTICALLY EQUAL TO * 2247 NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO * 2245 APPROXIMATELY EQUAL TO * 2249 NOT ALMOST EQUAL TO * 2248 ALMOST EQUAL TO * 2260 NOT EQUAL TO * 003D EQUALS SIGN * 2262 NOT IDENTICAL TO * 2261 IDENTICAL TO * 226D NOT EQUIVALENT TO * 224D EQUIVALENT TO * 226E NOT LESS-THAN * 003C LESS-THAN SIGN * 226F NOT GREATER-THAN * 003E GREATER-THAN SIGN * 2270 NEITHER LESS-THAN NOR EQUAL TO * 2264 LESS-THAN OR EQUAL TO * 2271 NEITHER GREATER-THAN NOR EQUAL TO * 2265 GREATER-THAN OR EQUAL TO * 2274 NEITHER LESS-THAN NOR EQUIVALENT TO * 2272 LESS-THAN OR EQUIVALENT TO * 2275 NEITHER GREATER-THAN NOR EQUIVALENT TO * 2273 GREATER-THAN OR EQUIVALENT TO * 2278 NEITHER LESS-THAN NOR GREATER-THAN * 2276 LESS-THAN OR GREATER-THAN * 2279 NEITHER GREATER-THAN NOR LESS-THAN * 2277 GREATER-THAN OR LESS-THAN * 2280 DOES NOT PRECEDE * 227A PRECEDES * 2281 DOES NOT SUCCEED * 227B SUCCEEDS * 2284 NOT A SUBSET OF * 2282 SUBSET OF * 2285 NOT A SUPERSET OF * 2283 SUPERSET OF * 2288 NEITHER A SUBSET OF NOR EQUAL TO * 2286 SUBSET OF OR EQUAL TO * 2289 NEITHER A SUPERSET OF NOR EQUAL TO * 2287 SUPERSET OF OR EQUAL TO * 22AC DOES NOT PROVE * 22A2 RIGHT TACK * 22AD NOT TRUE * 22A8 TRUE * 22AE DOES NOT FORCE * 22A9 FORCES * 22AF NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE * 22AB DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE * 22E0 DOES NOT PRECEDE OR EQUAL * 227C PRECEDES OR EQUAL TO * 22E1 DOES NOT SUCCEED OR EQUAL * 227D SUCCEEDS OR EQUAL TO * 22E2 NOT SQUARE IMAGE OF OR EQUAL TO * 2291 SQUARE IMAGE OF OR EQUAL TO * 22E3 NOT SQUARE ORIGINAL OF OR EQUAL TO * 2292 SQUARE ORIGINAL OF OR EQUAL TO * 22EA NOT NORMAL SUBGROUP OF * 22B2 NORMAL SUBGROUP OF * 22EB DOES NOT CONTAIN AS NORMAL SUBGROUP * 22B3 CONTAINS AS NORMAL SUBGROUP * 22EC NOT NORMAL SUBGROUP OF OR EQUAL TO * 22B4 NORMAL SUBGROUP OF OR EQUAL TO * 22ED DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL * 22B5 CONTAINS AS NORMAL SUBGROUP OR EQUAL TO * 2329 LEFT-POINTING ANGLE BRACKET * 3008 LEFT ANGLE BRACKET * 232A RIGHT-POINTING ANGLE BRACKET * 3009 RIGHT ANGLE BRACKET * 2460 CIRCLED DIGIT ONE * 0031 DIGIT ONE * 2461 CIRCLED DIGIT TWO * 0032 DIGIT TWO * 2462 CIRCLED DIGIT THREE * 0033 DIGIT THREE * 2463 CIRCLED DIGIT FOUR * 0034 DIGIT FOUR * 2464 CIRCLED DIGIT FIVE * 0035 DIGIT FIVE * 2465 CIRCLED DIGIT SIX * 0036 DIGIT SIX * 2466 CIRCLED DIGIT SEVEN * 0037 DIGIT SEVEN * 2467 CIRCLED DIGIT EIGHT * 0038 DIGIT EIGHT * 2468 CIRCLED DIGIT NINE * 0039 DIGIT NINE * 2469 CIRCLED NUMBER TEN * 0031 DIGIT ONE * 0030 DIGIT ZERO * 246A CIRCLED NUMBER ELEVEN * 0031 DIGIT ONE * 0031 DIGIT ONE * 246B CIRCLED NUMBER TWELVE * 0031 DIGIT ONE * 0032 DIGIT TWO * 246C CIRCLED NUMBER THIRTEEN * 0031 DIGIT ONE * 0033 DIGIT THREE * 246D CIRCLED NUMBER FOURTEEN * 0031 DIGIT ONE * 0034 DIGIT FOUR * 246E CIRCLED NUMBER FIFTEEN * 0031 DIGIT ONE * 0035 DIGIT FIVE * 246F CIRCLED NUMBER SIXTEEN * 0031 DIGIT ONE * 0036 DIGIT SIX * 2470 CIRCLED NUMBER SEVENTEEN * 0031 DIGIT ONE * 0037 DIGIT SEVEN * 2471 CIRCLED NUMBER EIGHTEEN * 0031 DIGIT ONE * 0038 DIGIT EIGHT * 2472 CIRCLED NUMBER NINETEEN * 0031 DIGIT ONE * 0039 DIGIT NINE * 2473 CIRCLED NUMBER TWENTY * 0032 DIGIT TWO * 0030 DIGIT ZERO * 2474 PARENTHESIZED DIGIT ONE * 0028 LEFT PARENTHESIS * 0031 DIGIT ONE * 0029 RIGHT PARENTHESIS * 2475 PARENTHESIZED DIGIT TWO * 0028 LEFT PARENTHESIS * 0032 DIGIT TWO * 0029 RIGHT PARENTHESIS * 2476 PARENTHESIZED DIGIT THREE * 0028 LEFT PARENTHESIS * 0033 DIGIT THREE * 0029 RIGHT PARENTHESIS * 2477 PARENTHESIZED DIGIT FOUR * 0028 LEFT PARENTHESIS * 0034 DIGIT FOUR * 0029 RIGHT PARENTHESIS * 2478 PARENTHESIZED DIGIT FIVE * 0028 LEFT PARENTHESIS * 0035 DIGIT FIVE * 0029 RIGHT PARENTHESIS * 2479 PARENTHESIZED DIGIT SIX * 0028 LEFT PARENTHESIS * 0036 DIGIT SIX * 0029 RIGHT PARENTHESIS * 247A PARENTHESIZED DIGIT SEVEN * 0028 LEFT PARENTHESIS * 0037 DIGIT SEVEN * 0029 RIGHT PARENTHESIS * 247B PARENTHESIZED DIGIT EIGHT * 0028 LEFT PARENTHESIS * 0038 DIGIT EIGHT * 0029 RIGHT PARENTHESIS * 247C PARENTHESIZED DIGIT NINE * 0028 LEFT PARENTHESIS * 0039 DIGIT NINE * 0029 RIGHT PARENTHESIS * 247D PARENTHESIZED NUMBER TEN * 0028 LEFT PARENTHESIS * 0031 DIGIT ONE * 0030 DIGIT ZERO * 0029 RIGHT PARENTHESIS * 247E PARENTHESIZED NUMBER ELEVEN * 0028 LEFT PARENTHESIS * 0031 DIGIT ONE * 0031 DIGIT ONE * 0029 RIGHT PARENTHESIS * 247F PARENTHESIZED NUMBER TWELVE * 0028 LEFT PARENTHESIS * 0031 DIGIT ONE * 0032 DIGIT TWO * 0029 RIGHT PARENTHESIS * 2480 PARENTHESIZED NUMBER THIRTEEN * 0028 LEFT PARENTHESIS * 0031 DIGIT ONE * 0033 DIGIT THREE * 0029 RIGHT PARENTHESIS * 2481 PARENTHESIZED NUMBER FOURTEEN * 0028 LEFT PARENTHESIS * 0031 DIGIT ONE * 0034 DIGIT FOUR * 0029 RIGHT PARENTHESIS * 2482 PARENTHESIZED NUMBER FIFTEEN * 0028 LEFT PARENTHESIS * 0031 DIGIT ONE * 0035 DIGIT FIVE * 0029 RIGHT PARENTHESIS * 2483 PARENTHESIZED NUMBER SIXTEEN * 0028 LEFT PARENTHESIS * 0031 DIGIT ONE * 0036 DIGIT SIX * 0029 RIGHT PARENTHESIS * 2484 PARENTHESIZED NUMBER SEVENTEEN * 0028 LEFT PARENTHESIS * 0031 DIGIT ONE * 0037 DIGIT SEVEN * 0029 RIGHT PARENTHESIS * 2485 PARENTHESIZED NUMBER EIGHTEEN * 0028 LEFT PARENTHESIS * 0031 DIGIT ONE * 0038 DIGIT EIGHT * 0029 RIGHT PARENTHESIS * 2486 PARENTHESIZED NUMBER NINETEEN * 0028 LEFT PARENTHESIS * 0031 DIGIT ONE * 0039 DIGIT NINE * 0029 RIGHT PARENTHESIS * 2487 PARENTHESIZED NUMBER TWENTY * 0028 LEFT PARENTHESIS * 0032 DIGIT TWO * 0030 DIGIT ZERO * 0029 RIGHT PARENTHESIS * 2488 DIGIT ONE FULL STOP * 0031 DIGIT ONE * 002E FULL STOP * 2489 DIGIT TWO FULL STOP * 0032 DIGIT TWO * 002E FULL STOP * 248A DIGIT THREE FULL STOP * 0033 DIGIT THREE * 002E FULL STOP * 248B DIGIT FOUR FULL STOP * 0034 DIGIT FOUR * 002E FULL STOP * 248C DIGIT FIVE FULL STOP * 0035 DIGIT FIVE * 002E FULL STOP * 248D DIGIT SIX FULL STOP * 0036 DIGIT SIX * 002E FULL STOP * 248E DIGIT SEVEN FULL STOP * 0037 DIGIT SEVEN * 002E FULL STOP * 248F DIGIT EIGHT FULL STOP * 0038 DIGIT EIGHT * 002E FULL STOP * 2490 DIGIT NINE FULL STOP * 0039 DIGIT NINE * 002E FULL STOP * 2491 NUMBER TEN FULL STOP * 0031 DIGIT ONE * 0030 DIGIT ZERO * 002E FULL STOP * 2492 NUMBER ELEVEN FULL STOP * 0031 DIGIT ONE * 0031 DIGIT ONE * 002E FULL STOP * 2493 NUMBER TWELVE FULL STOP * 0031 DIGIT ONE * 0032 DIGIT TWO * 002E FULL STOP * 2494 NUMBER THIRTEEN FULL STOP * 0031 DIGIT ONE * 0033 DIGIT THREE * 002E FULL STOP * 2495 NUMBER FOURTEEN FULL STOP * 0031 DIGIT ONE * 0034 DIGIT FOUR * 002E FULL STOP * 2496 NUMBER FIFTEEN FULL STOP * 0031 DIGIT ONE * 0035 DIGIT FIVE * 002E FULL STOP * 2497 NUMBER SIXTEEN FULL STOP * 0031 DIGIT ONE * 0036 DIGIT SIX * 002E FULL STOP * 2498 NUMBER SEVENTEEN FULL STOP * 0031 DIGIT ONE * 0037 DIGIT SEVEN * 002E FULL STOP * 2499 NUMBER EIGHTEEN FULL STOP * 0031 DIGIT ONE * 0038 DIGIT EIGHT * 002E FULL STOP * 249A NUMBER NINETEEN FULL STOP * 0031 DIGIT ONE * 0039 DIGIT NINE * 002E FULL STOP * 249B NUMBER TWENTY FULL STOP * 0032 DIGIT TWO * 0030 DIGIT ZERO * 002E FULL STOP * 249C PARENTHESIZED LATIN SMALL LETTER A * 0028 LEFT PARENTHESIS * 0061 LATIN SMALL LETTER A * 0029 RIGHT PARENTHESIS * 249D PARENTHESIZED LATIN SMALL LETTER B * 0028 LEFT PARENTHESIS * 0062 LATIN SMALL LETTER B * 0029 RIGHT PARENTHESIS * 249E PARENTHESIZED LATIN SMALL LETTER C * 0028 LEFT PARENTHESIS * 0063 LATIN SMALL LETTER C * 0029 RIGHT PARENTHESIS * 249F PARENTHESIZED LATIN SMALL LETTER D * 0028 LEFT PARENTHESIS * 0064 LATIN SMALL LETTER D * 0029 RIGHT PARENTHESIS * 24A0 PARENTHESIZED LATIN SMALL LETTER E * 0028 LEFT PARENTHESIS * 0065 LATIN SMALL LETTER E * 0029 RIGHT PARENTHESIS * 24A1 PARENTHESIZED LATIN SMALL LETTER F * 0028 LEFT PARENTHESIS * 0066 LATIN SMALL LETTER F * 0029 RIGHT PARENTHESIS * 24A2 PARENTHESIZED LATIN SMALL LETTER G * 0028 LEFT PARENTHESIS * 0067 LATIN SMALL LETTER G * 0029 RIGHT PARENTHESIS * 24A3 PARENTHESIZED LATIN SMALL LETTER H * 0028 LEFT PARENTHESIS * 0068 LATIN SMALL LETTER H * 0029 RIGHT PARENTHESIS * 24A4 PARENTHESIZED LATIN SMALL LETTER I * 0028 LEFT PARENTHESIS * 0069 LATIN SMALL LETTER I * 0029 RIGHT PARENTHESIS * 24A5 PARENTHESIZED LATIN SMALL LETTER J * 0028 LEFT PARENTHESIS * 006A LATIN SMALL LETTER J * 0029 RIGHT PARENTHESIS * 24A6 PARENTHESIZED LATIN SMALL LETTER K * 0028 LEFT PARENTHESIS * 006B LATIN SMALL LETTER K * 0029 RIGHT PARENTHESIS * 24A7 PARENTHESIZED LATIN SMALL LETTER L * 0028 LEFT PARENTHESIS * 006C LATIN SMALL LETTER L * 0029 RIGHT PARENTHESIS * 24A8 PARENTHESIZED LATIN SMALL LETTER M * 0028 LEFT PARENTHESIS * 006D LATIN SMALL LETTER M * 0029 RIGHT PARENTHESIS * 24A9 PARENTHESIZED LATIN SMALL LETTER N * 0028 LEFT PARENTHESIS * 006E LATIN SMALL LETTER N * 0029 RIGHT PARENTHESIS * 24AA PARENTHESIZED LATIN SMALL LETTER O * 0028 LEFT PARENTHESIS * 006F LATIN SMALL LETTER O * 0029 RIGHT PARENTHESIS * 24AB PARENTHESIZED LATIN SMALL LETTER P * 0028 LEFT PARENTHESIS * 0070 LATIN SMALL LETTER P * 0029 RIGHT PARENTHESIS * 24AC PARENTHESIZED LATIN SMALL LETTER Q * 0028 LEFT PARENTHESIS * 0071 LATIN SMALL LETTER Q * 0029 RIGHT PARENTHESIS * 24AD PARENTHESIZED LATIN SMALL LETTER R * 0028 LEFT PARENTHESIS * 0072 LATIN SMALL LETTER R * 0029 RIGHT PARENTHESIS * 24AE PARENTHESIZED LATIN SMALL LETTER S * 0028 LEFT PARENTHESIS * 0073 LATIN SMALL LETTER S * 0029 RIGHT PARENTHESIS * 24AF PARENTHESIZED LATIN SMALL LETTER T * 0028 LEFT PARENTHESIS * 0074 LATIN SMALL LETTER T * 0029 RIGHT PARENTHESIS * 24B0 PARENTHESIZED LATIN SMALL LETTER U * 0028 LEFT PARENTHESIS * 0075 LATIN SMALL LETTER U * 0029 RIGHT PARENTHESIS * 24B1 PARENTHESIZED LATIN SMALL LETTER V * 0028 LEFT PARENTHESIS * 0076 LATIN SMALL LETTER V * 0029 RIGHT PARENTHESIS * 24B2 PARENTHESIZED LATIN SMALL LETTER W * 0028 LEFT PARENTHESIS * 0077 LATIN SMALL LETTER W * 0029 RIGHT PARENTHESIS * 24B3 PARENTHESIZED LATIN SMALL LETTER X * 0028 LEFT PARENTHESIS * 0078 LATIN SMALL LETTER X * 0029 RIGHT PARENTHESIS * 24B4 PARENTHESIZED LATIN SMALL LETTER Y * 0028 LEFT PARENTHESIS * 0079 LATIN SMALL LETTER Y * 0029 RIGHT PARENTHESIS * 24B5 PARENTHESIZED LATIN SMALL LETTER Z * 0028 LEFT PARENTHESIS * 007A LATIN SMALL LETTER Z * 0029 RIGHT PARENTHESIS * 24B6 CIRCLED LATIN CAPITAL LETTER A * 0041 LATIN CAPITAL LETTER A * 24B7 CIRCLED LATIN CAPITAL LETTER B * 0042 LATIN CAPITAL LETTER B * 24B8 CIRCLED LATIN CAPITAL LETTER C * 0043 LATIN CAPITAL LETTER C * 24B9 CIRCLED LATIN CAPITAL LETTER D * 0044 LATIN CAPITAL LETTER D * 24BA CIRCLED LATIN CAPITAL LETTER E * 0045 LATIN CAPITAL LETTER E * 24BB CIRCLED LATIN CAPITAL LETTER F * 0046 LATIN CAPITAL LETTER F * 24BC CIRCLED LATIN CAPITAL LETTER G * 0047 LATIN CAPITAL LETTER G * 24BD CIRCLED LATIN CAPITAL LETTER H * 0048 LATIN CAPITAL LETTER H * 24BE CIRCLED LATIN CAPITAL LETTER I * 0049 LATIN CAPITAL LETTER I * 24BF CIRCLED LATIN CAPITAL LETTER J * 004A LATIN CAPITAL LETTER J * 24C0 CIRCLED LATIN CAPITAL LETTER K * 004B LATIN CAPITAL LETTER K * 24C1 CIRCLED LATIN CAPITAL LETTER L * 004C LATIN CAPITAL LETTER L * 24C2 CIRCLED LATIN CAPITAL LETTER M * 004D LATIN CAPITAL LETTER M * 24C3 CIRCLED LATIN CAPITAL LETTER N * 004E LATIN CAPITAL LETTER N * 24C4 CIRCLED LATIN CAPITAL LETTER O * 004F LATIN CAPITAL LETTER O * 24C5 CIRCLED LATIN CAPITAL LETTER P * 0050 LATIN CAPITAL LETTER P * 24C6 CIRCLED LATIN CAPITAL LETTER Q * 0051 LATIN CAPITAL LETTER Q * 24C7 CIRCLED LATIN CAPITAL LETTER R * 0052 LATIN CAPITAL LETTER R * 24C8 CIRCLED LATIN CAPITAL LETTER S * 0053 LATIN CAPITAL LETTER S * 24C9 CIRCLED LATIN CAPITAL LETTER T * 0054 LATIN CAPITAL LETTER T * 24CA CIRCLED LATIN CAPITAL LETTER U * 0055 LATIN CAPITAL LETTER U * 24CB CIRCLED LATIN CAPITAL LETTER V * 0056 LATIN CAPITAL LETTER V * 24CC CIRCLED LATIN CAPITAL LETTER W * 0057 LATIN CAPITAL LETTER W * 24CD CIRCLED LATIN CAPITAL LETTER X * 0058 LATIN CAPITAL LETTER X * 24CE CIRCLED LATIN CAPITAL LETTER Y * 0059 LATIN CAPITAL LETTER Y * 24CF CIRCLED LATIN CAPITAL LETTER Z * 005A LATIN CAPITAL LETTER Z * 24D0 CIRCLED LATIN SMALL LETTER A * 0061 LATIN SMALL LETTER A * 24D1 CIRCLED LATIN SMALL LETTER B * 0062 LATIN SMALL LETTER B * 24D2 CIRCLED LATIN SMALL LETTER C * 0063 LATIN SMALL LETTER C * 24D3 CIRCLED LATIN SMALL LETTER D * 0064 LATIN SMALL LETTER D * 24D4 CIRCLED LATIN SMALL LETTER E * 0065 LATIN SMALL LETTER E * 24D5 CIRCLED LATIN SMALL LETTER F * 0066 LATIN SMALL LETTER F * 24D6 CIRCLED LATIN SMALL LETTER G * 0067 LATIN SMALL LETTER G * 24D7 CIRCLED LATIN SMALL LETTER H * 0068 LATIN SMALL LETTER H * 24D8 CIRCLED LATIN SMALL LETTER I * 0069 LATIN SMALL LETTER I * 24D9 CIRCLED LATIN SMALL LETTER J * 006A LATIN SMALL LETTER J * 24DA CIRCLED LATIN SMALL LETTER K * 006B LATIN SMALL LETTER K * 24DB CIRCLED LATIN SMALL LETTER L * 006C LATIN SMALL LETTER L * 24DC CIRCLED LATIN SMALL LETTER M * 006D LATIN SMALL LETTER M * 24DD CIRCLED LATIN SMALL LETTER N * 006E LATIN SMALL LETTER N * 24DE CIRCLED LATIN SMALL LETTER O * 006F LATIN SMALL LETTER O * 24DF CIRCLED LATIN SMALL LETTER P * 0070 LATIN SMALL LETTER P * 24E0 CIRCLED LATIN SMALL LETTER Q * 0071 LATIN SMALL LETTER Q * 24E1 CIRCLED LATIN SMALL LETTER R * 0072 LATIN SMALL LETTER R * 24E2 CIRCLED LATIN SMALL LETTER S * 0073 LATIN SMALL LETTER S * 24E3 CIRCLED LATIN SMALL LETTER T * 0074 LATIN SMALL LETTER T * 24E4 CIRCLED LATIN SMALL LETTER U * 0075 LATIN SMALL LETTER U * 24E5 CIRCLED LATIN SMALL LETTER V * 0076 LATIN SMALL LETTER V * 24E6 CIRCLED LATIN SMALL LETTER W * 0077 LATIN SMALL LETTER W * 24E7 CIRCLED LATIN SMALL LETTER X * 0078 LATIN SMALL LETTER X * 24E8 CIRCLED LATIN SMALL LETTER Y * 0079 LATIN SMALL LETTER Y * 24E9 CIRCLED LATIN SMALL LETTER Z * 007A LATIN SMALL LETTER Z * 24EA CIRCLED DIGIT ZERO * 0030 DIGIT ZERO * 2A0C QUADRUPLE INTEGRAL OPERATOR * 222B INTEGRAL * 222B INTEGRAL * 222B INTEGRAL * 222B INTEGRAL * 2A74 DOUBLE COLON EQUAL * 003A COLON * 003A COLON * 003D EQUALS SIGN * 2A75 TWO CONSECUTIVE EQUALS SIGNS * 003D EQUALS SIGN * 003D EQUALS SIGN * 2A76 THREE CONSECUTIVE EQUALS SIGNS * 003D EQUALS SIGN * 003D EQUALS SIGN * 003D EQUALS SIGN * 2ADC FORKING * 2ADD NONFORKING * 2C7C LATIN SUBSCRIPT SMALL LETTER J * 006A LATIN SMALL LETTER J * 2C7D MODIFIER LETTER CAPITAL V * 0056 LATIN CAPITAL LETTER V * 2D6F TIFINAGH MODIFIER LETTER LABIALIZATION MARK * 2D61 TIFINAGH LETTER YAW * 2DE0 COMBINING CYRILLIC LETTER BE * 0000 * 2DE1 COMBINING CYRILLIC LETTER VE * 0000 * 2DE2 COMBINING CYRILLIC LETTER GHE * 0000 * 2DE3 COMBINING CYRILLIC LETTER DE * 0000 * 2DE4 COMBINING CYRILLIC LETTER ZHE * 0000 * 2DE5 COMBINING CYRILLIC LETTER ZE * 0000 * 2DE6 COMBINING CYRILLIC LETTER KA * 0000 * 2DE7 COMBINING CYRILLIC LETTER EL * 0000 * 2DE8 COMBINING CYRILLIC LETTER EM * 0000 * 2DE9 COMBINING CYRILLIC LETTER EN * 0000 * 2DEA COMBINING CYRILLIC LETTER O * 0000 * 2DEB COMBINING CYRILLIC LETTER PE * 0000 * 2DEC COMBINING CYRILLIC LETTER ER * 0000 * 2DED COMBINING CYRILLIC LETTER ES * 0000 * 2DEE COMBINING CYRILLIC LETTER TE * 0000 * 2DEF COMBINING CYRILLIC LETTER HA * 0000 * 2DF0 COMBINING CYRILLIC LETTER TSE * 0000 * 2DF1 COMBINING CYRILLIC LETTER CHE * 0000 * 2DF2 COMBINING CYRILLIC LETTER SHA * 0000 * 2DF3 COMBINING CYRILLIC LETTER SHCHA * 0000 * 2DF4 COMBINING CYRILLIC LETTER FITA * 0000 * 2DF5 COMBINING CYRILLIC LETTER ES-TE * 0000 * 2DF6 COMBINING CYRILLIC LETTER A * 0000 * 2DF7 COMBINING CYRILLIC LETTER IE * 0000 * 2DF8 COMBINING CYRILLIC LETTER DJERV * 0000 * 2DF9 COMBINING CYRILLIC LETTER MONOGRAPH UK * 0000 * 2DFA COMBINING CYRILLIC LETTER YAT * 0000 * 2DFB COMBINING CYRILLIC LETTER YU * 0000 * 2DFC COMBINING CYRILLIC LETTER IOTIFIED A * 0000 * 2DFD COMBINING CYRILLIC LETTER LITTLE YUS * 0000 * 2DFE COMBINING CYRILLIC LETTER BIG YUS * 0000 * 2DFF COMBINING CYRILLIC LETTER IOTIFIED BIG YUS * 0000 * 2E9F CJK RADICAL MOTHER * 6BCD ?? * 2EF3 CJK RADICAL C-SIMPLIFIED TURTLE * 9F9F ?? * 2F00 KANGXI RADICAL ONE * 4E00 * 2F01 KANGXI RADICAL LINE * 4E28 ?? * 2F02 KANGXI RADICAL DOT * 4E36 ?? * 2F03 KANGXI RADICAL SLASH * 4E3F ?? * 2F04 KANGXI RADICAL SECOND * 4E59 ?? * 2F05 KANGXI RADICAL HOOK * 4E85 ?? * 2F06 KANGXI RADICAL TWO * 4E8C ?? * 2F07 KANGXI RADICAL LID * 4EA0 ?? * 2F08 KANGXI RADICAL MAN * 4EBA ?? * 2F09 KANGXI RADICAL LEGS * 513F ?? * 2F0A KANGXI RADICAL ENTER * 5165 ?? * 2F0B KANGXI RADICAL EIGHT * 516B ?? * 2F0C KANGXI RADICAL DOWN BOX * 5182 ?? * 2F0D KANGXI RADICAL COVER * 5196 ?? * 2F0E KANGXI RADICAL ICE * 51AB ?? * 2F0F KANGXI RADICAL TABLE * 51E0 ?? * 2F10 KANGXI RADICAL OPEN BOX * 51F5 ?? * 2F11 KANGXI RADICAL KNIFE * 5200 ?? * 2F12 KANGXI RADICAL POWER * 529B ?? * 2F13 KANGXI RADICAL WRAP * 52F9 ?? * 2F14 KANGXI RADICAL SPOON * 5315 ?? * 2F15 KANGXI RADICAL RIGHT OPEN BOX * 531A ?? * 2F16 KANGXI RADICAL HIDING ENCLOSURE * 5338 ?? * 2F17 KANGXI RADICAL TEN * 5341 ?? * 2F18 KANGXI RADICAL DIVINATION * 535C ?? * 2F19 KANGXI RADICAL SEAL * 5369 ?? * 2F1A KANGXI RADICAL CLIFF * 5382 ?? * 2F1B KANGXI RADICAL PRIVATE * 53B6 ?? * 2F1C KANGXI RADICAL AGAIN * 53C8 ?? * 2F1D KANGXI RADICAL MOUTH * 53E3 ?? * 2F1E KANGXI RADICAL ENCLOSURE * 56D7 ?? * 2F1F KANGXI RADICAL EARTH * 571F ?? * 2F20 KANGXI RADICAL SCHOLAR * 58EB ?? * 2F21 KANGXI RADICAL GO * 5902 ?? * 2F22 KANGXI RADICAL GO SLOWLY * 590A ?? * 2F23 KANGXI RADICAL EVENING * 5915 ?? * 2F24 KANGXI RADICAL BIG * 5927 ?? * 2F25 KANGXI RADICAL WOMAN * 5973 ?? * 2F26 KANGXI RADICAL CHILD * 5B50 ?? * 2F27 KANGXI RADICAL ROOF * 5B80 ?? * 2F28 KANGXI RADICAL INCH * 5BF8 ?? * 2F29 KANGXI RADICAL SMALL * 5C0F ?? * 2F2A KANGXI RADICAL LAME * 5C22 ?? * 2F2B KANGXI RADICAL CORPSE * 5C38 ?? * 2F2C KANGXI RADICAL SPROUT * 5C6E ?? * 2F2D KANGXI RADICAL MOUNTAIN * 5C71 ?? * 2F2E KANGXI RADICAL RIVER * 5DDB ?? * 2F2F KANGXI RADICAL WORK * 5DE5 ?? * 2F30 KANGXI RADICAL ONESELF * 5DF1 ?? * 2F31 KANGXI RADICAL TURBAN * 5DFE ?? * 2F32 KANGXI RADICAL DRY * 5E72 ?? * 2F33 KANGXI RADICAL SHORT THREAD * 5E7A ?? * 2F34 KANGXI RADICAL DOTTED CLIFF * 5E7F ?? * 2F35 KANGXI RADICAL LONG STRIDE * 5EF4 ?? * 2F36 KANGXI RADICAL TWO HANDS * 5EFE ?? * 2F37 KANGXI RADICAL SHOOT * 5F0B ?? * 2F38 KANGXI RADICAL BOW * 5F13 ?? * 2F39 KANGXI RADICAL SNOUT * 5F50 ?? * 2F3A KANGXI RADICAL BRISTLE * 5F61 ?? * 2F3B KANGXI RADICAL STEP * 5F73 ?? * 2F3C KANGXI RADICAL HEART * 5FC3 ?? * 2F3D KANGXI RADICAL HALBERD * 6208 ?? * 2F3E KANGXI RADICAL DOOR * 6236 ?? * 2F3F KANGXI RADICAL HAND * 624B ?? * 2F40 KANGXI RADICAL BRANCH * 652F ?? * 2F41 KANGXI RADICAL RAP * 6534 ?? * 2F42 KANGXI RADICAL SCRIPT * 6587 ?? * 2F43 KANGXI RADICAL DIPPER * 6597 ?? * 2F44 KANGXI RADICAL AXE * 65A4 ?? * 2F45 KANGXI RADICAL SQUARE * 65B9 ?? * 2F46 KANGXI RADICAL NOT * 65E0 ?? * 2F47 KANGXI RADICAL SUN * 65E5 ?? * 2F48 KANGXI RADICAL SAY * 66F0 ?? * 2F49 KANGXI RADICAL MOON * 6708 ?? * 2F4A KANGXI RADICAL TREE * 6728 ?? * 2F4B KANGXI RADICAL LACK * 6B20 ?? * 2F4C KANGXI RADICAL STOP * 6B62 ?? * 2F4D KANGXI RADICAL DEATH * 6B79 ?? * 2F4E KANGXI RADICAL WEAPON * 6BB3 ?? * 2F4F KANGXI RADICAL DO NOT * 6BCB ?? * 2F50 KANGXI RADICAL COMPARE * 6BD4 ?? * 2F51 KANGXI RADICAL FUR * 6BDB ?? * 2F52 KANGXI RADICAL CLAN * 6C0F ?? * 2F53 KANGXI RADICAL STEAM * 6C14 ?? * 2F54 KANGXI RADICAL WATER * 6C34 ?? * 2F55 KANGXI RADICAL FIRE * 706B ?? * 2F56 KANGXI RADICAL CLAW * 722A ?? * 2F57 KANGXI RADICAL FATHER * 7236 ?? * 2F58 KANGXI RADICAL DOUBLE X * 723B ?? * 2F59 KANGXI RADICAL HALF TREE TRUNK * 723F ?? * 2F5A KANGXI RADICAL SLICE * 7247 ?? * 2F5B KANGXI RADICAL FANG * 7259 ?? * 2F5C KANGXI RADICAL COW * 725B ?? * 2F5D KANGXI RADICAL DOG * 72AC ?? * 2F5E KANGXI RADICAL PROFOUND * 7384 ?? * 2F5F KANGXI RADICAL JADE * 7389 ?? * 2F60 KANGXI RADICAL MELON * 74DC ?? * 2F61 KANGXI RADICAL TILE * 74E6 ?? * 2F62 KANGXI RADICAL SWEET * 7518 ?? * 2F63 KANGXI RADICAL LIFE * 751F ?? * 2F64 KANGXI RADICAL USE * 7528 ?? * 2F65 KANGXI RADICAL FIELD * 7530 ?? * 2F66 KANGXI RADICAL BOLT OF CLOTH * 758B ?? * 2F67 KANGXI RADICAL SICKNESS * 7592 ?? * 2F68 KANGXI RADICAL DOTTED TENT * 7676 ?? * 2F69 KANGXI RADICAL WHITE * 767D ?? * 2F6A KANGXI RADICAL SKIN * 76AE ?? * 2F6B KANGXI RADICAL DISH * 76BF ?? * 2F6C KANGXI RADICAL EYE * 76EE ?? * 2F6D KANGXI RADICAL SPEAR * 77DB ?? * 2F6E KANGXI RADICAL ARROW * 77E2 ?? * 2F6F KANGXI RADICAL STONE * 77F3 ?? * 2F70 KANGXI RADICAL SPIRIT * 793A ?? * 2F71 KANGXI RADICAL TRACK * 79B8 ?? * 2F72 KANGXI RADICAL GRAIN * 79BE ?? * 2F73 KANGXI RADICAL CAVE * 7A74 ?? * 2F74 KANGXI RADICAL STAND * 7ACB ?? * 2F75 KANGXI RADICAL BAMBOO * 7AF9 ?? * 2F76 KANGXI RADICAL RICE * 7C73 ?? * 2F77 KANGXI RADICAL SILK * 7CF8 ?? * 2F78 KANGXI RADICAL JAR * 7F36 ?? * 2F79 KANGXI RADICAL NET * 7F51 ?? * 2F7A KANGXI RADICAL SHEEP * 7F8A ?? * 2F7B KANGXI RADICAL FEATHER * 7FBD ?? * 2F7C KANGXI RADICAL OLD * 8001 ?? * 2F7D KANGXI RADICAL AND * 800C ?? * 2F7E KANGXI RADICAL PLOW * 8012 ?? * 2F7F KANGXI RADICAL EAR * 8033 ?? * 2F80 KANGXI RADICAL BRUSH * 807F ?? * 2F81 KANGXI RADICAL MEAT * 8089 ?? * 2F82 KANGXI RADICAL MINISTER * 81E3 ?? * 2F83 KANGXI RADICAL SELF * 81EA ?? * 2F84 KANGXI RADICAL ARRIVE * 81F3 ?? * 2F85 KANGXI RADICAL MORTAR * 81FC ?? * 2F86 KANGXI RADICAL TONGUE * 820C ?? * 2F87 KANGXI RADICAL OPPOSE * 821B ?? * 2F88 KANGXI RADICAL BOAT * 821F ?? * 2F89 KANGXI RADICAL STOPPING * 826E ?? * 2F8A KANGXI RADICAL COLOR * 8272 ?? * 2F8B KANGXI RADICAL GRASS * 8278 ?? * 2F8C KANGXI RADICAL TIGER * 864D ?? * 2F8D KANGXI RADICAL INSECT * 866B ?? * 2F8E KANGXI RADICAL BLOOD * 8840 ?? * 2F8F KANGXI RADICAL WALK ENCLOSURE * 884C ?? * 2F90 KANGXI RADICAL CLOTHES * 8863 ?? * 2F91 KANGXI RADICAL WEST * 897E ?? * 2F92 KANGXI RADICAL SEE * 898B ?? * 2F93 KANGXI RADICAL HORN * 89D2 ?? * 2F94 KANGXI RADICAL SPEECH * 8A00 ?? * 2F95 KANGXI RADICAL VALLEY * 8C37 ?? * 2F96 KANGXI RADICAL BEAN * 8C46 ?? * 2F97 KANGXI RADICAL PIG * 8C55 ?? * 2F98 KANGXI RADICAL BADGER * 8C78 ?? * 2F99 KANGXI RADICAL SHELL * 8C9D ?? * 2F9A KANGXI RADICAL RED * 8D64 ?? * 2F9B KANGXI RADICAL RUN * 8D70 ?? * 2F9C KANGXI RADICAL FOOT * 8DB3 ?? * 2F9D KANGXI RADICAL BODY * 8EAB ?? * 2F9E KANGXI RADICAL CART * 8ECA ?? * 2F9F KANGXI RADICAL BITTER * 8F9B ?? * 2FA0 KANGXI RADICAL MORNING * 8FB0 ?? * 2FA1 KANGXI RADICAL WALK * 8FB5 ?? * 2FA2 KANGXI RADICAL CITY * 9091 ?? * 2FA3 KANGXI RADICAL WINE * 9149 ?? * 2FA4 KANGXI RADICAL DISTINGUISH * 91C6 ?? * 2FA5 KANGXI RADICAL VILLAGE * 91CC ?? * 2FA6 KANGXI RADICAL GOLD * 91D1 ?? * 2FA7 KANGXI RADICAL LONG * 9577 ?? * 2FA8 KANGXI RADICAL GATE * 9580 ?? * 2FA9 KANGXI RADICAL MOUND * 961C ?? * 2FAA KANGXI RADICAL SLAVE * 96B6 ?? * 2FAB KANGXI RADICAL SHORT TAILED BIRD * 96B9 ?? * 2FAC KANGXI RADICAL RAIN * 96E8 ?? * 2FAD KANGXI RADICAL BLUE * 9751 ?? * 2FAE KANGXI RADICAL WRONG * 975E ?? * 2FAF KANGXI RADICAL FACE * 9762 ?? * 2FB0 KANGXI RADICAL LEATHER * 9769 ?? * 2FB1 KANGXI RADICAL TANNED LEATHER * 97CB ?? * 2FB2 KANGXI RADICAL LEEK * 97ED ?? * 2FB3 KANGXI RADICAL SOUND * 97F3 ?? * 2FB4 KANGXI RADICAL LEAF * 9801 ?? * 2FB5 KANGXI RADICAL WIND * 98A8 ?? * 2FB6 KANGXI RADICAL FLY * 98DB ?? * 2FB7 KANGXI RADICAL EAT * 98DF ?? * 2FB8 KANGXI RADICAL HEAD * 9996 ?? * 2FB9 KANGXI RADICAL FRAGRANT * 9999 ?? * 2FBA KANGXI RADICAL HORSE * 99AC ?? * 2FBB KANGXI RADICAL BONE * 9AA8 ?? * 2FBC KANGXI RADICAL TALL * 9AD8 ?? * 2FBD KANGXI RADICAL HAIR * 9ADF ?? * 2FBE KANGXI RADICAL FIGHT * 9B25 ?? * 2FBF KANGXI RADICAL SACRIFICIAL WINE * 9B2F ?? * 2FC0 KANGXI RADICAL CAULDRON * 9B32 ?? * 2FC1 KANGXI RADICAL GHOST * 9B3C ?? * 2FC2 KANGXI RADICAL FISH * 9B5A ?? * 2FC3 KANGXI RADICAL BIRD * 9CE5 ?? * 2FC4 KANGXI RADICAL SALT * 9E75 ?? * 2FC5 KANGXI RADICAL DEER * 9E7F ?? * 2FC6 KANGXI RADICAL WHEAT * 9EA5 ?? * 2FC7 KANGXI RADICAL HEMP * 9EBB ?? * 2FC8 KANGXI RADICAL YELLOW * 9EC3 ?? * 2FC9 KANGXI RADICAL MILLET * 9ECD ?? * 2FCA KANGXI RADICAL BLACK * 9ED1 ?? * 2FCB KANGXI RADICAL EMBROIDERY * 9EF9 ?? * 2FCC KANGXI RADICAL FROG * 9EFD ?? * 2FCD KANGXI RADICAL TRIPOD * 9F0E ?? * 2FCE KANGXI RADICAL DRUM * 9F13 ?? * 2FCF KANGXI RADICAL RAT * 9F20 ?? * 2FD0 KANGXI RADICAL NOSE * 9F3B ?? * 2FD1 KANGXI RADICAL EVEN * 9F4A ?? * 2FD2 KANGXI RADICAL TOOTH * 9F52 ?? * 2FD3 KANGXI RADICAL DRAGON * 9F8D ?? * 2FD4 KANGXI RADICAL TURTLE * 9F9C ?? * 2FD5 KANGXI RADICAL FLUTE * 9FA0 ?? * 3000 IDEOGRAPHIC SPACE * 0020 SPACE * 302A IDEOGRAPHIC LEVEL TONE MARK * 0000 * 302B IDEOGRAPHIC RISING TONE MARK * 0000 * 302C IDEOGRAPHIC DEPARTING TONE MARK * 0000 * 302D IDEOGRAPHIC ENTERING TONE MARK * 0000 * 302E HANGUL SINGLE DOT TONE MARK * 0000 * 302F HANGUL DOUBLE DOT TONE MARK * 0000 * 3036 CIRCLED POSTAL MARK * 3012 POSTAL MARK * 3038 HANGZHOU NUMERAL TEN * 5341 ?? * 3039 HANGZHOU NUMERAL TWENTY * 5344 ?? * 303A HANGZHOU NUMERAL THIRTY * 5345 ?? * 3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK * 0000 * 309A COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK * 0000 * 3131 HANGUL LETTER KIYEOK * 1100 HANGUL CHOSEONG KIYEOK * 3132 HANGUL LETTER SSANGKIYEOK * 1101 HANGUL CHOSEONG SSANGKIYEOK * 3133 HANGUL LETTER KIYEOK-SIOS * 11AA HANGUL JONGSEONG KIYEOK-SIOS * 3134 HANGUL LETTER NIEUN * 1102 HANGUL CHOSEONG NIEUN * 3135 HANGUL LETTER NIEUN-CIEUC * 11AC HANGUL JONGSEONG NIEUN-CIEUC * 3136 HANGUL LETTER NIEUN-HIEUH * 11AD HANGUL JONGSEONG NIEUN-HIEUH * 3137 HANGUL LETTER TIKEUT * 1103 HANGUL CHOSEONG TIKEUT * 3138 HANGUL LETTER SSANGTIKEUT * 1104 HANGUL CHOSEONG SSANGTIKEUT * 3139 HANGUL LETTER RIEUL * 1105 HANGUL CHOSEONG RIEUL * 313A HANGUL LETTER RIEUL-KIYEOK * 11B0 HANGUL JONGSEONG RIEUL-KIYEOK * 313B HANGUL LETTER RIEUL-MIEUM * 11B1 HANGUL JONGSEONG RIEUL-MIEUM * 313C HANGUL LETTER RIEUL-PIEUP * 11B2 HANGUL JONGSEONG RIEUL-PIEUP * 313D HANGUL LETTER RIEUL-SIOS * 11B3 HANGUL JONGSEONG RIEUL-SIOS * 313E HANGUL LETTER RIEUL-THIEUTH * 11B4 HANGUL JONGSEONG RIEUL-THIEUTH * 313F HANGUL LETTER RIEUL-PHIEUPH * 11B5 HANGUL JONGSEONG RIEUL-PHIEUPH * 3140 HANGUL LETTER RIEUL-HIEUH * 111A HANGUL CHOSEONG RIEUL-HIEUH * 3141 HANGUL LETTER MIEUM * 1106 HANGUL CHOSEONG MIEUM * 3142 HANGUL LETTER PIEUP * 1107 HANGUL CHOSEONG PIEUP * 3143 HANGUL LETTER SSANGPIEUP * 1108 HANGUL CHOSEONG SSANGPIEUP * 3144 HANGUL LETTER PIEUP-SIOS * 1121 HANGUL CHOSEONG PIEUP-SIOS * 3145 HANGUL LETTER SIOS * 1109 HANGUL CHOSEONG SIOS * 3146 HANGUL LETTER SSANGSIOS * 110A HANGUL CHOSEONG SSANGSIOS * 3147 HANGUL LETTER IEUNG * 110B HANGUL CHOSEONG IEUNG * 3148 HANGUL LETTER CIEUC * 110C HANGUL CHOSEONG CIEUC * 3149 HANGUL LETTER SSANGCIEUC * 110D HANGUL CHOSEONG SSANGCIEUC * 314A HANGUL LETTER CHIEUCH * 110E HANGUL CHOSEONG CHIEUCH * 314B HANGUL LETTER KHIEUKH * 110F HANGUL CHOSEONG KHIEUKH * 314C HANGUL LETTER THIEUTH * 1110 HANGUL CHOSEONG THIEUTH * 314D HANGUL LETTER PHIEUPH * 1111 HANGUL CHOSEONG PHIEUPH * 314E HANGUL LETTER HIEUH * 1112 HANGUL CHOSEONG HIEUH * 314F HANGUL LETTER A * 1161 HANGUL JUNGSEONG A * 3150 HANGUL LETTER AE * 1162 HANGUL JUNGSEONG AE * 3151 HANGUL LETTER YA * 1163 HANGUL JUNGSEONG YA * 3152 HANGUL LETTER YAE * 1164 HANGUL JUNGSEONG YAE * 3153 HANGUL LETTER EO * 1165 HANGUL JUNGSEONG EO * 3154 HANGUL LETTER E * 1166 HANGUL JUNGSEONG E * 3155 HANGUL LETTER YEO * 1167 HANGUL JUNGSEONG YEO * 3156 HANGUL LETTER YE * 1168 HANGUL JUNGSEONG YE * 3157 HANGUL LETTER O * 1169 HANGUL JUNGSEONG O * 3158 HANGUL LETTER WA * 116A HANGUL JUNGSEONG WA * 3159 HANGUL LETTER WAE * 116B HANGUL JUNGSEONG WAE * 315A HANGUL LETTER OE * 116C HANGUL JUNGSEONG OE * 315B HANGUL LETTER YO * 116D HANGUL JUNGSEONG YO * 315C HANGUL LETTER U * 116E HANGUL JUNGSEONG U * 315D HANGUL LETTER WEO * 116F HANGUL JUNGSEONG WEO * 315E HANGUL LETTER WE * 1170 HANGUL JUNGSEONG WE * 315F HANGUL LETTER WI * 1171 HANGUL JUNGSEONG WI * 3160 HANGUL LETTER YU * 1172 HANGUL JUNGSEONG YU * 3161 HANGUL LETTER EU * 1173 HANGUL JUNGSEONG EU * 3162 HANGUL LETTER YI * 1174 HANGUL JUNGSEONG YI * 3163 HANGUL LETTER I * 1175 HANGUL JUNGSEONG I * 3164 HANGUL FILLER * 1160 HANGUL JUNGSEONG FILLER * 3165 HANGUL LETTER SSANGNIEUN * 1114 HANGUL CHOSEONG SSANGNIEUN * 3166 HANGUL LETTER NIEUN-TIKEUT * 1115 HANGUL CHOSEONG NIEUN-TIKEUT * 3167 HANGUL LETTER NIEUN-SIOS * 11C7 HANGUL JONGSEONG NIEUN-SIOS * 3168 HANGUL LETTER NIEUN-PANSIOS * 11C8 HANGUL JONGSEONG NIEUN-PANSIOS * 3169 HANGUL LETTER RIEUL-KIYEOK-SIOS * 11CC HANGUL JONGSEONG RIEUL-KIYEOK-SIOS * 316A HANGUL LETTER RIEUL-TIKEUT * 11CE HANGUL JONGSEONG RIEUL-TIKEUT * 316B HANGUL LETTER RIEUL-PIEUP-SIOS * 11D3 HANGUL JONGSEONG RIEUL-PIEUP-SIOS * 316C HANGUL LETTER RIEUL-PANSIOS * 11D7 HANGUL JONGSEONG RIEUL-PANSIOS * 316D HANGUL LETTER RIEUL-YEORINHIEUH * 11D9 HANGUL JONGSEONG RIEUL-YEORINHIEUH * 316E HANGUL LETTER MIEUM-PIEUP * 111C HANGUL CHOSEONG MIEUM-PIEUP * 316F HANGUL LETTER MIEUM-SIOS * 11DD HANGUL JONGSEONG MIEUM-SIOS * 3170 HANGUL LETTER MIEUM-PANSIOS * 11DF HANGUL JONGSEONG MIEUM-PANSIOS * 3171 HANGUL LETTER KAPYEOUNMIEUM * 111D HANGUL CHOSEONG KAPYEOUNMIEUM * 3172 HANGUL LETTER PIEUP-KIYEOK * 111E HANGUL CHOSEONG PIEUP-KIYEOK * 3173 HANGUL LETTER PIEUP-TIKEUT * 1120 HANGUL CHOSEONG PIEUP-TIKEUT * 3174 HANGUL LETTER PIEUP-SIOS-KIYEOK * 1122 HANGUL CHOSEONG PIEUP-SIOS-KIYEOK * 3175 HANGUL LETTER PIEUP-SIOS-TIKEUT * 1123 HANGUL CHOSEONG PIEUP-SIOS-TIKEUT * 3176 HANGUL LETTER PIEUP-CIEUC * 1127 HANGUL CHOSEONG PIEUP-CIEUC * 3177 HANGUL LETTER PIEUP-THIEUTH * 1129 HANGUL CHOSEONG PIEUP-THIEUTH * 3178 HANGUL LETTER KAPYEOUNPIEUP * 112B HANGUL CHOSEONG KAPYEOUNPIEUP * 3179 HANGUL LETTER KAPYEOUNSSANGPIEUP * 112C HANGUL CHOSEONG KAPYEOUNSSANGPIEUP * 317A HANGUL LETTER SIOS-KIYEOK * 112D HANGUL CHOSEONG SIOS-KIYEOK * 317B HANGUL LETTER SIOS-NIEUN * 112E HANGUL CHOSEONG SIOS-NIEUN * 317C HANGUL LETTER SIOS-TIKEUT * 112F HANGUL CHOSEONG SIOS-TIKEUT * 317D HANGUL LETTER SIOS-PIEUP * 1132 HANGUL CHOSEONG SIOS-PIEUP * 317E HANGUL LETTER SIOS-CIEUC * 1136 HANGUL CHOSEONG SIOS-CIEUC * 317F HANGUL LETTER PANSIOS * 1140 HANGUL CHOSEONG PANSIOS * 3180 HANGUL LETTER SSANGIEUNG * 1147 HANGUL CHOSEONG SSANGIEUNG * 3181 HANGUL LETTER YESIEUNG * 114C HANGUL CHOSEONG YESIEUNG * 3182 HANGUL LETTER YESIEUNG-SIOS * 11F1 HANGUL JONGSEONG YESIEUNG-SIOS * 3183 HANGUL LETTER YESIEUNG-PANSIOS * 11F2 HANGUL JONGSEONG YESIEUNG-PANSIOS * 3184 HANGUL LETTER KAPYEOUNPHIEUPH * 1157 HANGUL CHOSEONG KAPYEOUNPHIEUPH * 3185 HANGUL LETTER SSANGHIEUH * 1158 HANGUL CHOSEONG SSANGHIEUH * 3186 HANGUL LETTER YEORINHIEUH * 1159 HANGUL CHOSEONG YEORINHIEUH * 3187 HANGUL LETTER YO-YA * 1184 HANGUL JUNGSEONG YO-YA * 3188 HANGUL LETTER YO-YAE * 1185 HANGUL JUNGSEONG YO-YAE * 3189 HANGUL LETTER YO-I * 1188 HANGUL JUNGSEONG YO-I * 318A HANGUL LETTER YU-YEO * 1191 HANGUL JUNGSEONG YU-YEO * 318B HANGUL LETTER YU-YE * 1192 HANGUL JUNGSEONG YU-YE * 318C HANGUL LETTER YU-I * 1194 HANGUL JUNGSEONG YU-I * 318D HANGUL LETTER ARAEA * 119E HANGUL JUNGSEONG ARAEA * 318E HANGUL LETTER ARAEAE * 11A1 HANGUL JUNGSEONG ARAEA-I * 3192 IDEOGRAPHIC ANNOTATION ONE MARK * 4E00 * 3193 IDEOGRAPHIC ANNOTATION TWO MARK * 4E8C ?? * 3194 IDEOGRAPHIC ANNOTATION THREE MARK * 4E09 ?? * 3195 IDEOGRAPHIC ANNOTATION FOUR MARK * 56DB ?? * 3196 IDEOGRAPHIC ANNOTATION TOP MARK * 4E0A ?? * 3197 IDEOGRAPHIC ANNOTATION MIDDLE MARK * 4E2D ?? * 3198 IDEOGRAPHIC ANNOTATION BOTTOM MARK * 4E0B ?? * 3199 IDEOGRAPHIC ANNOTATION FIRST MARK * 7532 ?? * 319A IDEOGRAPHIC ANNOTATION SECOND MARK * 4E59 ?? * 319B IDEOGRAPHIC ANNOTATION THIRD MARK * 4E19 ?? * 319C IDEOGRAPHIC ANNOTATION FOURTH MARK * 4E01 ?? * 319D IDEOGRAPHIC ANNOTATION HEAVEN MARK * 5929 ?? * 319E IDEOGRAPHIC ANNOTATION EARTH MARK * 5730 ?? * 319F IDEOGRAPHIC ANNOTATION MAN MARK * 4EBA ?? * 3200 PARENTHESIZED HANGUL KIYEOK * 0028 LEFT PARENTHESIS * 1100 HANGUL CHOSEONG KIYEOK * 0029 RIGHT PARENTHESIS * 3201 PARENTHESIZED HANGUL NIEUN * 0028 LEFT PARENTHESIS * 1102 HANGUL CHOSEONG NIEUN * 0029 RIGHT PARENTHESIS * 3202 PARENTHESIZED HANGUL TIKEUT * 0028 LEFT PARENTHESIS * 1103 HANGUL CHOSEONG TIKEUT * 0029 RIGHT PARENTHESIS * 3203 PARENTHESIZED HANGUL RIEUL * 0028 LEFT PARENTHESIS * 1105 HANGUL CHOSEONG RIEUL * 0029 RIGHT PARENTHESIS * 3204 PARENTHESIZED HANGUL MIEUM * 0028 LEFT PARENTHESIS * 1106 HANGUL CHOSEONG MIEUM * 0029 RIGHT PARENTHESIS * 3205 PARENTHESIZED HANGUL PIEUP * 0028 LEFT PARENTHESIS * 1107 HANGUL CHOSEONG PIEUP * 0029 RIGHT PARENTHESIS * 3206 PARENTHESIZED HANGUL SIOS * 0028 LEFT PARENTHESIS * 1109 HANGUL CHOSEONG SIOS * 0029 RIGHT PARENTHESIS * 3207 PARENTHESIZED HANGUL IEUNG * 0028 LEFT PARENTHESIS * 110B HANGUL CHOSEONG IEUNG * 0029 RIGHT PARENTHESIS * 3208 PARENTHESIZED HANGUL CIEUC * 0028 LEFT PARENTHESIS * 110C HANGUL CHOSEONG CIEUC * 0029 RIGHT PARENTHESIS * 3209 PARENTHESIZED HANGUL CHIEUCH * 0028 LEFT PARENTHESIS * 110E HANGUL CHOSEONG CHIEUCH * 0029 RIGHT PARENTHESIS * 320A PARENTHESIZED HANGUL KHIEUKH * 0028 LEFT PARENTHESIS * 110F HANGUL CHOSEONG KHIEUKH * 0029 RIGHT PARENTHESIS * 320B PARENTHESIZED HANGUL THIEUTH * 0028 LEFT PARENTHESIS * 1110 HANGUL CHOSEONG THIEUTH * 0029 RIGHT PARENTHESIS * 320C PARENTHESIZED HANGUL PHIEUPH * 0028 LEFT PARENTHESIS * 1111 HANGUL CHOSEONG PHIEUPH * 0029 RIGHT PARENTHESIS * 320D PARENTHESIZED HANGUL HIEUH * 0028 LEFT PARENTHESIS * 1112 HANGUL CHOSEONG HIEUH * 0029 RIGHT PARENTHESIS * 320E PARENTHESIZED HANGUL KIYEOK A * 0028 LEFT PARENTHESIS * 1100 HANGUL CHOSEONG KIYEOK * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 320F PARENTHESIZED HANGUL NIEUN A * 0028 LEFT PARENTHESIS * 1102 HANGUL CHOSEONG NIEUN * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 3210 PARENTHESIZED HANGUL TIKEUT A * 0028 LEFT PARENTHESIS * 1103 HANGUL CHOSEONG TIKEUT * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 3211 PARENTHESIZED HANGUL RIEUL A * 0028 LEFT PARENTHESIS * 1105 HANGUL CHOSEONG RIEUL * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 3212 PARENTHESIZED HANGUL MIEUM A * 0028 LEFT PARENTHESIS * 1106 HANGUL CHOSEONG MIEUM * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 3213 PARENTHESIZED HANGUL PIEUP A * 0028 LEFT PARENTHESIS * 1107 HANGUL CHOSEONG PIEUP * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 3214 PARENTHESIZED HANGUL SIOS A * 0028 LEFT PARENTHESIS * 1109 HANGUL CHOSEONG SIOS * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 3215 PARENTHESIZED HANGUL IEUNG A * 0028 LEFT PARENTHESIS * 110B HANGUL CHOSEONG IEUNG * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 3216 PARENTHESIZED HANGUL CIEUC A * 0028 LEFT PARENTHESIS * 110C HANGUL CHOSEONG CIEUC * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 3217 PARENTHESIZED HANGUL CHIEUCH A * 0028 LEFT PARENTHESIS * 110E HANGUL CHOSEONG CHIEUCH * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 3218 PARENTHESIZED HANGUL KHIEUKH A * 0028 LEFT PARENTHESIS * 110F HANGUL CHOSEONG KHIEUKH * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 3219 PARENTHESIZED HANGUL THIEUTH A * 0028 LEFT PARENTHESIS * 1110 HANGUL CHOSEONG THIEUTH * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 321A PARENTHESIZED HANGUL PHIEUPH A * 0028 LEFT PARENTHESIS * 1111 HANGUL CHOSEONG PHIEUPH * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 321B PARENTHESIZED HANGUL HIEUH A * 0028 LEFT PARENTHESIS * 1112 HANGUL CHOSEONG HIEUH * 1161 HANGUL JUNGSEONG A * 0029 RIGHT PARENTHESIS * 321C PARENTHESIZED HANGUL CIEUC U * 0028 LEFT PARENTHESIS * 110C HANGUL CHOSEONG CIEUC * 116E HANGUL JUNGSEONG U * 0029 RIGHT PARENTHESIS * 321D PARENTHESIZED KOREAN CHARACTER OJEON * 0028 LEFT PARENTHESIS * 110B HANGUL CHOSEONG IEUNG * 1169 HANGUL JUNGSEONG O * 110C HANGUL CHOSEONG CIEUC * 1165 HANGUL JUNGSEONG EO * 11AB HANGUL JONGSEONG NIEUN * 0029 RIGHT PARENTHESIS * 321E PARENTHESIZED KOREAN CHARACTER O HU * 0028 LEFT PARENTHESIS * 110B HANGUL CHOSEONG IEUNG * 1169 HANGUL JUNGSEONG O * 1112 HANGUL CHOSEONG HIEUH * 116E HANGUL JUNGSEONG U * 0029 RIGHT PARENTHESIS * 3220 PARENTHESIZED IDEOGRAPH ONE * 0028 LEFT PARENTHESIS * 4E00 * 0029 RIGHT PARENTHESIS * 3221 PARENTHESIZED IDEOGRAPH TWO * 0028 LEFT PARENTHESIS * 4E8C ?? * 0029 RIGHT PARENTHESIS * 3222 PARENTHESIZED IDEOGRAPH THREE * 0028 LEFT PARENTHESIS * 4E09 ?? * 0029 RIGHT PARENTHESIS * 3223 PARENTHESIZED IDEOGRAPH FOUR * 0028 LEFT PARENTHESIS * 56DB ?? * 0029 RIGHT PARENTHESIS * 3224 PARENTHESIZED IDEOGRAPH FIVE * 0028 LEFT PARENTHESIS * 4E94 ?? * 0029 RIGHT PARENTHESIS * 3225 PARENTHESIZED IDEOGRAPH SIX * 0028 LEFT PARENTHESIS * 516D ?? * 0029 RIGHT PARENTHESIS * 3226 PARENTHESIZED IDEOGRAPH SEVEN * 0028 LEFT PARENTHESIS * 4E03 ?? * 0029 RIGHT PARENTHESIS * 3227 PARENTHESIZED IDEOGRAPH EIGHT * 0028 LEFT PARENTHESIS * 516B ?? * 0029 RIGHT PARENTHESIS * 3228 PARENTHESIZED IDEOGRAPH NINE * 0028 LEFT PARENTHESIS * 4E5D ?? * 0029 RIGHT PARENTHESIS * 3229 PARENTHESIZED IDEOGRAPH TEN * 0028 LEFT PARENTHESIS * 5341 ?? * 0029 RIGHT PARENTHESIS * 322A PARENTHESIZED IDEOGRAPH MOON * 0028 LEFT PARENTHESIS * 6708 ?? * 0029 RIGHT PARENTHESIS * 322B PARENTHESIZED IDEOGRAPH FIRE * 0028 LEFT PARENTHESIS * 706B ?? * 0029 RIGHT PARENTHESIS * 322C PARENTHESIZED IDEOGRAPH WATER * 0028 LEFT PARENTHESIS * 6C34 ?? * 0029 RIGHT PARENTHESIS * 322D PARENTHESIZED IDEOGRAPH WOOD * 0028 LEFT PARENTHESIS * 6728 ?? * 0029 RIGHT PARENTHESIS * 322E PARENTHESIZED IDEOGRAPH METAL * 0028 LEFT PARENTHESIS * 91D1 ?? * 0029 RIGHT PARENTHESIS * 322F PARENTHESIZED IDEOGRAPH EARTH * 0028 LEFT PARENTHESIS * 571F ?? * 0029 RIGHT PARENTHESIS * 3230 PARENTHESIZED IDEOGRAPH SUN * 0028 LEFT PARENTHESIS * 65E5 ?? * 0029 RIGHT PARENTHESIS * 3231 PARENTHESIZED IDEOGRAPH STOCK * 0028 LEFT PARENTHESIS * 682A ?? * 0029 RIGHT PARENTHESIS * 3232 PARENTHESIZED IDEOGRAPH HAVE * 0028 LEFT PARENTHESIS * 6709 ?? * 0029 RIGHT PARENTHESIS * 3233 PARENTHESIZED IDEOGRAPH SOCIETY * 0028 LEFT PARENTHESIS * 793E ?? * 0029 RIGHT PARENTHESIS * 3234 PARENTHESIZED IDEOGRAPH NAME * 0028 LEFT PARENTHESIS * 540D ?? * 0029 RIGHT PARENTHESIS * 3235 PARENTHESIZED IDEOGRAPH SPECIAL * 0028 LEFT PARENTHESIS * 7279 ?? * 0029 RIGHT PARENTHESIS * 3236 PARENTHESIZED IDEOGRAPH FINANCIAL * 0028 LEFT PARENTHESIS * 8CA1 ?? * 0029 RIGHT PARENTHESIS * 3237 PARENTHESIZED IDEOGRAPH CONGRATULATION * 0028 LEFT PARENTHESIS * 795D ?? * 0029 RIGHT PARENTHESIS * 3238 PARENTHESIZED IDEOGRAPH LABOR * 0028 LEFT PARENTHESIS * 52B4 ?? * 0029 RIGHT PARENTHESIS * 3239 PARENTHESIZED IDEOGRAPH REPRESENT * 0028 LEFT PARENTHESIS * 4EE3 ?? * 0029 RIGHT PARENTHESIS * 323A PARENTHESIZED IDEOGRAPH CALL * 0028 LEFT PARENTHESIS * 547C ?? * 0029 RIGHT PARENTHESIS * 323B PARENTHESIZED IDEOGRAPH STUDY * 0028 LEFT PARENTHESIS * 5B66 ?? * 0029 RIGHT PARENTHESIS * 323C PARENTHESIZED IDEOGRAPH SUPERVISE * 0028 LEFT PARENTHESIS * 76E3 ?? * 0029 RIGHT PARENTHESIS * 323D PARENTHESIZED IDEOGRAPH ENTERPRISE * 0028 LEFT PARENTHESIS * 4F01 ?? * 0029 RIGHT PARENTHESIS * 323E PARENTHESIZED IDEOGRAPH RESOURCE * 0028 LEFT PARENTHESIS * 8CC7 ?? * 0029 RIGHT PARENTHESIS * 323F PARENTHESIZED IDEOGRAPH ALLIANCE * 0028 LEFT PARENTHESIS * 5354 ?? * 0029 RIGHT PARENTHESIS * 3240 PARENTHESIZED IDEOGRAPH FESTIVAL * 0028 LEFT PARENTHESIS * 796D ?? * 0029 RIGHT PARENTHESIS * 3241 PARENTHESIZED IDEOGRAPH REST * 0028 LEFT PARENTHESIS * 4F11 ?? * 0029 RIGHT PARENTHESIS * 3242 PARENTHESIZED IDEOGRAPH SELF * 0028 LEFT PARENTHESIS * 81EA ?? * 0029 RIGHT PARENTHESIS * 3243 PARENTHESIZED IDEOGRAPH REACH * 0028 LEFT PARENTHESIS * 81F3 ?? * 0029 RIGHT PARENTHESIS * 3250 PARTNERSHIP SIGN * 0050 LATIN CAPITAL LETTER P * 0054 LATIN CAPITAL LETTER T * 0045 LATIN CAPITAL LETTER E * 3251 CIRCLED NUMBER TWENTY ONE * 0032 DIGIT TWO * 0031 DIGIT ONE * 3252 CIRCLED NUMBER TWENTY TWO * 0032 DIGIT TWO * 0032 DIGIT TWO * 3253 CIRCLED NUMBER TWENTY THREE * 0032 DIGIT TWO * 0033 DIGIT THREE * 3254 CIRCLED NUMBER TWENTY FOUR * 0032 DIGIT TWO * 0034 DIGIT FOUR * 3255 CIRCLED NUMBER TWENTY FIVE * 0032 DIGIT TWO * 0035 DIGIT FIVE * 3256 CIRCLED NUMBER TWENTY SIX * 0032 DIGIT TWO * 0036 DIGIT SIX * 3257 CIRCLED NUMBER TWENTY SEVEN * 0032 DIGIT TWO * 0037 DIGIT SEVEN * 3258 CIRCLED NUMBER TWENTY EIGHT * 0032 DIGIT TWO * 0038 DIGIT EIGHT * 3259 CIRCLED NUMBER TWENTY NINE * 0032 DIGIT TWO * 0039 DIGIT NINE * 325A CIRCLED NUMBER THIRTY * 0033 DIGIT THREE * 0030 DIGIT ZERO * 325B CIRCLED NUMBER THIRTY ONE * 0033 DIGIT THREE * 0031 DIGIT ONE * 325C CIRCLED NUMBER THIRTY TWO * 0033 DIGIT THREE * 0032 DIGIT TWO * 325D CIRCLED NUMBER THIRTY THREE * 0033 DIGIT THREE * 0033 DIGIT THREE * 325E CIRCLED NUMBER THIRTY FOUR * 0033 DIGIT THREE * 0034 DIGIT FOUR * 325F CIRCLED NUMBER THIRTY FIVE * 0033 DIGIT THREE * 0035 DIGIT FIVE * 3260 CIRCLED HANGUL KIYEOK * 1100 HANGUL CHOSEONG KIYEOK * 3261 CIRCLED HANGUL NIEUN * 1102 HANGUL CHOSEONG NIEUN * 3262 CIRCLED HANGUL TIKEUT * 1103 HANGUL CHOSEONG TIKEUT * 3263 CIRCLED HANGUL RIEUL * 1105 HANGUL CHOSEONG RIEUL * 3264 CIRCLED HANGUL MIEUM * 1106 HANGUL CHOSEONG MIEUM * 3265 CIRCLED HANGUL PIEUP * 1107 HANGUL CHOSEONG PIEUP * 3266 CIRCLED HANGUL SIOS * 1109 HANGUL CHOSEONG SIOS * 3267 CIRCLED HANGUL IEUNG * 110B HANGUL CHOSEONG IEUNG * 3268 CIRCLED HANGUL CIEUC * 110C HANGUL CHOSEONG CIEUC * 3269 CIRCLED HANGUL CHIEUCH * 110E HANGUL CHOSEONG CHIEUCH * 326A CIRCLED HANGUL KHIEUKH * 110F HANGUL CHOSEONG KHIEUKH * 326B CIRCLED HANGUL THIEUTH * 1110 HANGUL CHOSEONG THIEUTH * 326C CIRCLED HANGUL PHIEUPH * 1111 HANGUL CHOSEONG PHIEUPH * 326D CIRCLED HANGUL HIEUH * 1112 HANGUL CHOSEONG HIEUH * 326E CIRCLED HANGUL KIYEOK A * 1100 HANGUL CHOSEONG KIYEOK * 1161 HANGUL JUNGSEONG A * 326F CIRCLED HANGUL NIEUN A * 1102 HANGUL CHOSEONG NIEUN * 1161 HANGUL JUNGSEONG A * 3270 CIRCLED HANGUL TIKEUT A * 1103 HANGUL CHOSEONG TIKEUT * 1161 HANGUL JUNGSEONG A * 3271 CIRCLED HANGUL RIEUL A * 1105 HANGUL CHOSEONG RIEUL * 1161 HANGUL JUNGSEONG A * 3272 CIRCLED HANGUL MIEUM A * 1106 HANGUL CHOSEONG MIEUM * 1161 HANGUL JUNGSEONG A * 3273 CIRCLED HANGUL PIEUP A * 1107 HANGUL CHOSEONG PIEUP * 1161 HANGUL JUNGSEONG A * 3274 CIRCLED HANGUL SIOS A * 1109 HANGUL CHOSEONG SIOS * 1161 HANGUL JUNGSEONG A * 3275 CIRCLED HANGUL IEUNG A * 110B HANGUL CHOSEONG IEUNG * 1161 HANGUL JUNGSEONG A * 3276 CIRCLED HANGUL CIEUC A * 110C HANGUL CHOSEONG CIEUC * 1161 HANGUL JUNGSEONG A * 3277 CIRCLED HANGUL CHIEUCH A * 110E HANGUL CHOSEONG CHIEUCH * 1161 HANGUL JUNGSEONG A * 3278 CIRCLED HANGUL KHIEUKH A * 110F HANGUL CHOSEONG KHIEUKH * 1161 HANGUL JUNGSEONG A * 3279 CIRCLED HANGUL THIEUTH A * 1110 HANGUL CHOSEONG THIEUTH * 1161 HANGUL JUNGSEONG A * 327A CIRCLED HANGUL PHIEUPH A * 1111 HANGUL CHOSEONG PHIEUPH * 1161 HANGUL JUNGSEONG A * 327B CIRCLED HANGUL HIEUH A * 1112 HANGUL CHOSEONG HIEUH * 1161 HANGUL JUNGSEONG A * 327C CIRCLED KOREAN CHARACTER CHAMKO * 110E HANGUL CHOSEONG CHIEUCH * 1161 HANGUL JUNGSEONG A * 11B7 HANGUL JONGSEONG MIEUM * 1100 HANGUL CHOSEONG KIYEOK * 1169 HANGUL JUNGSEONG O * 327D CIRCLED KOREAN CHARACTER JUEUI * 110C HANGUL CHOSEONG CIEUC * 116E HANGUL JUNGSEONG U * 110B HANGUL CHOSEONG IEUNG * 1174 HANGUL JUNGSEONG YI * 327E CIRCLED HANGUL IEUNG U * 110B HANGUL CHOSEONG IEUNG * 116E HANGUL JUNGSEONG U * 3280 CIRCLED IDEOGRAPH ONE * 4E00 * 3281 CIRCLED IDEOGRAPH TWO * 4E8C ?? * 3282 CIRCLED IDEOGRAPH THREE * 4E09 ?? * 3283 CIRCLED IDEOGRAPH FOUR * 56DB ?? * 3284 CIRCLED IDEOGRAPH FIVE * 4E94 ?? * 3285 CIRCLED IDEOGRAPH SIX * 516D ?? * 3286 CIRCLED IDEOGRAPH SEVEN * 4E03 ?? * 3287 CIRCLED IDEOGRAPH EIGHT * 516B ?? * 3288 CIRCLED IDEOGRAPH NINE * 4E5D ?? * 3289 CIRCLED IDEOGRAPH TEN * 5341 ?? * 328A CIRCLED IDEOGRAPH MOON * 6708 ?? * 328B CIRCLED IDEOGRAPH FIRE * 706B ?? * 328C CIRCLED IDEOGRAPH WATER * 6C34 ?? * 328D CIRCLED IDEOGRAPH WOOD * 6728 ?? * 328E CIRCLED IDEOGRAPH METAL * 91D1 ?? * 328F CIRCLED IDEOGRAPH EARTH * 571F ?? * 3290 CIRCLED IDEOGRAPH SUN * 65E5 ?? * 3291 CIRCLED IDEOGRAPH STOCK * 682A ?? * 3292 CIRCLED IDEOGRAPH HAVE * 6709 ?? * 3293 CIRCLED IDEOGRAPH SOCIETY * 793E ?? * 3294 CIRCLED IDEOGRAPH NAME * 540D ?? * 3295 CIRCLED IDEOGRAPH SPECIAL * 7279 ?? * 3296 CIRCLED IDEOGRAPH FINANCIAL * 8CA1 ?? * 3297 CIRCLED IDEOGRAPH CONGRATULATION * 795D ?? * 3298 CIRCLED IDEOGRAPH LABOR * 52B4 ?? * 3299 CIRCLED IDEOGRAPH SECRET * 79D8 ?? * 329A CIRCLED IDEOGRAPH MALE * 7537 ?? * 329B CIRCLED IDEOGRAPH FEMALE * 5973 ?? * 329C CIRCLED IDEOGRAPH SUITABLE * 9069 ?? * 329D CIRCLED IDEOGRAPH EXCELLENT * 512A ?? * 329E CIRCLED IDEOGRAPH PRINT * 5370 ?? * 329F CIRCLED IDEOGRAPH ATTENTION * 6CE8 ?? * 32A0 CIRCLED IDEOGRAPH ITEM * 9805 ?? * 32A1 CIRCLED IDEOGRAPH REST * 4F11 ?? * 32A2 CIRCLED IDEOGRAPH COPY * 5199 ?? * 32A3 CIRCLED IDEOGRAPH CORRECT * 6B63 ?? * 32A4 CIRCLED IDEOGRAPH HIGH * 4E0A ?? * 32A5 CIRCLED IDEOGRAPH CENTRE * 4E2D ?? * 32A6 CIRCLED IDEOGRAPH LOW * 4E0B ?? * 32A7 CIRCLED IDEOGRAPH LEFT * 5DE6 ?? * 32A8 CIRCLED IDEOGRAPH RIGHT * 53F3 ?? * 32A9 CIRCLED IDEOGRAPH MEDICINE * 533B ?? * 32AA CIRCLED IDEOGRAPH RELIGION * 5B97 ?? * 32AB CIRCLED IDEOGRAPH STUDY * 5B66 ?? * 32AC CIRCLED IDEOGRAPH SUPERVISE * 76E3 ?? * 32AD CIRCLED IDEOGRAPH ENTERPRISE * 4F01 ?? * 32AE CIRCLED IDEOGRAPH RESOURCE * 8CC7 ?? * 32AF CIRCLED IDEOGRAPH ALLIANCE * 5354 ?? * 32B0 CIRCLED IDEOGRAPH NIGHT * 591C ?? * 32B1 CIRCLED NUMBER THIRTY SIX * 0033 DIGIT THREE * 0036 DIGIT SIX * 32B2 CIRCLED NUMBER THIRTY SEVEN * 0033 DIGIT THREE * 0037 DIGIT SEVEN * 32B3 CIRCLED NUMBER THIRTY EIGHT * 0033 DIGIT THREE * 0038 DIGIT EIGHT * 32B4 CIRCLED NUMBER THIRTY NINE * 0033 DIGIT THREE * 0039 DIGIT NINE * 32B5 CIRCLED NUMBER FORTY * 0034 DIGIT FOUR * 0030 DIGIT ZERO * 32B6 CIRCLED NUMBER FORTY ONE * 0034 DIGIT FOUR * 0031 DIGIT ONE * 32B7 CIRCLED NUMBER FORTY TWO * 0034 DIGIT FOUR * 0032 DIGIT TWO * 32B8 CIRCLED NUMBER FORTY THREE * 0034 DIGIT FOUR * 0033 DIGIT THREE * 32B9 CIRCLED NUMBER FORTY FOUR * 0034 DIGIT FOUR * 0034 DIGIT FOUR * 32BA CIRCLED NUMBER FORTY FIVE * 0034 DIGIT FOUR * 0035 DIGIT FIVE * 32BB CIRCLED NUMBER FORTY SIX * 0034 DIGIT FOUR * 0036 DIGIT SIX * 32BC CIRCLED NUMBER FORTY SEVEN * 0034 DIGIT FOUR * 0037 DIGIT SEVEN * 32BD CIRCLED NUMBER FORTY EIGHT * 0034 DIGIT FOUR * 0038 DIGIT EIGHT * 32BE CIRCLED NUMBER FORTY NINE * 0034 DIGIT FOUR * 0039 DIGIT NINE * 32BF CIRCLED NUMBER FIFTY * 0035 DIGIT FIVE * 0030 DIGIT ZERO * 32C0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY * 0031 DIGIT ONE * 6708 ?? * 32C1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY * 0032 DIGIT TWO * 6708 ?? * 32C2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH * 0033 DIGIT THREE * 6708 ?? * 32C3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL * 0034 DIGIT FOUR * 6708 ?? * 32C4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY * 0035 DIGIT FIVE * 6708 ?? * 32C5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE * 0036 DIGIT SIX * 6708 ?? * 32C6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY * 0037 DIGIT SEVEN * 6708 ?? * 32C7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST * 0038 DIGIT EIGHT * 6708 ?? * 32C8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER * 0039 DIGIT NINE * 6708 ?? * 32C9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER * 0031 DIGIT ONE * 0030 DIGIT ZERO * 6708 ?? * 32CA IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER * 0031 DIGIT ONE * 0031 DIGIT ONE * 6708 ?? * 32CB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER * 0031 DIGIT ONE * 0032 DIGIT TWO * 6708 ?? * 32CC SQUARE HG * 0048 LATIN CAPITAL LETTER H * 0067 LATIN SMALL LETTER G * 32CD SQUARE ERG * 0065 LATIN SMALL LETTER E * 0072 LATIN SMALL LETTER R * 0067 LATIN SMALL LETTER G * 32CE SQUARE EV * 0065 LATIN SMALL LETTER E * 0056 LATIN CAPITAL LETTER V * 32CF LIMITED LIABILITY SIGN * 004C LATIN CAPITAL LETTER L * 0054 LATIN CAPITAL LETTER T * 0044 LATIN CAPITAL LETTER D * 32D0 CIRCLED KATAKANA A * 30A2 KATAKANA LETTER A * 32D1 CIRCLED KATAKANA I * 30A4 KATAKANA LETTER I * 32D2 CIRCLED KATAKANA U * 30A6 KATAKANA LETTER U * 32D3 CIRCLED KATAKANA E * 30A8 KATAKANA LETTER E * 32D4 CIRCLED KATAKANA O * 30AA KATAKANA LETTER O * 32D5 CIRCLED KATAKANA KA * 30AB KATAKANA LETTER KA * 32D6 CIRCLED KATAKANA KI * 30AD KATAKANA LETTER KI * 32D7 CIRCLED KATAKANA KU * 30AF KATAKANA LETTER KU * 32D8 CIRCLED KATAKANA KE * 30B1 KATAKANA LETTER KE * 32D9 CIRCLED KATAKANA KO * 30B3 KATAKANA LETTER KO * 32DA CIRCLED KATAKANA SA * 30B5 KATAKANA LETTER SA * 32DB CIRCLED KATAKANA SI * 30B7 KATAKANA LETTER SI * 32DC CIRCLED KATAKANA SU * 30B9 KATAKANA LETTER SU * 32DD CIRCLED KATAKANA SE * 30BB KATAKANA LETTER SE * 32DE CIRCLED KATAKANA SO * 30BD KATAKANA LETTER SO * 32DF CIRCLED KATAKANA TA * 30BF KATAKANA LETTER TA * 32E0 CIRCLED KATAKANA TI * 30C1 KATAKANA LETTER TI * 32E1 CIRCLED KATAKANA TU * 30C4 KATAKANA LETTER TU * 32E2 CIRCLED KATAKANA TE * 30C6 KATAKANA LETTER TE * 32E3 CIRCLED KATAKANA TO * 30C8 KATAKANA LETTER TO * 32E4 CIRCLED KATAKANA NA * 30CA KATAKANA LETTER NA * 32E5 CIRCLED KATAKANA NI * 30CB KATAKANA LETTER NI * 32E6 CIRCLED KATAKANA NU * 30CC KATAKANA LETTER NU * 32E7 CIRCLED KATAKANA NE * 30CD KATAKANA LETTER NE * 32E8 CIRCLED KATAKANA NO * 30CE KATAKANA LETTER NO * 32E9 CIRCLED KATAKANA HA * 30CF KATAKANA LETTER HA * 32EA CIRCLED KATAKANA HI * 30D2 KATAKANA LETTER HI * 32EB CIRCLED KATAKANA HU * 30D5 KATAKANA LETTER HU * 32EC CIRCLED KATAKANA HE * 30D8 KATAKANA LETTER HE * 32ED CIRCLED KATAKANA HO * 30DB KATAKANA LETTER HO * 32EE CIRCLED KATAKANA MA * 30DE KATAKANA LETTER MA * 32EF CIRCLED KATAKANA MI * 30DF KATAKANA LETTER MI * 32F0 CIRCLED KATAKANA MU * 30E0 KATAKANA LETTER MU * 32F1 CIRCLED KATAKANA ME * 30E1 KATAKANA LETTER ME * 32F2 CIRCLED KATAKANA MO * 30E2 KATAKANA LETTER MO * 32F3 CIRCLED KATAKANA YA * 30E4 KATAKANA LETTER YA * 32F4 CIRCLED KATAKANA YU * 30E6 KATAKANA LETTER YU * 32F5 CIRCLED KATAKANA YO * 30E8 KATAKANA LETTER YO * 32F6 CIRCLED KATAKANA RA * 30E9 KATAKANA LETTER RA * 32F7 CIRCLED KATAKANA RI * 30EA KATAKANA LETTER RI * 32F8 CIRCLED KATAKANA RU * 30EB KATAKANA LETTER RU * 32F9 CIRCLED KATAKANA RE * 30EC KATAKANA LETTER RE * 32FA CIRCLED KATAKANA RO * 30ED KATAKANA LETTER RO * 32FB CIRCLED KATAKANA WA * 30EF KATAKANA LETTER WA * 32FC CIRCLED KATAKANA WI * 30F0 KATAKANA LETTER WI * 32FD CIRCLED KATAKANA WE * 30F1 KATAKANA LETTER WE * 32FE CIRCLED KATAKANA WO * 30F2 KATAKANA LETTER WO * 3300 SQUARE APAATO * 30A2 KATAKANA LETTER A * 30D1 KATAKANA LETTER PA * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30C8 KATAKANA LETTER TO * 3301 SQUARE ARUHUA * 30A2 KATAKANA LETTER A * 30EB KATAKANA LETTER RU * 30D5 KATAKANA LETTER HU * 30A1 KATAKANA LETTER SMALL A * 3302 SQUARE ANPEA * 30A2 KATAKANA LETTER A * 30F3 KATAKANA LETTER N * 30DA KATAKANA LETTER PE * 30A2 KATAKANA LETTER A * 3303 SQUARE AARU * 30A2 KATAKANA LETTER A * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30EB KATAKANA LETTER RU * 3304 SQUARE ININGU * 30A4 KATAKANA LETTER I * 30CB KATAKANA LETTER NI * 30F3 KATAKANA LETTER N * 30B0 KATAKANA LETTER GU * 3305 SQUARE INTI * 30A4 KATAKANA LETTER I * 30F3 KATAKANA LETTER N * 30C1 KATAKANA LETTER TI * 3306 SQUARE UON * 30A6 KATAKANA LETTER U * 30A9 KATAKANA LETTER SMALL O * 30F3 KATAKANA LETTER N * 3307 SQUARE ESUKUUDO * 30A8 KATAKANA LETTER E * 30B9 KATAKANA LETTER SU * 30AF KATAKANA LETTER KU * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30C9 KATAKANA LETTER DO * 3308 SQUARE EEKAA * 30A8 KATAKANA LETTER E * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30AB KATAKANA LETTER KA * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 3309 SQUARE ONSU * 30AA KATAKANA LETTER O * 30F3 KATAKANA LETTER N * 30B9 KATAKANA LETTER SU * 330A SQUARE OOMU * 30AA KATAKANA LETTER O * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30E0 KATAKANA LETTER MU * 330B SQUARE KAIRI * 30AB KATAKANA LETTER KA * 30A4 KATAKANA LETTER I * 30EA KATAKANA LETTER RI * 330C SQUARE KARATTO * 30AB KATAKANA LETTER KA * 30E9 KATAKANA LETTER RA * 30C3 KATAKANA LETTER SMALL TU * 30C8 KATAKANA LETTER TO * 330D SQUARE KARORII * 30AB KATAKANA LETTER KA * 30ED KATAKANA LETTER RO * 30EA KATAKANA LETTER RI * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 330E SQUARE GARON * 30AC KATAKANA LETTER GA * 30ED KATAKANA LETTER RO * 30F3 KATAKANA LETTER N * 330F SQUARE GANMA * 30AC KATAKANA LETTER GA * 30F3 KATAKANA LETTER N * 30DE KATAKANA LETTER MA * 3310 SQUARE GIGA * 30AE KATAKANA LETTER GI * 30AC KATAKANA LETTER GA * 3311 SQUARE GINII * 30AE KATAKANA LETTER GI * 30CB KATAKANA LETTER NI * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 3312 SQUARE KYURII * 30AD KATAKANA LETTER KI * 30E5 KATAKANA LETTER SMALL YU * 30EA KATAKANA LETTER RI * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 3313 SQUARE GIRUDAA * 30AE KATAKANA LETTER GI * 30EB KATAKANA LETTER RU * 30C0 KATAKANA LETTER DA * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 3314 SQUARE KIRO * 30AD KATAKANA LETTER KI * 30ED KATAKANA LETTER RO * 3315 SQUARE KIROGURAMU * 30AD KATAKANA LETTER KI * 30ED KATAKANA LETTER RO * 30B0 KATAKANA LETTER GU * 30E9 KATAKANA LETTER RA * 30E0 KATAKANA LETTER MU * 3316 SQUARE KIROMEETORU * 30AD KATAKANA LETTER KI * 30ED KATAKANA LETTER RO * 30E1 KATAKANA LETTER ME * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30C8 KATAKANA LETTER TO * 30EB KATAKANA LETTER RU * 3317 SQUARE KIROWATTO * 30AD KATAKANA LETTER KI * 30ED KATAKANA LETTER RO * 30EF KATAKANA LETTER WA * 30C3 KATAKANA LETTER SMALL TU * 30C8 KATAKANA LETTER TO * 3318 SQUARE GURAMU * 30B0 KATAKANA LETTER GU * 30E9 KATAKANA LETTER RA * 30E0 KATAKANA LETTER MU * 3319 SQUARE GURAMUTON * 30B0 KATAKANA LETTER GU * 30E9 KATAKANA LETTER RA * 30E0 KATAKANA LETTER MU * 30C8 KATAKANA LETTER TO * 30F3 KATAKANA LETTER N * 331A SQUARE KURUZEIRO * 30AF KATAKANA LETTER KU * 30EB KATAKANA LETTER RU * 30BC KATAKANA LETTER ZE * 30A4 KATAKANA LETTER I * 30ED KATAKANA LETTER RO * 331B SQUARE KUROONE * 30AF KATAKANA LETTER KU * 30ED KATAKANA LETTER RO * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30CD KATAKANA LETTER NE * 331C SQUARE KEESU * 30B1 KATAKANA LETTER KE * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30B9 KATAKANA LETTER SU * 331D SQUARE KORUNA * 30B3 KATAKANA LETTER KO * 30EB KATAKANA LETTER RU * 30CA KATAKANA LETTER NA * 331E SQUARE KOOPO * 30B3 KATAKANA LETTER KO * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30DD KATAKANA LETTER PO * 331F SQUARE SAIKURU * 30B5 KATAKANA LETTER SA * 30A4 KATAKANA LETTER I * 30AF KATAKANA LETTER KU * 30EB KATAKANA LETTER RU * 3320 SQUARE SANTIIMU * 30B5 KATAKANA LETTER SA * 30F3 KATAKANA LETTER N * 30C1 KATAKANA LETTER TI * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30E0 KATAKANA LETTER MU * 3321 SQUARE SIRINGU * 30B7 KATAKANA LETTER SI * 30EA KATAKANA LETTER RI * 30F3 KATAKANA LETTER N * 30B0 KATAKANA LETTER GU * 3322 SQUARE SENTI * 30BB KATAKANA LETTER SE * 30F3 KATAKANA LETTER N * 30C1 KATAKANA LETTER TI * 3323 SQUARE SENTO * 30BB KATAKANA LETTER SE * 30F3 KATAKANA LETTER N * 30C8 KATAKANA LETTER TO * 3324 SQUARE DAASU * 30C0 KATAKANA LETTER DA * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30B9 KATAKANA LETTER SU * 3325 SQUARE DESI * 30C7 KATAKANA LETTER DE * 30B7 KATAKANA LETTER SI * 3326 SQUARE DORU * 30C9 KATAKANA LETTER DO * 30EB KATAKANA LETTER RU * 3327 SQUARE TON * 30C8 KATAKANA LETTER TO * 30F3 KATAKANA LETTER N * 3328 SQUARE NANO * 30CA KATAKANA LETTER NA * 30CE KATAKANA LETTER NO * 3329 SQUARE NOTTO * 30CE KATAKANA LETTER NO * 30C3 KATAKANA LETTER SMALL TU * 30C8 KATAKANA LETTER TO * 332A SQUARE HAITU * 30CF KATAKANA LETTER HA * 30A4 KATAKANA LETTER I * 30C4 KATAKANA LETTER TU * 332B SQUARE PAASENTO * 30D1 KATAKANA LETTER PA * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30BB KATAKANA LETTER SE * 30F3 KATAKANA LETTER N * 30C8 KATAKANA LETTER TO * 332C SQUARE PAATU * 30D1 KATAKANA LETTER PA * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30C4 KATAKANA LETTER TU * 332D SQUARE BAARERU * 30D0 KATAKANA LETTER BA * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30EC KATAKANA LETTER RE * 30EB KATAKANA LETTER RU * 332E SQUARE PIASUTORU * 30D4 KATAKANA LETTER PI * 30A2 KATAKANA LETTER A * 30B9 KATAKANA LETTER SU * 30C8 KATAKANA LETTER TO * 30EB KATAKANA LETTER RU * 332F SQUARE PIKURU * 30D4 KATAKANA LETTER PI * 30AF KATAKANA LETTER KU * 30EB KATAKANA LETTER RU * 3330 SQUARE PIKO * 30D4 KATAKANA LETTER PI * 30B3 KATAKANA LETTER KO * 3331 SQUARE BIRU * 30D3 KATAKANA LETTER BI * 30EB KATAKANA LETTER RU * 3332 SQUARE HUARADDO * 30D5 KATAKANA LETTER HU * 30A1 KATAKANA LETTER SMALL A * 30E9 KATAKANA LETTER RA * 30C3 KATAKANA LETTER SMALL TU * 30C9 KATAKANA LETTER DO * 3333 SQUARE HUIITO * 30D5 KATAKANA LETTER HU * 30A3 KATAKANA LETTER SMALL I * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30C8 KATAKANA LETTER TO * 3334 SQUARE BUSSYERU * 30D6 KATAKANA LETTER BU * 30C3 KATAKANA LETTER SMALL TU * 30B7 KATAKANA LETTER SI * 30A7 KATAKANA LETTER SMALL E * 30EB KATAKANA LETTER RU * 3335 SQUARE HURAN * 30D5 KATAKANA LETTER HU * 30E9 KATAKANA LETTER RA * 30F3 KATAKANA LETTER N * 3336 SQUARE HEKUTAARU * 30D8 KATAKANA LETTER HE * 30AF KATAKANA LETTER KU * 30BF KATAKANA LETTER TA * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30EB KATAKANA LETTER RU * 3337 SQUARE PESO * 30DA KATAKANA LETTER PE * 30BD KATAKANA LETTER SO * 3338 SQUARE PENIHI * 30DA KATAKANA LETTER PE * 30CB KATAKANA LETTER NI * 30D2 KATAKANA LETTER HI * 3339 SQUARE HERUTU * 30D8 KATAKANA LETTER HE * 30EB KATAKANA LETTER RU * 30C4 KATAKANA LETTER TU * 333A SQUARE PENSU * 30DA KATAKANA LETTER PE * 30F3 KATAKANA LETTER N * 30B9 KATAKANA LETTER SU * 333B SQUARE PEEZI * 30DA KATAKANA LETTER PE * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30B8 KATAKANA LETTER ZI * 333C SQUARE BEETA * 30D9 KATAKANA LETTER BE * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30BF KATAKANA LETTER TA * 333D SQUARE POINTO * 30DD KATAKANA LETTER PO * 30A4 KATAKANA LETTER I * 30F3 KATAKANA LETTER N * 30C8 KATAKANA LETTER TO * 333E SQUARE BORUTO * 30DC KATAKANA LETTER BO * 30EB KATAKANA LETTER RU * 30C8 KATAKANA LETTER TO * 333F SQUARE HON * 30DB KATAKANA LETTER HO * 30F3 KATAKANA LETTER N * 3340 SQUARE PONDO * 30DD KATAKANA LETTER PO * 30F3 KATAKANA LETTER N * 30C9 KATAKANA LETTER DO * 3341 SQUARE HOORU * 30DB KATAKANA LETTER HO * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30EB KATAKANA LETTER RU * 3342 SQUARE HOON * 30DB KATAKANA LETTER HO * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30F3 KATAKANA LETTER N * 3343 SQUARE MAIKURO * 30DE KATAKANA LETTER MA * 30A4 KATAKANA LETTER I * 30AF KATAKANA LETTER KU * 30ED KATAKANA LETTER RO * 3344 SQUARE MAIRU * 30DE KATAKANA LETTER MA * 30A4 KATAKANA LETTER I * 30EB KATAKANA LETTER RU * 3345 SQUARE MAHHA * 30DE KATAKANA LETTER MA * 30C3 KATAKANA LETTER SMALL TU * 30CF KATAKANA LETTER HA * 3346 SQUARE MARUKU * 30DE KATAKANA LETTER MA * 30EB KATAKANA LETTER RU * 30AF KATAKANA LETTER KU * 3347 SQUARE MANSYON * 30DE KATAKANA LETTER MA * 30F3 KATAKANA LETTER N * 30B7 KATAKANA LETTER SI * 30E7 KATAKANA LETTER SMALL YO * 30F3 KATAKANA LETTER N * 3348 SQUARE MIKURON * 30DF KATAKANA LETTER MI * 30AF KATAKANA LETTER KU * 30ED KATAKANA LETTER RO * 30F3 KATAKANA LETTER N * 3349 SQUARE MIRI * 30DF KATAKANA LETTER MI * 30EA KATAKANA LETTER RI * 334A SQUARE MIRIBAARU * 30DF KATAKANA LETTER MI * 30EA KATAKANA LETTER RI * 30D0 KATAKANA LETTER BA * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30EB KATAKANA LETTER RU * 334B SQUARE MEGA * 30E1 KATAKANA LETTER ME * 30AC KATAKANA LETTER GA * 334C SQUARE MEGATON * 30E1 KATAKANA LETTER ME * 30AC KATAKANA LETTER GA * 30C8 KATAKANA LETTER TO * 30F3 KATAKANA LETTER N * 334D SQUARE MEETORU * 30E1 KATAKANA LETTER ME * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30C8 KATAKANA LETTER TO * 30EB KATAKANA LETTER RU * 334E SQUARE YAADO * 30E4 KATAKANA LETTER YA * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30C9 KATAKANA LETTER DO * 334F SQUARE YAARU * 30E4 KATAKANA LETTER YA * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30EB KATAKANA LETTER RU * 3350 SQUARE YUAN * 30E6 KATAKANA LETTER YU * 30A2 KATAKANA LETTER A * 30F3 KATAKANA LETTER N * 3351 SQUARE RITTORU * 30EA KATAKANA LETTER RI * 30C3 KATAKANA LETTER SMALL TU * 30C8 KATAKANA LETTER TO * 30EB KATAKANA LETTER RU * 3352 SQUARE RIRA * 30EA KATAKANA LETTER RI * 30E9 KATAKANA LETTER RA * 3353 SQUARE RUPII * 30EB KATAKANA LETTER RU * 30D4 KATAKANA LETTER PI * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 3354 SQUARE RUUBURU * 30EB KATAKANA LETTER RU * 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK * 30D6 KATAKANA LETTER BU * 30EB KATAKANA LETTER RU * 3355 SQUARE REMU * 30EC KATAKANA LETTER RE * 30E0 KATAKANA LETTER MU * 3356 SQUARE RENTOGEN * 30EC KATAKANA LETTER RE * 30F3 KATAKANA LETTER N * 30C8 KATAKANA LETTER TO * 30B2 KATAKANA LETTER GE * 30F3 KATAKANA LETTER N * 3357 SQUARE WATTO * 30EF KATAKANA LETTER WA * 30C3 KATAKANA LETTER SMALL TU * 30C8 KATAKANA LETTER TO * 3358 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO * 0030 DIGIT ZERO * 70B9 ?? * 3359 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE * 0031 DIGIT ONE * 70B9 ?? * 335A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO * 0032 DIGIT TWO * 70B9 ?? * 335B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE * 0033 DIGIT THREE * 70B9 ?? * 335C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR * 0034 DIGIT FOUR * 70B9 ?? * 335D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE * 0035 DIGIT FIVE * 70B9 ?? * 335E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX * 0036 DIGIT SIX * 70B9 ?? * 335F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN * 0037 DIGIT SEVEN * 70B9 ?? * 3360 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT * 0038 DIGIT EIGHT * 70B9 ?? * 3361 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE * 0039 DIGIT NINE * 70B9 ?? * 3362 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN * 0031 DIGIT ONE * 0030 DIGIT ZERO * 70B9 ?? * 3363 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN * 0031 DIGIT ONE * 0031 DIGIT ONE * 70B9 ?? * 3364 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE * 0031 DIGIT ONE * 0032 DIGIT TWO * 70B9 ?? * 3365 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN * 0031 DIGIT ONE * 0033 DIGIT THREE * 70B9 ?? * 3366 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN * 0031 DIGIT ONE * 0034 DIGIT FOUR * 70B9 ?? * 3367 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN * 0031 DIGIT ONE * 0035 DIGIT FIVE * 70B9 ?? * 3368 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN * 0031 DIGIT ONE * 0036 DIGIT SIX * 70B9 ?? * 3369 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN * 0031 DIGIT ONE * 0037 DIGIT SEVEN * 70B9 ?? * 336A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN * 0031 DIGIT ONE * 0038 DIGIT EIGHT * 70B9 ?? * 336B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN * 0031 DIGIT ONE * 0039 DIGIT NINE * 70B9 ?? * 336C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY * 0032 DIGIT TWO * 0030 DIGIT ZERO * 70B9 ?? * 336D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE * 0032 DIGIT TWO * 0031 DIGIT ONE * 70B9 ?? * 336E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO * 0032 DIGIT TWO * 0032 DIGIT TWO * 70B9 ?? * 336F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE * 0032 DIGIT TWO * 0033 DIGIT THREE * 70B9 ?? * 3370 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR * 0032 DIGIT TWO * 0034 DIGIT FOUR * 70B9 ?? * 3371 SQUARE HPA * 0068 LATIN SMALL LETTER H * 0050 LATIN CAPITAL LETTER P * 0061 LATIN SMALL LETTER A * 3372 SQUARE DA * 0064 LATIN SMALL LETTER D * 0061 LATIN SMALL LETTER A * 3373 SQUARE AU * 0041 LATIN CAPITAL LETTER A * 0055 LATIN CAPITAL LETTER U * 3374 SQUARE BAR * 0062 LATIN SMALL LETTER B * 0061 LATIN SMALL LETTER A * 0072 LATIN SMALL LETTER R * 3375 SQUARE OV * 006F LATIN SMALL LETTER O * 0056 LATIN CAPITAL LETTER V * 3376 SQUARE PC * 0070 LATIN SMALL LETTER P * 0063 LATIN SMALL LETTER C * 3377 SQUARE DM * 0064 LATIN SMALL LETTER D * 006D LATIN SMALL LETTER M * 3378 SQUARE DM SQUARED * 0064 LATIN SMALL LETTER D * 006D LATIN SMALL LETTER M * 0032 DIGIT TWO * 3379 SQUARE DM CUBED * 0064 LATIN SMALL LETTER D * 006D LATIN SMALL LETTER M * 0033 DIGIT THREE * 337A SQUARE IU * 0049 LATIN CAPITAL LETTER I * 0055 LATIN CAPITAL LETTER U * 337B SQUARE ERA NAME HEISEI * 5E73 ?? * 6210 ?? * 337C SQUARE ERA NAME SYOUWA * 662D ?? * 548C ?? * 337D SQUARE ERA NAME TAISYOU * 5927 ?? * 6B63 ?? * 337E SQUARE ERA NAME MEIZI * 660E ?? * 6CBB ?? * 337F SQUARE CORPORATION * 682A ?? * 5F0F ?? * 4F1A ?? * 793E ?? * 3380 SQUARE PA AMPS * 0070 LATIN SMALL LETTER P * 0041 LATIN CAPITAL LETTER A * 3381 SQUARE NA * 006E LATIN SMALL LETTER N * 0041 LATIN CAPITAL LETTER A * 3382 SQUARE MU A * 03BC GREEK SMALL LETTER MU * 0041 LATIN CAPITAL LETTER A * 3383 SQUARE MA * 006D LATIN SMALL LETTER M * 0041 LATIN CAPITAL LETTER A * 3384 SQUARE KA * 006B LATIN SMALL LETTER K * 0041 LATIN CAPITAL LETTER A * 3385 SQUARE KB * 004B LATIN CAPITAL LETTER K * 0042 LATIN CAPITAL LETTER B * 3386 SQUARE MB * 004D LATIN CAPITAL LETTER M * 0042 LATIN CAPITAL LETTER B * 3387 SQUARE GB * 0047 LATIN CAPITAL LETTER G * 0042 LATIN CAPITAL LETTER B * 3388 SQUARE CAL * 0063 LATIN SMALL LETTER C * 0061 LATIN SMALL LETTER A * 006C LATIN SMALL LETTER L * 3389 SQUARE KCAL * 006B LATIN SMALL LETTER K * 0063 LATIN SMALL LETTER C * 0061 LATIN SMALL LETTER A * 006C LATIN SMALL LETTER L * 338A SQUARE PF * 0070 LATIN SMALL LETTER P * 0046 LATIN CAPITAL LETTER F * 338B SQUARE NF * 006E LATIN SMALL LETTER N * 0046 LATIN CAPITAL LETTER F * 338C SQUARE MU F * 03BC GREEK SMALL LETTER MU * 0046 LATIN CAPITAL LETTER F * 338D SQUARE MU G * 03BC GREEK SMALL LETTER MU * 0067 LATIN SMALL LETTER G * 338E SQUARE MG * 006D LATIN SMALL LETTER M * 0067 LATIN SMALL LETTER G * 338F SQUARE KG * 006B LATIN SMALL LETTER K * 0067 LATIN SMALL LETTER G * 3390 SQUARE HZ * 0048 LATIN CAPITAL LETTER H * 007A LATIN SMALL LETTER Z * 3391 SQUARE KHZ * 006B LATIN SMALL LETTER K * 0048 LATIN CAPITAL LETTER H * 007A LATIN SMALL LETTER Z * 3392 SQUARE MHZ * 004D LATIN CAPITAL LETTER M * 0048 LATIN CAPITAL LETTER H * 007A LATIN SMALL LETTER Z * 3393 SQUARE GHZ * 0047 LATIN CAPITAL LETTER G * 0048 LATIN CAPITAL LETTER H * 007A LATIN SMALL LETTER Z * 3394 SQUARE THZ * 0054 LATIN CAPITAL LETTER T * 0048 LATIN CAPITAL LETTER H * 007A LATIN SMALL LETTER Z * 3395 SQUARE MU L * 03BC GREEK SMALL LETTER MU * 006C LATIN SMALL LETTER L * 3396 SQUARE ML * 006D LATIN SMALL LETTER M * 006C LATIN SMALL LETTER L * 3397 SQUARE DL * 0064 LATIN SMALL LETTER D * 006C LATIN SMALL LETTER L * 3398 SQUARE KL * 006B LATIN SMALL LETTER K * 006C LATIN SMALL LETTER L * 3399 SQUARE FM * 0066 LATIN SMALL LETTER F * 006D LATIN SMALL LETTER M * 339A SQUARE NM * 006E LATIN SMALL LETTER N * 006D LATIN SMALL LETTER M * 339B SQUARE MU M * 03BC GREEK SMALL LETTER MU * 006D LATIN SMALL LETTER M * 339C SQUARE MM * 006D LATIN SMALL LETTER M * 006D LATIN SMALL LETTER M * 339D SQUARE CM * 0063 LATIN SMALL LETTER C * 006D LATIN SMALL LETTER M * 339E SQUARE KM * 006B LATIN SMALL LETTER K * 006D LATIN SMALL LETTER M * 339F SQUARE MM SQUARED * 006D LATIN SMALL LETTER M * 006D LATIN SMALL LETTER M * 0032 DIGIT TWO * 33A0 SQUARE CM SQUARED * 0063 LATIN SMALL LETTER C * 006D LATIN SMALL LETTER M * 0032 DIGIT TWO * 33A1 SQUARE M SQUARED * 006D LATIN SMALL LETTER M * 0032 DIGIT TWO * 33A2 SQUARE KM SQUARED * 006B LATIN SMALL LETTER K * 006D LATIN SMALL LETTER M * 0032 DIGIT TWO * 33A3 SQUARE MM CUBED * 006D LATIN SMALL LETTER M * 006D LATIN SMALL LETTER M * 0033 DIGIT THREE * 33A4 SQUARE CM CUBED * 0063 LATIN SMALL LETTER C * 006D LATIN SMALL LETTER M * 0033 DIGIT THREE * 33A5 SQUARE M CUBED * 006D LATIN SMALL LETTER M * 0033 DIGIT THREE * 33A6 SQUARE KM CUBED * 006B LATIN SMALL LETTER K * 006D LATIN SMALL LETTER M * 0033 DIGIT THREE * 33A7 SQUARE M OVER S * 006D LATIN SMALL LETTER M * 2215 DIVISION SLASH * 0073 LATIN SMALL LETTER S * 33A8 SQUARE M OVER S SQUARED * 006D LATIN SMALL LETTER M * 2215 DIVISION SLASH * 0073 LATIN SMALL LETTER S * 0032 DIGIT TWO * 33A9 SQUARE PA * 0050 LATIN CAPITAL LETTER P * 0061 LATIN SMALL LETTER A * 33AA SQUARE KPA * 006B LATIN SMALL LETTER K * 0050 LATIN CAPITAL LETTER P * 0061 LATIN SMALL LETTER A * 33AB SQUARE MPA * 004D LATIN CAPITAL LETTER M * 0050 LATIN CAPITAL LETTER P * 0061 LATIN SMALL LETTER A * 33AC SQUARE GPA * 0047 LATIN CAPITAL LETTER G * 0050 LATIN CAPITAL LETTER P * 0061 LATIN SMALL LETTER A * 33AD SQUARE RAD * 0072 LATIN SMALL LETTER R * 0061 LATIN SMALL LETTER A * 0064 LATIN SMALL LETTER D * 33AE SQUARE RAD OVER S * 0072 LATIN SMALL LETTER R * 0061 LATIN SMALL LETTER A * 0064 LATIN SMALL LETTER D * 2215 DIVISION SLASH * 0073 LATIN SMALL LETTER S * 33AF SQUARE RAD OVER S SQUARED * 0072 LATIN SMALL LETTER R * 0061 LATIN SMALL LETTER A * 0064 LATIN SMALL LETTER D * 2215 DIVISION SLASH * 0073 LATIN SMALL LETTER S * 0032 DIGIT TWO * 33B0 SQUARE PS * 0070 LATIN SMALL LETTER P * 0073 LATIN SMALL LETTER S * 33B1 SQUARE NS * 006E LATIN SMALL LETTER N * 0073 LATIN SMALL LETTER S * 33B2 SQUARE MU S * 03BC GREEK SMALL LETTER MU * 0073 LATIN SMALL LETTER S * 33B3 SQUARE MS * 006D LATIN SMALL LETTER M * 0073 LATIN SMALL LETTER S * 33B4 SQUARE PV * 0070 LATIN SMALL LETTER P * 0056 LATIN CAPITAL LETTER V * 33B5 SQUARE NV * 006E LATIN SMALL LETTER N * 0056 LATIN CAPITAL LETTER V * 33B6 SQUARE MU V * 03BC GREEK SMALL LETTER MU * 0056 LATIN CAPITAL LETTER V * 33B7 SQUARE MV * 006D LATIN SMALL LETTER M * 0056 LATIN CAPITAL LETTER V * 33B8 SQUARE KV * 006B LATIN SMALL LETTER K * 0056 LATIN CAPITAL LETTER V * 33B9 SQUARE MV MEGA * 004D LATIN CAPITAL LETTER M * 0056 LATIN CAPITAL LETTER V * 33BA SQUARE PW * 0070 LATIN SMALL LETTER P * 0057 LATIN CAPITAL LETTER W * 33BB SQUARE NW * 006E LATIN SMALL LETTER N * 0057 LATIN CAPITAL LETTER W * 33BC SQUARE MU W * 03BC GREEK SMALL LETTER MU * 0057 LATIN CAPITAL LETTER W * 33BD SQUARE MW * 006D LATIN SMALL LETTER M * 0057 LATIN CAPITAL LETTER W * 33BE SQUARE KW * 006B LATIN SMALL LETTER K * 0057 LATIN CAPITAL LETTER W * 33BF SQUARE MW MEGA * 004D LATIN CAPITAL LETTER M * 0057 LATIN CAPITAL LETTER W * 33C0 SQUARE K OHM * 006B LATIN SMALL LETTER K * 03A9 GREEK CAPITAL LETTER OMEGA * 33C1 SQUARE M OHM * 004D LATIN CAPITAL LETTER M * 03A9 GREEK CAPITAL LETTER OMEGA * 33C2 SQUARE AM * 0061 LATIN SMALL LETTER A * 002E FULL STOP * 006D LATIN SMALL LETTER M * 002E FULL STOP * 33C3 SQUARE BQ * 0042 LATIN CAPITAL LETTER B * 0071 LATIN SMALL LETTER Q * 33C4 SQUARE CC * 0063 LATIN SMALL LETTER C * 0063 LATIN SMALL LETTER C * 33C5 SQUARE CD * 0063 LATIN SMALL LETTER C * 0064 LATIN SMALL LETTER D * 33C6 SQUARE C OVER KG * 0043 LATIN CAPITAL LETTER C * 2215 DIVISION SLASH * 006B LATIN SMALL LETTER K * 0067 LATIN SMALL LETTER G * 33C7 SQUARE CO * 0043 LATIN CAPITAL LETTER C * 006F LATIN SMALL LETTER O * 002E FULL STOP * 33C8 SQUARE DB * 0064 LATIN SMALL LETTER D * 0042 LATIN CAPITAL LETTER B * 33C9 SQUARE GY * 0047 LATIN CAPITAL LETTER G * 0079 LATIN SMALL LETTER Y * 33CA SQUARE HA * 0068 LATIN SMALL LETTER H * 0061 LATIN SMALL LETTER A * 33CB SQUARE HP * 0048 LATIN CAPITAL LETTER H * 0050 LATIN CAPITAL LETTER P * 33CC SQUARE IN * 0069 LATIN SMALL LETTER I * 006E LATIN SMALL LETTER N * 33CD SQUARE KK * 004B LATIN CAPITAL LETTER K * 004B LATIN CAPITAL LETTER K * 33CE SQUARE KM CAPITAL * 004B LATIN CAPITAL LETTER K * 004D LATIN CAPITAL LETTER M * 33CF SQUARE KT * 006B LATIN SMALL LETTER K * 0074 LATIN SMALL LETTER T * 33D0 SQUARE LM * 006C LATIN SMALL LETTER L * 006D LATIN SMALL LETTER M * 33D1 SQUARE LN * 006C LATIN SMALL LETTER L * 006E LATIN SMALL LETTER N * 33D2 SQUARE LOG * 006C LATIN SMALL LETTER L * 006F LATIN SMALL LETTER O * 0067 LATIN SMALL LETTER G * 33D3 SQUARE LX * 006C LATIN SMALL LETTER L * 0078 LATIN SMALL LETTER X * 33D4 SQUARE MB SMALL * 006D LATIN SMALL LETTER M * 0062 LATIN SMALL LETTER B * 33D5 SQUARE MIL * 006D LATIN SMALL LETTER M * 0069 LATIN SMALL LETTER I * 006C LATIN SMALL LETTER L * 33D6 SQUARE MOL * 006D LATIN SMALL LETTER M * 006F LATIN SMALL LETTER O * 006C LATIN SMALL LETTER L * 33D7 SQUARE PH * 0050 LATIN CAPITAL LETTER P * 0048 LATIN CAPITAL LETTER H * 33D8 SQUARE PM * 0070 LATIN SMALL LETTER P * 002E FULL STOP * 006D LATIN SMALL LETTER M * 002E FULL STOP * 33D9 SQUARE PPM * 0050 LATIN CAPITAL LETTER P * 0050 LATIN CAPITAL LETTER P * 004D LATIN CAPITAL LETTER M * 33DA SQUARE PR * 0050 LATIN CAPITAL LETTER P * 0052 LATIN CAPITAL LETTER R * 33DB SQUARE SR * 0073 LATIN SMALL LETTER S * 0072 LATIN SMALL LETTER R * 33DC SQUARE SV * 0053 LATIN CAPITAL LETTER S * 0076 LATIN SMALL LETTER V * 33DD SQUARE WB * 0057 LATIN CAPITAL LETTER W * 0062 LATIN SMALL LETTER B * 33DE SQUARE V OVER M * 0056 LATIN CAPITAL LETTER V * 2215 DIVISION SLASH * 006D LATIN SMALL LETTER M * 33DF SQUARE A OVER M * 0041 LATIN CAPITAL LETTER A * 2215 DIVISION SLASH * 006D LATIN SMALL LETTER M * 33E0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE * 0031 DIGIT ONE * 65E5 ?? * 33E1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO * 0032 DIGIT TWO * 65E5 ?? * 33E2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE * 0033 DIGIT THREE * 65E5 ?? * 33E3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR * 0034 DIGIT FOUR * 65E5 ?? * 33E4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE * 0035 DIGIT FIVE * 65E5 ?? * 33E5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX * 0036 DIGIT SIX * 65E5 ?? * 33E6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN * 0037 DIGIT SEVEN * 65E5 ?? * 33E7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT * 0038 DIGIT EIGHT * 65E5 ?? * 33E8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE * 0039 DIGIT NINE * 65E5 ?? * 33E9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN * 0031 DIGIT ONE * 0030 DIGIT ZERO * 65E5 ?? * 33EA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN * 0031 DIGIT ONE * 0031 DIGIT ONE * 65E5 ?? * 33EB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE * 0031 DIGIT ONE * 0032 DIGIT TWO * 65E5 ?? * 33EC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN * 0031 DIGIT ONE * 0033 DIGIT THREE * 65E5 ?? * 33ED IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN * 0031 DIGIT ONE * 0034 DIGIT FOUR * 65E5 ?? * 33EE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN * 0031 DIGIT ONE * 0035 DIGIT FIVE * 65E5 ?? * 33EF IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN * 0031 DIGIT ONE * 0036 DIGIT SIX * 65E5 ?? * 33F0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN * 0031 DIGIT ONE * 0037 DIGIT SEVEN * 65E5 ?? * 33F1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN * 0031 DIGIT ONE * 0038 DIGIT EIGHT * 65E5 ?? * 33F2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN * 0031 DIGIT ONE * 0039 DIGIT NINE * 65E5 ?? * 33F3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY * 0032 DIGIT TWO * 0030 DIGIT ZERO * 65E5 ?? * 33F4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE * 0032 DIGIT TWO * 0031 DIGIT ONE * 65E5 ?? * 33F5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO * 0032 DIGIT TWO * 0032 DIGIT TWO * 65E5 ?? * 33F6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE * 0032 DIGIT TWO * 0033 DIGIT THREE * 65E5 ?? * 33F7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR * 0032 DIGIT TWO * 0034 DIGIT FOUR * 65E5 ?? * 33F8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE * 0032 DIGIT TWO * 0035 DIGIT FIVE * 65E5 ?? * 33F9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX * 0032 DIGIT TWO * 0036 DIGIT SIX * 65E5 ?? * 33FA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN * 0032 DIGIT TWO * 0037 DIGIT SEVEN * 65E5 ?? * 33FB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT * 0032 DIGIT TWO * 0038 DIGIT EIGHT * 65E5 ?? * 33FC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE * 0032 DIGIT TWO * 0039 DIGIT NINE * 65E5 ?? * 33FD IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY * 0033 DIGIT THREE * 0030 DIGIT ZERO * 65E5 ?? * 33FE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE * 0033 DIGIT THREE * 0031 DIGIT ONE * 65E5 ?? * 33FF SQUARE GAL * 0067 LATIN SMALL LETTER G * 0061 LATIN SMALL LETTER A * 006C LATIN SMALL LETTER L * A66F COMBINING CYRILLIC VZMET * 0000 * A670 COMBINING CYRILLIC TEN MILLIONS SIGN * 0000 * A671 COMBINING CYRILLIC HUNDRED MILLIONS SIGN * 0000 * A672 COMBINING CYRILLIC THOUSAND MILLIONS SIGN * 0000 * A67C COMBINING CYRILLIC KAVYKA * 0000 * A67D COMBINING CYRILLIC PAYEROK * 0000 * A770 MODIFIER LETTER US * A76F LATIN SMALL LETTER CON * A802 SYLOTI NAGRI SIGN DVISVARA * 0000 * A806 SYLOTI NAGRI SIGN HASANTA * 0000 * A80B SYLOTI NAGRI SIGN ANUSVARA * 0000 * A823 SYLOTI NAGRI VOWEL SIGN A * 0000 * A824 SYLOTI NAGRI VOWEL SIGN I * 0000 * A825 SYLOTI NAGRI VOWEL SIGN U * 0000 * A826 SYLOTI NAGRI VOWEL SIGN E * 0000 * A827 SYLOTI NAGRI VOWEL SIGN OO * 0000 * A880 SAURASHTRA SIGN ANUSVARA * 0000 * A881 SAURASHTRA SIGN VISARGA * 0000 * A8B4 SAURASHTRA CONSONANT SIGN HAARU * 0000 * A8B5 SAURASHTRA VOWEL SIGN AA * 0000 * A8B6 SAURASHTRA VOWEL SIGN I * 0000 * A8B7 SAURASHTRA VOWEL SIGN II * 0000 * A8B8 SAURASHTRA VOWEL SIGN U * 0000 * A8B9 SAURASHTRA VOWEL SIGN UU * 0000 * A8BA SAURASHTRA VOWEL SIGN VOCALIC R * 0000 * A8BB SAURASHTRA VOWEL SIGN VOCALIC RR * 0000 * A8BC SAURASHTRA VOWEL SIGN VOCALIC L * 0000 * A8BD SAURASHTRA VOWEL SIGN VOCALIC LL * 0000 * A8BE SAURASHTRA VOWEL SIGN E * 0000 * A8BF SAURASHTRA VOWEL SIGN EE * 0000 * A8C0 SAURASHTRA VOWEL SIGN AI * 0000 * A8C1 SAURASHTRA VOWEL SIGN O * 0000 * A8C2 SAURASHTRA VOWEL SIGN OO * 0000 * A8C3 SAURASHTRA VOWEL SIGN AU * 0000 * A8C4 SAURASHTRA SIGN VIRAMA * 0000 * A926 KAYAH LI VOWEL UE * 0000 * A927 KAYAH LI VOWEL E * 0000 * A928 KAYAH LI VOWEL U * 0000 * A929 KAYAH LI VOWEL EE * 0000 * A92A KAYAH LI VOWEL O * 0000 * A92B KAYAH LI TONE PLOPHU * 0000 * A92C KAYAH LI TONE CALYA * 0000 * A92D KAYAH LI TONE CALYA PLOPHU * 0000 * A947 REJANG VOWEL SIGN I * 0000 * A948 REJANG VOWEL SIGN U * 0000 * A949 REJANG VOWEL SIGN E * 0000 * A94A REJANG VOWEL SIGN AI * 0000 * A94B REJANG VOWEL SIGN O * 0000 * A94C REJANG VOWEL SIGN AU * 0000 * A94D REJANG VOWEL SIGN EU * 0000 * A94E REJANG VOWEL SIGN EA * 0000 * A94F REJANG CONSONANT SIGN NG * 0000 * A950 REJANG CONSONANT SIGN N * 0000 * A951 REJANG CONSONANT SIGN R * 0000 * A952 REJANG CONSONANT SIGN H * 0000 * A953 REJANG VIRAMA * 0000 * AA29 CHAM VOWEL SIGN AA * 0000 * AA2A CHAM VOWEL SIGN I * 0000 * AA2B CHAM VOWEL SIGN II * 0000 * AA2C CHAM VOWEL SIGN EI * 0000 * AA2D CHAM VOWEL SIGN U * 0000 * AA2E CHAM VOWEL SIGN OE * 0000 * AA2F CHAM VOWEL SIGN O * 0000 * AA30 CHAM VOWEL SIGN AI * 0000 * AA31 CHAM VOWEL SIGN AU * 0000 * AA32 CHAM VOWEL SIGN UE * 0000 * AA33 CHAM CONSONANT SIGN YA * 0000 * AA34 CHAM CONSONANT SIGN RA * 0000 * AA35 CHAM CONSONANT SIGN LA * 0000 * AA36 CHAM CONSONANT SIGN WA * 0000 * AA43 CHAM CONSONANT SIGN FINAL NG * 0000 * AA4C CHAM CONSONANT SIGN FINAL M * 0000 * AA4D CHAM CONSONANT SIGN FINAL H * 0000 * F900 CJK COMPATIBILITY IDEOGRAPH-F900 * 8C48 ?? * F901 CJK COMPATIBILITY IDEOGRAPH-F901 * 66F4 ?? * F902 CJK COMPATIBILITY IDEOGRAPH-F902 * 8ECA ?? * F903 CJK COMPATIBILITY IDEOGRAPH-F903 * 8CC8 ?? * F904 CJK COMPATIBILITY IDEOGRAPH-F904 * 6ED1 ?? * F905 CJK COMPATIBILITY IDEOGRAPH-F905 * 4E32 ?? * F906 CJK COMPATIBILITY IDEOGRAPH-F906 * 53E5 ?? * F907 CJK COMPATIBILITY IDEOGRAPH-F907 * 9F9C ?? * F908 CJK COMPATIBILITY IDEOGRAPH-F908 * 9F9C ?? * F909 CJK COMPATIBILITY IDEOGRAPH-F909 * 5951 ?? * F90A CJK COMPATIBILITY IDEOGRAPH-F90A * 91D1 ?? * F90B CJK COMPATIBILITY IDEOGRAPH-F90B * 5587 ?? * F90C CJK COMPATIBILITY IDEOGRAPH-F90C * 5948 ?? * F90D CJK COMPATIBILITY IDEOGRAPH-F90D * 61F6 ?? * F90E CJK COMPATIBILITY IDEOGRAPH-F90E * 7669 ?? * F90F CJK COMPATIBILITY IDEOGRAPH-F90F * 7F85 ?? * F910 CJK COMPATIBILITY IDEOGRAPH-F910 * 863F ?? * F911 CJK COMPATIBILITY IDEOGRAPH-F911 * 87BA ?? * F912 CJK COMPATIBILITY IDEOGRAPH-F912 * 88F8 ?? * F913 CJK COMPATIBILITY IDEOGRAPH-F913 * 908F ?? * F914 CJK COMPATIBILITY IDEOGRAPH-F914 * 6A02 ?? * F915 CJK COMPATIBILITY IDEOGRAPH-F915 * 6D1B ?? * F916 CJK COMPATIBILITY IDEOGRAPH-F916 * 70D9 ?? * F917 CJK COMPATIBILITY IDEOGRAPH-F917 * 73DE ?? * F918 CJK COMPATIBILITY IDEOGRAPH-F918 * 843D ?? * F919 CJK COMPATIBILITY IDEOGRAPH-F919 * 916A ?? * F91A CJK COMPATIBILITY IDEOGRAPH-F91A * 99F1 ?? * F91B CJK COMPATIBILITY IDEOGRAPH-F91B * 4E82 ?? * F91C CJK COMPATIBILITY IDEOGRAPH-F91C * 5375 ?? * F91D CJK COMPATIBILITY IDEOGRAPH-F91D * 6B04 ?? * F91E CJK COMPATIBILITY IDEOGRAPH-F91E * 721B ?? * F91F CJK COMPATIBILITY IDEOGRAPH-F91F * 862D ?? * F920 CJK COMPATIBILITY IDEOGRAPH-F920 * 9E1E ?? * F921 CJK COMPATIBILITY IDEOGRAPH-F921 * 5D50 ?? * F922 CJK COMPATIBILITY IDEOGRAPH-F922 * 6FEB ?? * F923 CJK COMPATIBILITY IDEOGRAPH-F923 * 85CD ?? * F924 CJK COMPATIBILITY IDEOGRAPH-F924 * 8964 ?? * F925 CJK COMPATIBILITY IDEOGRAPH-F925 * 62C9 ?? * F926 CJK COMPATIBILITY IDEOGRAPH-F926 * 81D8 ?? * F927 CJK COMPATIBILITY IDEOGRAPH-F927 * 881F ?? * F928 CJK COMPATIBILITY IDEOGRAPH-F928 * 5ECA ?? * F929 CJK COMPATIBILITY IDEOGRAPH-F929 * 6717 ?? * F92A CJK COMPATIBILITY IDEOGRAPH-F92A * 6D6A ?? * F92B CJK COMPATIBILITY IDEOGRAPH-F92B * 72FC ?? * F92C CJK COMPATIBILITY IDEOGRAPH-F92C * 90CE ?? * F92D CJK COMPATIBILITY IDEOGRAPH-F92D * 4F86 ?? * F92E CJK COMPATIBILITY IDEOGRAPH-F92E * 51B7 ?? * F92F CJK COMPATIBILITY IDEOGRAPH-F92F * 52DE ?? * F930 CJK COMPATIBILITY IDEOGRAPH-F930 * 64C4 ?? * F931 CJK COMPATIBILITY IDEOGRAPH-F931 * 6AD3 ?? * F932 CJK COMPATIBILITY IDEOGRAPH-F932 * 7210 ?? * F933 CJK COMPATIBILITY IDEOGRAPH-F933 * 76E7 ?? * F934 CJK COMPATIBILITY IDEOGRAPH-F934 * 8001 ?? * F935 CJK COMPATIBILITY IDEOGRAPH-F935 * 8606 ?? * F936 CJK COMPATIBILITY IDEOGRAPH-F936 * 865C ?? * F937 CJK COMPATIBILITY IDEOGRAPH-F937 * 8DEF ?? * F938 CJK COMPATIBILITY IDEOGRAPH-F938 * 9732 ?? * F939 CJK COMPATIBILITY IDEOGRAPH-F939 * 9B6F ?? * F93A CJK COMPATIBILITY IDEOGRAPH-F93A * 9DFA ?? * F93B CJK COMPATIBILITY IDEOGRAPH-F93B * 788C ?? * F93C CJK COMPATIBILITY IDEOGRAPH-F93C * 797F ?? * F93D CJK COMPATIBILITY IDEOGRAPH-F93D * 7DA0 ?? * F93E CJK COMPATIBILITY IDEOGRAPH-F93E * 83C9 ?? * F93F CJK COMPATIBILITY IDEOGRAPH-F93F * 9304 ?? * F940 CJK COMPATIBILITY IDEOGRAPH-F940 * 9E7F ?? * F941 CJK COMPATIBILITY IDEOGRAPH-F941 * 8AD6 ?? * F942 CJK COMPATIBILITY IDEOGRAPH-F942 * 58DF ?? * F943 CJK COMPATIBILITY IDEOGRAPH-F943 * 5F04 ?? * F944 CJK COMPATIBILITY IDEOGRAPH-F944 * 7C60 ?? * F945 CJK COMPATIBILITY IDEOGRAPH-F945 * 807E ?? * F946 CJK COMPATIBILITY IDEOGRAPH-F946 * 7262 ?? * F947 CJK COMPATIBILITY IDEOGRAPH-F947 * 78CA ?? * F948 CJK COMPATIBILITY IDEOGRAPH-F948 * 8CC2 ?? * F949 CJK COMPATIBILITY IDEOGRAPH-F949 * 96F7 ?? * F94A CJK COMPATIBILITY IDEOGRAPH-F94A * 58D8 ?? * F94B CJK COMPATIBILITY IDEOGRAPH-F94B * 5C62 ?? * F94C CJK COMPATIBILITY IDEOGRAPH-F94C * 6A13 ?? * F94D CJK COMPATIBILITY IDEOGRAPH-F94D * 6DDA ?? * F94E CJK COMPATIBILITY IDEOGRAPH-F94E * 6F0F ?? * F94F CJK COMPATIBILITY IDEOGRAPH-F94F * 7D2F ?? * F950 CJK COMPATIBILITY IDEOGRAPH-F950 * 7E37 ?? * F951 CJK COMPATIBILITY IDEOGRAPH-F951 * 964B ?? * F952 CJK COMPATIBILITY IDEOGRAPH-F952 * 52D2 ?? * F953 CJK COMPATIBILITY IDEOGRAPH-F953 * 808B ?? * F954 CJK COMPATIBILITY IDEOGRAPH-F954 * 51DC ?? * F955 CJK COMPATIBILITY IDEOGRAPH-F955 * 51CC ?? * F956 CJK COMPATIBILITY IDEOGRAPH-F956 * 7A1C ?? * F957 CJK COMPATIBILITY IDEOGRAPH-F957 * 7DBE ?? * F958 CJK COMPATIBILITY IDEOGRAPH-F958 * 83F1 ?? * F959 CJK COMPATIBILITY IDEOGRAPH-F959 * 9675 ?? * F95A CJK COMPATIBILITY IDEOGRAPH-F95A * 8B80 ?? * F95B CJK COMPATIBILITY IDEOGRAPH-F95B * 62CF ?? * F95C CJK COMPATIBILITY IDEOGRAPH-F95C * 6A02 ?? * F95D CJK COMPATIBILITY IDEOGRAPH-F95D * 8AFE ?? * F95E CJK COMPATIBILITY IDEOGRAPH-F95E * 4E39 ?? * F95F CJK COMPATIBILITY IDEOGRAPH-F95F * 5BE7 ?? * F960 CJK COMPATIBILITY IDEOGRAPH-F960 * 6012 ?? * F961 CJK COMPATIBILITY IDEOGRAPH-F961 * 7387 ?? * F962 CJK COMPATIBILITY IDEOGRAPH-F962 * 7570 ?? * F963 CJK COMPATIBILITY IDEOGRAPH-F963 * 5317 ?? * F964 CJK COMPATIBILITY IDEOGRAPH-F964 * 78FB ?? * F965 CJK COMPATIBILITY IDEOGRAPH-F965 * 4FBF ?? * F966 CJK COMPATIBILITY IDEOGRAPH-F966 * 5FA9 ?? * F967 CJK COMPATIBILITY IDEOGRAPH-F967 * 4E0D ?? * F968 CJK COMPATIBILITY IDEOGRAPH-F968 * 6CCC ?? * F969 CJK COMPATIBILITY IDEOGRAPH-F969 * 6578 ?? * F96A CJK COMPATIBILITY IDEOGRAPH-F96A * 7D22 ?? * F96B CJK COMPATIBILITY IDEOGRAPH-F96B * 53C3 ?? * F96C CJK COMPATIBILITY IDEOGRAPH-F96C * 585E ?? * F96D CJK COMPATIBILITY IDEOGRAPH-F96D * 7701 ?? * F96E CJK COMPATIBILITY IDEOGRAPH-F96E * 8449 ?? * F96F CJK COMPATIBILITY IDEOGRAPH-F96F * 8AAA ?? * F970 CJK COMPATIBILITY IDEOGRAPH-F970 * 6BBA ?? * F971 CJK COMPATIBILITY IDEOGRAPH-F971 * 8FB0 ?? * F972 CJK COMPATIBILITY IDEOGRAPH-F972 * 6C88 ?? * F973 CJK COMPATIBILITY IDEOGRAPH-F973 * 62FE ?? * F974 CJK COMPATIBILITY IDEOGRAPH-F974 * 82E5 ?? * F975 CJK COMPATIBILITY IDEOGRAPH-F975 * 63A0 ?? * F976 CJK COMPATIBILITY IDEOGRAPH-F976 * 7565 ?? * F977 CJK COMPATIBILITY IDEOGRAPH-F977 * 4EAE ?? * F978 CJK COMPATIBILITY IDEOGRAPH-F978 * 5169 ?? * F979 CJK COMPATIBILITY IDEOGRAPH-F979 * 51C9 ?? * F97A CJK COMPATIBILITY IDEOGRAPH-F97A * 6881 ?? * F97B CJK COMPATIBILITY IDEOGRAPH-F97B * 7CE7 ?? * F97C CJK COMPATIBILITY IDEOGRAPH-F97C * 826F ?? * F97D CJK COMPATIBILITY IDEOGRAPH-F97D * 8AD2 ?? * F97E CJK COMPATIBILITY IDEOGRAPH-F97E * 91CF ?? * F97F CJK COMPATIBILITY IDEOGRAPH-F97F * 52F5 ?? * F980 CJK COMPATIBILITY IDEOGRAPH-F980 * 5442 ?? * F981 CJK COMPATIBILITY IDEOGRAPH-F981 * 5973 ?? * F982 CJK COMPATIBILITY IDEOGRAPH-F982 * 5EEC ?? * F983 CJK COMPATIBILITY IDEOGRAPH-F983 * 65C5 ?? * F984 CJK COMPATIBILITY IDEOGRAPH-F984 * 6FFE ?? * F985 CJK COMPATIBILITY IDEOGRAPH-F985 * 792A ?? * F986 CJK COMPATIBILITY IDEOGRAPH-F986 * 95AD ?? * F987 CJK COMPATIBILITY IDEOGRAPH-F987 * 9A6A ?? * F988 CJK COMPATIBILITY IDEOGRAPH-F988 * 9E97 ?? * F989 CJK COMPATIBILITY IDEOGRAPH-F989 * 9ECE ?? * F98A CJK COMPATIBILITY IDEOGRAPH-F98A * 529B ?? * F98B CJK COMPATIBILITY IDEOGRAPH-F98B * 66C6 ?? * F98C CJK COMPATIBILITY IDEOGRAPH-F98C * 6B77 ?? * F98D CJK COMPATIBILITY IDEOGRAPH-F98D * 8F62 ?? * F98E CJK COMPATIBILITY IDEOGRAPH-F98E * 5E74 ?? * F98F CJK COMPATIBILITY IDEOGRAPH-F98F * 6190 ?? * F990 CJK COMPATIBILITY IDEOGRAPH-F990 * 6200 ?? * F991 CJK COMPATIBILITY IDEOGRAPH-F991 * 649A ?? * F992 CJK COMPATIBILITY IDEOGRAPH-F992 * 6F23 ?? * F993 CJK COMPATIBILITY IDEOGRAPH-F993 * 7149 ?? * F994 CJK COMPATIBILITY IDEOGRAPH-F994 * 7489 ?? * F995 CJK COMPATIBILITY IDEOGRAPH-F995 * 79CA ?? * F996 CJK COMPATIBILITY IDEOGRAPH-F996 * 7DF4 ?? * F997 CJK COMPATIBILITY IDEOGRAPH-F997 * 806F ?? * F998 CJK COMPATIBILITY IDEOGRAPH-F998 * 8F26 ?? * F999 CJK COMPATIBILITY IDEOGRAPH-F999 * 84EE ?? * F99A CJK COMPATIBILITY IDEOGRAPH-F99A * 9023 ?? * F99B CJK COMPATIBILITY IDEOGRAPH-F99B * 934A ?? * F99C CJK COMPATIBILITY IDEOGRAPH-F99C * 5217 ?? * F99D CJK COMPATIBILITY IDEOGRAPH-F99D * 52A3 ?? * F99E CJK COMPATIBILITY IDEOGRAPH-F99E * 54BD ?? * F99F CJK COMPATIBILITY IDEOGRAPH-F99F * 70C8 ?? * F9A0 CJK COMPATIBILITY IDEOGRAPH-F9A0 * 88C2 ?? * F9A1 CJK COMPATIBILITY IDEOGRAPH-F9A1 * 8AAA ?? * F9A2 CJK COMPATIBILITY IDEOGRAPH-F9A2 * 5EC9 ?? * F9A3 CJK COMPATIBILITY IDEOGRAPH-F9A3 * 5FF5 ?? * F9A4 CJK COMPATIBILITY IDEOGRAPH-F9A4 * 637B ?? * F9A5 CJK COMPATIBILITY IDEOGRAPH-F9A5 * 6BAE ?? * F9A6 CJK COMPATIBILITY IDEOGRAPH-F9A6 * 7C3E ?? * F9A7 CJK COMPATIBILITY IDEOGRAPH-F9A7 * 7375 ?? * F9A8 CJK COMPATIBILITY IDEOGRAPH-F9A8 * 4EE4 ?? * F9A9 CJK COMPATIBILITY IDEOGRAPH-F9A9 * 56F9 ?? * F9AA CJK COMPATIBILITY IDEOGRAPH-F9AA * 5BE7 ?? * F9AB CJK COMPATIBILITY IDEOGRAPH-F9AB * 5DBA ?? * F9AC CJK COMPATIBILITY IDEOGRAPH-F9AC * 601C ?? * F9AD CJK COMPATIBILITY IDEOGRAPH-F9AD * 73B2 ?? * F9AE CJK COMPATIBILITY IDEOGRAPH-F9AE * 7469 ?? * F9AF CJK COMPATIBILITY IDEOGRAPH-F9AF * 7F9A ?? * F9B0 CJK COMPATIBILITY IDEOGRAPH-F9B0 * 8046 ?? * F9B1 CJK COMPATIBILITY IDEOGRAPH-F9B1 * 9234 ?? * F9B2 CJK COMPATIBILITY IDEOGRAPH-F9B2 * 96F6 ?? * F9B3 CJK COMPATIBILITY IDEOGRAPH-F9B3 * 9748 ?? * F9B4 CJK COMPATIBILITY IDEOGRAPH-F9B4 * 9818 ?? * F9B5 CJK COMPATIBILITY IDEOGRAPH-F9B5 * 4F8B ?? * F9B6 CJK COMPATIBILITY IDEOGRAPH-F9B6 * 79AE ?? * F9B7 CJK COMPATIBILITY IDEOGRAPH-F9B7 * 91B4 ?? * F9B8 CJK COMPATIBILITY IDEOGRAPH-F9B8 * 96B8 ?? * F9B9 CJK COMPATIBILITY IDEOGRAPH-F9B9 * 60E1 ?? * F9BA CJK COMPATIBILITY IDEOGRAPH-F9BA * 4E86 ?? * F9BB CJK COMPATIBILITY IDEOGRAPH-F9BB * 50DA ?? * F9BC CJK COMPATIBILITY IDEOGRAPH-F9BC * 5BEE ?? * F9BD CJK COMPATIBILITY IDEOGRAPH-F9BD * 5C3F ?? * F9BE CJK COMPATIBILITY IDEOGRAPH-F9BE * 6599 ?? * F9BF CJK COMPATIBILITY IDEOGRAPH-F9BF * 6A02 ?? * F9C0 CJK COMPATIBILITY IDEOGRAPH-F9C0 * 71CE ?? * F9C1 CJK COMPATIBILITY IDEOGRAPH-F9C1 * 7642 ?? * F9C2 CJK COMPATIBILITY IDEOGRAPH-F9C2 * 84FC ?? * F9C3 CJK COMPATIBILITY IDEOGRAPH-F9C3 * 907C ?? * F9C4 CJK COMPATIBILITY IDEOGRAPH-F9C4 * 9F8D ?? * F9C5 CJK COMPATIBILITY IDEOGRAPH-F9C5 * 6688 ?? * F9C6 CJK COMPATIBILITY IDEOGRAPH-F9C6 * 962E ?? * F9C7 CJK COMPATIBILITY IDEOGRAPH-F9C7 * 5289 ?? * F9C8 CJK COMPATIBILITY IDEOGRAPH-F9C8 * 677B ?? * F9C9 CJK COMPATIBILITY IDEOGRAPH-F9C9 * 67F3 ?? * F9CA CJK COMPATIBILITY IDEOGRAPH-F9CA * 6D41 ?? * F9CB CJK COMPATIBILITY IDEOGRAPH-F9CB * 6E9C ?? * F9CC CJK COMPATIBILITY IDEOGRAPH-F9CC * 7409 ?? * F9CD CJK COMPATIBILITY IDEOGRAPH-F9CD * 7559 ?? * F9CE CJK COMPATIBILITY IDEOGRAPH-F9CE * 786B ?? * F9CF CJK COMPATIBILITY IDEOGRAPH-F9CF * 7D10 ?? * F9D0 CJK COMPATIBILITY IDEOGRAPH-F9D0 * 985E ?? * F9D1 CJK COMPATIBILITY IDEOGRAPH-F9D1 * 516D ?? * F9D2 CJK COMPATIBILITY IDEOGRAPH-F9D2 * 622E ?? * F9D3 CJK COMPATIBILITY IDEOGRAPH-F9D3 * 9678 ?? * F9D4 CJK COMPATIBILITY IDEOGRAPH-F9D4 * 502B ?? * F9D5 CJK COMPATIBILITY IDEOGRAPH-F9D5 * 5D19 ?? * F9D6 CJK COMPATIBILITY IDEOGRAPH-F9D6 * 6DEA ?? * F9D7 CJK COMPATIBILITY IDEOGRAPH-F9D7 * 8F2A ?? * F9D8 CJK COMPATIBILITY IDEOGRAPH-F9D8 * 5F8B ?? * F9D9 CJK COMPATIBILITY IDEOGRAPH-F9D9 * 6144 ?? * F9DA CJK COMPATIBILITY IDEOGRAPH-F9DA * 6817 ?? * F9DB CJK COMPATIBILITY IDEOGRAPH-F9DB * 7387 ?? * F9DC CJK COMPATIBILITY IDEOGRAPH-F9DC * 9686 ?? * F9DD CJK COMPATIBILITY IDEOGRAPH-F9DD * 5229 ?? * F9DE CJK COMPATIBILITY IDEOGRAPH-F9DE * 540F ?? * F9DF CJK COMPATIBILITY IDEOGRAPH-F9DF * 5C65 ?? * F9E0 CJK COMPATIBILITY IDEOGRAPH-F9E0 * 6613 ?? * F9E1 CJK COMPATIBILITY IDEOGRAPH-F9E1 * 674E ?? * F9E2 CJK COMPATIBILITY IDEOGRAPH-F9E2 * 68A8 ?? * F9E3 CJK COMPATIBILITY IDEOGRAPH-F9E3 * 6CE5 ?? * F9E4 CJK COMPATIBILITY IDEOGRAPH-F9E4 * 7406 ?? * F9E5 CJK COMPATIBILITY IDEOGRAPH-F9E5 * 75E2 ?? * F9E6 CJK COMPATIBILITY IDEOGRAPH-F9E6 * 7F79 ?? * F9E7 CJK COMPATIBILITY IDEOGRAPH-F9E7 * 88CF ?? * F9E8 CJK COMPATIBILITY IDEOGRAPH-F9E8 * 88E1 ?? * F9E9 CJK COMPATIBILITY IDEOGRAPH-F9E9 * 91CC ?? * F9EA CJK COMPATIBILITY IDEOGRAPH-F9EA * 96E2 ?? * F9EB CJK COMPATIBILITY IDEOGRAPH-F9EB * 533F ?? * F9EC CJK COMPATIBILITY IDEOGRAPH-F9EC * 6EBA ?? * F9ED CJK COMPATIBILITY IDEOGRAPH-F9ED * 541D ?? * F9EE CJK COMPATIBILITY IDEOGRAPH-F9EE * 71D0 ?? * F9EF CJK COMPATIBILITY IDEOGRAPH-F9EF * 7498 ?? * F9F0 CJK COMPATIBILITY IDEOGRAPH-F9F0 * 85FA ?? * F9F1 CJK COMPATIBILITY IDEOGRAPH-F9F1 * 96A3 ?? * F9F2 CJK COMPATIBILITY IDEOGRAPH-F9F2 * 9C57 ?? * F9F3 CJK COMPATIBILITY IDEOGRAPH-F9F3 * 9E9F ?? * F9F4 CJK COMPATIBILITY IDEOGRAPH-F9F4 * 6797 ?? * F9F5 CJK COMPATIBILITY IDEOGRAPH-F9F5 * 6DCB ?? * F9F6 CJK COMPATIBILITY IDEOGRAPH-F9F6 * 81E8 ?? * F9F7 CJK COMPATIBILITY IDEOGRAPH-F9F7 * 7ACB ?? * F9F8 CJK COMPATIBILITY IDEOGRAPH-F9F8 * 7B20 ?? * F9F9 CJK COMPATIBILITY IDEOGRAPH-F9F9 * 7C92 ?? * F9FA CJK COMPATIBILITY IDEOGRAPH-F9FA * 72C0 ?? * F9FB CJK COMPATIBILITY IDEOGRAPH-F9FB * 7099 ?? * F9FC CJK COMPATIBILITY IDEOGRAPH-F9FC * 8B58 ?? * F9FD CJK COMPATIBILITY IDEOGRAPH-F9FD * 4EC0 ?? * F9FE CJK COMPATIBILITY IDEOGRAPH-F9FE * 8336 ?? * F9FF CJK COMPATIBILITY IDEOGRAPH-F9FF * 523A ?? * FA00 CJK COMPATIBILITY IDEOGRAPH-FA00 * 5207 ?? * FA01 CJK COMPATIBILITY IDEOGRAPH-FA01 * 5EA6 ?? * FA02 CJK COMPATIBILITY IDEOGRAPH-FA02 * 62D3 ?? * FA03 CJK COMPATIBILITY IDEOGRAPH-FA03 * 7CD6 ?? * FA04 CJK COMPATIBILITY IDEOGRAPH-FA04 * 5B85 ?? * FA05 CJK COMPATIBILITY IDEOGRAPH-FA05 * 6D1E ?? * FA06 CJK COMPATIBILITY IDEOGRAPH-FA06 * 66B4 ?? * FA07 CJK COMPATIBILITY IDEOGRAPH-FA07 * 8F3B ?? * FA08 CJK COMPATIBILITY IDEOGRAPH-FA08 * 884C ?? * FA09 CJK COMPATIBILITY IDEOGRAPH-FA09 * 964D ?? * FA0A CJK COMPATIBILITY IDEOGRAPH-FA0A * 898B ?? * FA0B CJK COMPATIBILITY IDEOGRAPH-FA0B * 5ED3 ?? * FA0C CJK COMPATIBILITY IDEOGRAPH-FA0C * 5140 ?? * FA0D CJK COMPATIBILITY IDEOGRAPH-FA0D * 55C0 ?? * FA10 CJK COMPATIBILITY IDEOGRAPH-FA10 * 585A ?? * FA12 CJK COMPATIBILITY IDEOGRAPH-FA12 * 6674 ?? * FA15 CJK COMPATIBILITY IDEOGRAPH-FA15 * 51DE ?? * FA16 CJK COMPATIBILITY IDEOGRAPH-FA16 * 732A ?? * FA17 CJK COMPATIBILITY IDEOGRAPH-FA17 * 76CA ?? * FA18 CJK COMPATIBILITY IDEOGRAPH-FA18 * 793C ?? * FA19 CJK COMPATIBILITY IDEOGRAPH-FA19 * 795E ?? * FA1A CJK COMPATIBILITY IDEOGRAPH-FA1A * 7965 ?? * FA1B CJK COMPATIBILITY IDEOGRAPH-FA1B * 798F ?? * FA1C CJK COMPATIBILITY IDEOGRAPH-FA1C * 9756 ?? * FA1D CJK COMPATIBILITY IDEOGRAPH-FA1D * 7CBE ?? * FA1E CJK COMPATIBILITY IDEOGRAPH-FA1E * 7FBD ?? * FA20 CJK COMPATIBILITY IDEOGRAPH-FA20 * 8612 ?? * FA22 CJK COMPATIBILITY IDEOGRAPH-FA22 * 8AF8 ?? * FA25 CJK COMPATIBILITY IDEOGRAPH-FA25 * 9038 ?? * FA26 CJK COMPATIBILITY IDEOGRAPH-FA26 * 90FD ?? * FA2A CJK COMPATIBILITY IDEOGRAPH-FA2A * 98EF ?? * FA2B CJK COMPATIBILITY IDEOGRAPH-FA2B * 98FC ?? * FA2C CJK COMPATIBILITY IDEOGRAPH-FA2C * 9928 ?? * FA2D CJK COMPATIBILITY IDEOGRAPH-FA2D * 9DB4 ?? * FA30 CJK COMPATIBILITY IDEOGRAPH-FA30 * 4FAE ?? * FA31 CJK COMPATIBILITY IDEOGRAPH-FA31 * 50E7 ?? * FA32 CJK COMPATIBILITY IDEOGRAPH-FA32 * 514D ?? * FA33 CJK COMPATIBILITY IDEOGRAPH-FA33 * 52C9 ?? * FA34 CJK COMPATIBILITY IDEOGRAPH-FA34 * 52E4 ?? * FA35 CJK COMPATIBILITY IDEOGRAPH-FA35 * 5351 ?? * FA36 CJK COMPATIBILITY IDEOGRAPH-FA36 * 559D ?? * FA37 CJK COMPATIBILITY IDEOGRAPH-FA37 * 5606 ?? * FA38 CJK COMPATIBILITY IDEOGRAPH-FA38 * 5668 ?? * FA39 CJK COMPATIBILITY IDEOGRAPH-FA39 * 5840 ?? * FA3A CJK COMPATIBILITY IDEOGRAPH-FA3A * 58A8 ?? * FA3B CJK COMPATIBILITY IDEOGRAPH-FA3B * 5C64 ?? * FA3C CJK COMPATIBILITY IDEOGRAPH-FA3C * 5C6E ?? * FA3D CJK COMPATIBILITY IDEOGRAPH-FA3D * 6094 ?? * FA3E CJK COMPATIBILITY IDEOGRAPH-FA3E * 6168 ?? * FA3F CJK COMPATIBILITY IDEOGRAPH-FA3F * 618E ?? * FA40 CJK COMPATIBILITY IDEOGRAPH-FA40 * 61F2 ?? * FA41 CJK COMPATIBILITY IDEOGRAPH-FA41 * 654F ?? * FA42 CJK COMPATIBILITY IDEOGRAPH-FA42 * 65E2 ?? * FA43 CJK COMPATIBILITY IDEOGRAPH-FA43 * 6691 ?? * FA44 CJK COMPATIBILITY IDEOGRAPH-FA44 * 6885 ?? * FA45 CJK COMPATIBILITY IDEOGRAPH-FA45 * 6D77 ?? * FA46 CJK COMPATIBILITY IDEOGRAPH-FA46 * 6E1A ?? * FA47 CJK COMPATIBILITY IDEOGRAPH-FA47 * 6F22 ?? * FA48 CJK COMPATIBILITY IDEOGRAPH-FA48 * 716E ?? * FA49 CJK COMPATIBILITY IDEOGRAPH-FA49 * 722B ?? * FA4A CJK COMPATIBILITY IDEOGRAPH-FA4A * 7422 ?? * FA4B CJK COMPATIBILITY IDEOGRAPH-FA4B * 7891 ?? * FA4C CJK COMPATIBILITY IDEOGRAPH-FA4C * 793E ?? * FA4D CJK COMPATIBILITY IDEOGRAPH-FA4D * 7949 ?? * FA4E CJK COMPATIBILITY IDEOGRAPH-FA4E * 7948 ?? * FA4F CJK COMPATIBILITY IDEOGRAPH-FA4F * 7950 ?? * FA50 CJK COMPATIBILITY IDEOGRAPH-FA50 * 7956 ?? * FA51 CJK COMPATIBILITY IDEOGRAPH-FA51 * 795D ?? * FA52 CJK COMPATIBILITY IDEOGRAPH-FA52 * 798D ?? * FA53 CJK COMPATIBILITY IDEOGRAPH-FA53 * 798E ?? * FA54 CJK COMPATIBILITY IDEOGRAPH-FA54 * 7A40 ?? * FA55 CJK COMPATIBILITY IDEOGRAPH-FA55 * 7A81 ?? * FA56 CJK COMPATIBILITY IDEOGRAPH-FA56 * 7BC0 ?? * FA57 CJK COMPATIBILITY IDEOGRAPH-FA57 * 7DF4 ?? * FA58 CJK COMPATIBILITY IDEOGRAPH-FA58 * 7E09 ?? * FA59 CJK COMPATIBILITY IDEOGRAPH-FA59 * 7E41 ?? * FA5A CJK COMPATIBILITY IDEOGRAPH-FA5A * 7F72 ?? * FA5B CJK COMPATIBILITY IDEOGRAPH-FA5B * 8005 ?? * FA5C CJK COMPATIBILITY IDEOGRAPH-FA5C * 81ED ?? * FA5D CJK COMPATIBILITY IDEOGRAPH-FA5D * 8279 ?? * FA5E CJK COMPATIBILITY IDEOGRAPH-FA5E * 8279 ?? * FA5F CJK COMPATIBILITY IDEOGRAPH-FA5F * 8457 ?? * FA60 CJK COMPATIBILITY IDEOGRAPH-FA60 * 8910 ?? * FA61 CJK COMPATIBILITY IDEOGRAPH-FA61 * 8996 ?? * FA62 CJK COMPATIBILITY IDEOGRAPH-FA62 * 8B01 ?? * FA63 CJK COMPATIBILITY IDEOGRAPH-FA63 * 8B39 ?? * FA64 CJK COMPATIBILITY IDEOGRAPH-FA64 * 8CD3 ?? * FA65 CJK COMPATIBILITY IDEOGRAPH-FA65 * 8D08 ?? * FA66 CJK COMPATIBILITY IDEOGRAPH-FA66 * 8FB6 ?? * FA67 CJK COMPATIBILITY IDEOGRAPH-FA67 * 9038 ?? * FA68 CJK COMPATIBILITY IDEOGRAPH-FA68 * 96E3 ?? * FA69 CJK COMPATIBILITY IDEOGRAPH-FA69 * 97FF ?? * FA6A CJK COMPATIBILITY IDEOGRAPH-FA6A * 983B ?? * FA70 CJK COMPATIBILITY IDEOGRAPH-FA70 * 4E26 ?? * FA71 CJK COMPATIBILITY IDEOGRAPH-FA71 * 51B5 ?? * FA72 CJK COMPATIBILITY IDEOGRAPH-FA72 * 5168 ?? * FA73 CJK COMPATIBILITY IDEOGRAPH-FA73 * 4F80 ?? * FA74 CJK COMPATIBILITY IDEOGRAPH-FA74 * 5145 ?? * FA75 CJK COMPATIBILITY IDEOGRAPH-FA75 * 5180 ?? * FA76 CJK COMPATIBILITY IDEOGRAPH-FA76 * 52C7 ?? * FA77 CJK COMPATIBILITY IDEOGRAPH-FA77 * 52FA ?? * FA78 CJK COMPATIBILITY IDEOGRAPH-FA78 * 559D ?? * FA79 CJK COMPATIBILITY IDEOGRAPH-FA79 * 5555 ?? * FA7A CJK COMPATIBILITY IDEOGRAPH-FA7A * 5599 ?? * FA7B CJK COMPATIBILITY IDEOGRAPH-FA7B * 55E2 ?? * FA7C CJK COMPATIBILITY IDEOGRAPH-FA7C * 585A ?? * FA7D CJK COMPATIBILITY IDEOGRAPH-FA7D * 58B3 ?? * FA7E CJK COMPATIBILITY IDEOGRAPH-FA7E * 5944 ?? * FA7F CJK COMPATIBILITY IDEOGRAPH-FA7F * 5954 ?? * FA80 CJK COMPATIBILITY IDEOGRAPH-FA80 * 5A62 ?? * FA81 CJK COMPATIBILITY IDEOGRAPH-FA81 * 5B28 ?? * FA82 CJK COMPATIBILITY IDEOGRAPH-FA82 * 5ED2 ?? * FA83 CJK COMPATIBILITY IDEOGRAPH-FA83 * 5ED9 ?? * FA84 CJK COMPATIBILITY IDEOGRAPH-FA84 * 5F69 ?? * FA85 CJK COMPATIBILITY IDEOGRAPH-FA85 * 5FAD ?? * FA86 CJK COMPATIBILITY IDEOGRAPH-FA86 * 60D8 ?? * FA87 CJK COMPATIBILITY IDEOGRAPH-FA87 * 614E ?? * FA88 CJK COMPATIBILITY IDEOGRAPH-FA88 * 6108 ?? * FA89 CJK COMPATIBILITY IDEOGRAPH-FA89 * 618E ?? * FA8A CJK COMPATIBILITY IDEOGRAPH-FA8A * 6160 ?? * FA8B CJK COMPATIBILITY IDEOGRAPH-FA8B * 61F2 ?? * FA8C CJK COMPATIBILITY IDEOGRAPH-FA8C * 6234 ?? * FA8D CJK COMPATIBILITY IDEOGRAPH-FA8D * 63C4 ?? * FA8E CJK COMPATIBILITY IDEOGRAPH-FA8E * 641C ?? * FA8F CJK COMPATIBILITY IDEOGRAPH-FA8F * 6452 ?? * FA90 CJK COMPATIBILITY IDEOGRAPH-FA90 * 6556 ?? * FA91 CJK COMPATIBILITY IDEOGRAPH-FA91 * 6674 ?? * FA92 CJK COMPATIBILITY IDEOGRAPH-FA92 * 6717 ?? * FA93 CJK COMPATIBILITY IDEOGRAPH-FA93 * 671B ?? * FA94 CJK COMPATIBILITY IDEOGRAPH-FA94 * 6756 ?? * FA95 CJK COMPATIBILITY IDEOGRAPH-FA95 * 6B79 ?? * FA96 CJK COMPATIBILITY IDEOGRAPH-FA96 * 6BBA ?? * FA97 CJK COMPATIBILITY IDEOGRAPH-FA97 * 6D41 ?? * FA98 CJK COMPATIBILITY IDEOGRAPH-FA98 * 6EDB ?? * FA99 CJK COMPATIBILITY IDEOGRAPH-FA99 * 6ECB ?? * FA9A CJK COMPATIBILITY IDEOGRAPH-FA9A * 6F22 ?? * FA9B CJK COMPATIBILITY IDEOGRAPH-FA9B * 701E ?? * FA9C CJK COMPATIBILITY IDEOGRAPH-FA9C * 716E ?? * FA9D CJK COMPATIBILITY IDEOGRAPH-FA9D * 77A7 ?? * FA9E CJK COMPATIBILITY IDEOGRAPH-FA9E * 7235 ?? * FA9F CJK COMPATIBILITY IDEOGRAPH-FA9F * 72AF ?? * FAA0 CJK COMPATIBILITY IDEOGRAPH-FAA0 * 732A ?? * FAA1 CJK COMPATIBILITY IDEOGRAPH-FAA1 * 7471 ?? * FAA2 CJK COMPATIBILITY IDEOGRAPH-FAA2 * 7506 ?? * FAA3 CJK COMPATIBILITY IDEOGRAPH-FAA3 * 753B ?? * FAA4 CJK COMPATIBILITY IDEOGRAPH-FAA4 * 761D ?? * FAA5 CJK COMPATIBILITY IDEOGRAPH-FAA5 * 761F ?? * FAA6 CJK COMPATIBILITY IDEOGRAPH-FAA6 * 76CA ?? * FAA7 CJK COMPATIBILITY IDEOGRAPH-FAA7 * 76DB ?? * FAA8 CJK COMPATIBILITY IDEOGRAPH-FAA8 * 76F4 ?? * FAA9 CJK COMPATIBILITY IDEOGRAPH-FAA9 * 774A ?? * FAAA CJK COMPATIBILITY IDEOGRAPH-FAAA * 7740 ?? * FAAB CJK COMPATIBILITY IDEOGRAPH-FAAB * 78CC ?? * FAAC CJK COMPATIBILITY IDEOGRAPH-FAAC * 7AB1 ?? * FAAD CJK COMPATIBILITY IDEOGRAPH-FAAD * 7BC0 ?? * FAAE CJK COMPATIBILITY IDEOGRAPH-FAAE * 7C7B ?? * FAAF CJK COMPATIBILITY IDEOGRAPH-FAAF * 7D5B ?? * FAB0 CJK COMPATIBILITY IDEOGRAPH-FAB0 * 7DF4 ?? * FAB1 CJK COMPATIBILITY IDEOGRAPH-FAB1 * 7F3E ?? * FAB2 CJK COMPATIBILITY IDEOGRAPH-FAB2 * 8005 ?? * FAB3 CJK COMPATIBILITY IDEOGRAPH-FAB3 * 8352 ?? * FAB4 CJK COMPATIBILITY IDEOGRAPH-FAB4 * 83EF ?? * FAB5 CJK COMPATIBILITY IDEOGRAPH-FAB5 * 8779 ?? * FAB6 CJK COMPATIBILITY IDEOGRAPH-FAB6 * 8941 ?? * FAB7 CJK COMPATIBILITY IDEOGRAPH-FAB7 * 8986 ?? * FAB8 CJK COMPATIBILITY IDEOGRAPH-FAB8 * 8996 ?? * FAB9 CJK COMPATIBILITY IDEOGRAPH-FAB9 * 8ABF ?? * FABA CJK COMPATIBILITY IDEOGRAPH-FABA * 8AF8 ?? * FABB CJK COMPATIBILITY IDEOGRAPH-FABB * 8ACB ?? * FABC CJK COMPATIBILITY IDEOGRAPH-FABC * 8B01 ?? * FABD CJK COMPATIBILITY IDEOGRAPH-FABD * 8AFE ?? * FABE CJK COMPATIBILITY IDEOGRAPH-FABE * 8AED ?? * FABF CJK COMPATIBILITY IDEOGRAPH-FABF * 8B39 ?? * FAC0 CJK COMPATIBILITY IDEOGRAPH-FAC0 * 8B8A ?? * FAC1 CJK COMPATIBILITY IDEOGRAPH-FAC1 * 8D08 ?? * FAC2 CJK COMPATIBILITY IDEOGRAPH-FAC2 * 8F38 ?? * FAC3 CJK COMPATIBILITY IDEOGRAPH-FAC3 * 9072 ?? * FAC4 CJK COMPATIBILITY IDEOGRAPH-FAC4 * 9199 ?? * FAC5 CJK COMPATIBILITY IDEOGRAPH-FAC5 * 9276 ?? * FAC6 CJK COMPATIBILITY IDEOGRAPH-FAC6 * 967C ?? * FAC7 CJK COMPATIBILITY IDEOGRAPH-FAC7 * 96E3 ?? * FAC8 CJK COMPATIBILITY IDEOGRAPH-FAC8 * 9756 ?? * FAC9 CJK COMPATIBILITY IDEOGRAPH-FAC9 * 97DB ?? * FACA CJK COMPATIBILITY IDEOGRAPH-FACA * 97FF ?? * FACB CJK COMPATIBILITY IDEOGRAPH-FACB * 980B ?? * FACC CJK COMPATIBILITY IDEOGRAPH-FACC * 983B ?? * FACD CJK COMPATIBILITY IDEOGRAPH-FACD * 9B12 ?? * FACE CJK COMPATIBILITY IDEOGRAPH-FACE * 9F9C ?? * FAD2 CJK COMPATIBILITY IDEOGRAPH-FAD2 * 3B9D ?? * FAD3 CJK COMPATIBILITY IDEOGRAPH-FAD3 * 4018 ?? * FAD4 CJK COMPATIBILITY IDEOGRAPH-FAD4 * 4039 ?? * FAD8 CJK COMPATIBILITY IDEOGRAPH-FAD8 * 9F43 ?? * FAD9 CJK COMPATIBILITY IDEOGRAPH-FAD9 * 9F8E ?? * FB00 LATIN SMALL LIGATURE FF * 0066 LATIN SMALL LETTER F * 0066 LATIN SMALL LETTER F * FB01 LATIN SMALL LIGATURE FI * 0066 LATIN SMALL LETTER F * 0069 LATIN SMALL LETTER I * FB02 LATIN SMALL LIGATURE FL * 0066 LATIN SMALL LETTER F * 006C LATIN SMALL LETTER L * FB03 LATIN SMALL LIGATURE FFI * 0066 LATIN SMALL LETTER F * 0066 LATIN SMALL LETTER F * 0069 LATIN SMALL LETTER I * FB04 LATIN SMALL LIGATURE FFL * 0066 LATIN SMALL LETTER F * 0066 LATIN SMALL LETTER F * 006C LATIN SMALL LETTER L * FB05 LATIN SMALL LIGATURE LONG S T * 0074 LATIN SMALL LETTER T * 0073 LATIN SMALL LETTER S * FB06 LATIN SMALL LIGATURE ST * 0073 LATIN SMALL LETTER S * 0074 LATIN SMALL LETTER T * FB13 ARMENIAN SMALL LIGATURE MEN NOW * 0574 ARMENIAN SMALL LETTER MEN * 0576 ARMENIAN SMALL LETTER NOW * FB14 ARMENIAN SMALL LIGATURE MEN ECH * 0574 ARMENIAN SMALL LETTER MEN * 0565 ARMENIAN SMALL LETTER ECH * FB15 ARMENIAN SMALL LIGATURE MEN INI * 0574 ARMENIAN SMALL LETTER MEN * 056B ARMENIAN SMALL LETTER INI * FB16 ARMENIAN SMALL LIGATURE VEW NOW * 057E ARMENIAN SMALL LETTER VEW * 0576 ARMENIAN SMALL LETTER NOW * FB17 ARMENIAN SMALL LIGATURE MEN XEH * 0574 ARMENIAN SMALL LETTER MEN * 056D ARMENIAN SMALL LETTER XEH * FB1D HEBREW LETTER YOD WITH HIRIQ * 05D9 HEBREW LETTER YOD * FB1E HEBREW POINT JUDEO-SPANISH VARIKA * 0000 * FB1F HEBREW LIGATURE YIDDISH YOD YOD PATAH * 05F2 HEBREW LIGATURE YIDDISH DOUBLE YOD * FB20 HEBREW LETTER ALTERNATIVE AYIN * 05E2 HEBREW LETTER AYIN * FB21 HEBREW LETTER WIDE ALEF * 05D0 HEBREW LETTER ALEF * FB22 HEBREW LETTER WIDE DALET * 05D3 HEBREW LETTER DALET * FB23 HEBREW LETTER WIDE HE * 05D4 HEBREW LETTER HE * FB24 HEBREW LETTER WIDE KAF * 05DB HEBREW LETTER KAF * FB25 HEBREW LETTER WIDE LAMED * 05DC HEBREW LETTER LAMED * FB26 HEBREW LETTER WIDE FINAL MEM * 05DD HEBREW LETTER FINAL MEM * FB27 HEBREW LETTER WIDE RESH * 05E8 HEBREW LETTER RESH * FB28 HEBREW LETTER WIDE TAV * 05EA HEBREW LETTER TAV * FB29 HEBREW LETTER ALTERNATIVE PLUS SIGN * 002B PLUS SIGN * FB2A HEBREW LETTER SHIN WITH SHIN DOT * 05E9 HEBREW LETTER SHIN * FB2B HEBREW LETTER SHIN WITH SIN DOT * 05E9 HEBREW LETTER SHIN * FB2C HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT * 05E9 HEBREW LETTER SHIN * FB2D HEBREW LETTER SHIN WITH DAGESH AND SIN DOT * 05E9 HEBREW LETTER SHIN * FB2E HEBREW LETTER ALEF WITH PATAH * 05D0 HEBREW LETTER ALEF * FB2F HEBREW LETTER ALEF WITH QAMATS * 05D0 HEBREW LETTER ALEF * FB30 HEBREW LETTER ALEF WITH MAPIQ * 05D0 HEBREW LETTER ALEF * FB31 HEBREW LETTER BET WITH DAGESH * 05D1 HEBREW LETTER BET * FB32 HEBREW LETTER GIMEL WITH DAGESH * 05D2 HEBREW LETTER GIMEL * FB33 HEBREW LETTER DALET WITH DAGESH * 05D3 HEBREW LETTER DALET * FB34 HEBREW LETTER HE WITH MAPIQ * 05D4 HEBREW LETTER HE * FB35 HEBREW LETTER VAV WITH DAGESH * 05D5 HEBREW LETTER VAV * FB36 HEBREW LETTER ZAYIN WITH DAGESH * 05D6 HEBREW LETTER ZAYIN * FB38 HEBREW LETTER TET WITH DAGESH * 05D8 HEBREW LETTER TET * FB39 HEBREW LETTER YOD WITH DAGESH * 05D9 HEBREW LETTER YOD * FB3A HEBREW LETTER FINAL KAF WITH DAGESH * 05DA HEBREW LETTER FINAL KAF * FB3B HEBREW LETTER KAF WITH DAGESH * 05DB HEBREW LETTER KAF * FB3C HEBREW LETTER LAMED WITH DAGESH * 05DC HEBREW LETTER LAMED * FB3E HEBREW LETTER MEM WITH DAGESH * 05DE HEBREW LETTER MEM * FB40 HEBREW LETTER NUN WITH DAGESH * 05E0 HEBREW LETTER NUN * FB41 HEBREW LETTER SAMEKH WITH DAGESH * 05E1 HEBREW LETTER SAMEKH * FB43 HEBREW LETTER FINAL PE WITH DAGESH * 05E3 HEBREW LETTER FINAL PE * FB44 HEBREW LETTER PE WITH DAGESH * 05E4 HEBREW LETTER PE * FB46 HEBREW LETTER TSADI WITH DAGESH * 05E6 HEBREW LETTER TSADI * FB47 HEBREW LETTER QOF WITH DAGESH * 05E7 HEBREW LETTER QOF * FB48 HEBREW LETTER RESH WITH DAGESH * 05E8 HEBREW LETTER RESH * FB49 HEBREW LETTER SHIN WITH DAGESH * 05E9 HEBREW LETTER SHIN * FB4A HEBREW LETTER TAV WITH DAGESH * 05EA HEBREW LETTER TAV * FB4B HEBREW LETTER VAV WITH HOLAM * 05D5 HEBREW LETTER VAV * FB4C HEBREW LETTER BET WITH RAFE * 05D1 HEBREW LETTER BET * FB4D HEBREW LETTER KAF WITH RAFE * 05DB HEBREW LETTER KAF * FB4E HEBREW LETTER PE WITH RAFE * 05E4 HEBREW LETTER PE * FB4F HEBREW LIGATURE ALEF LAMED * 05D0 HEBREW LETTER ALEF * 05DC HEBREW LETTER LAMED * FB50 ARABIC LETTER ALEF WASLA ISOLATED FORM * 0671 ARABIC LETTER ALEF WASLA * FB51 ARABIC LETTER ALEF WASLA FINAL FORM * 0671 ARABIC LETTER ALEF WASLA * FB52 ARABIC LETTER BEEH ISOLATED FORM * 067B ARABIC LETTER BEEH * FB53 ARABIC LETTER BEEH FINAL FORM * 067B ARABIC LETTER BEEH * FB54 ARABIC LETTER BEEH INITIAL FORM * 067B ARABIC LETTER BEEH * FB55 ARABIC LETTER BEEH MEDIAL FORM * 067B ARABIC LETTER BEEH * FB56 ARABIC LETTER PEH ISOLATED FORM * 067E ARABIC LETTER PEH * FB57 ARABIC LETTER PEH FINAL FORM * 067E ARABIC LETTER PEH * FB58 ARABIC LETTER PEH INITIAL FORM * 067E ARABIC LETTER PEH * FB59 ARABIC LETTER PEH MEDIAL FORM * 067E ARABIC LETTER PEH * FB5A ARABIC LETTER BEHEH ISOLATED FORM * 0680 ARABIC LETTER BEHEH * FB5B ARABIC LETTER BEHEH FINAL FORM * 0680 ARABIC LETTER BEHEH * FB5C ARABIC LETTER BEHEH INITIAL FORM * 0680 ARABIC LETTER BEHEH * FB5D ARABIC LETTER BEHEH MEDIAL FORM * 0680 ARABIC LETTER BEHEH * FB5E ARABIC LETTER TTEHEH ISOLATED FORM * 067A ARABIC LETTER TTEHEH * FB5F ARABIC LETTER TTEHEH FINAL FORM * 067A ARABIC LETTER TTEHEH * FB60 ARABIC LETTER TTEHEH INITIAL FORM * 067A ARABIC LETTER TTEHEH * FB61 ARABIC LETTER TTEHEH MEDIAL FORM * 067A ARABIC LETTER TTEHEH * FB62 ARABIC LETTER TEHEH ISOLATED FORM * 067F ARABIC LETTER TEHEH * FB63 ARABIC LETTER TEHEH FINAL FORM * 067F ARABIC LETTER TEHEH * FB64 ARABIC LETTER TEHEH INITIAL FORM * 067F ARABIC LETTER TEHEH * FB65 ARABIC LETTER TEHEH MEDIAL FORM * 067F ARABIC LETTER TEHEH * FB66 ARABIC LETTER TTEH ISOLATED FORM * 0679 ARABIC LETTER TTEH * FB67 ARABIC LETTER TTEH FINAL FORM * 0679 ARABIC LETTER TTEH * FB68 ARABIC LETTER TTEH INITIAL FORM * 0679 ARABIC LETTER TTEH * FB69 ARABIC LETTER TTEH MEDIAL FORM * 0679 ARABIC LETTER TTEH * FB6A ARABIC LETTER VEH ISOLATED FORM * 06A4 ARABIC LETTER VEH * FB6B ARABIC LETTER VEH FINAL FORM * 06A4 ARABIC LETTER VEH * FB6C ARABIC LETTER VEH INITIAL FORM * 06A4 ARABIC LETTER VEH * FB6D ARABIC LETTER VEH MEDIAL FORM * 06A4 ARABIC LETTER VEH * FB6E ARABIC LETTER PEHEH ISOLATED FORM * 06A6 ARABIC LETTER PEHEH * FB6F ARABIC LETTER PEHEH FINAL FORM * 06A6 ARABIC LETTER PEHEH * FB70 ARABIC LETTER PEHEH INITIAL FORM * 06A6 ARABIC LETTER PEHEH * FB71 ARABIC LETTER PEHEH MEDIAL FORM * 06A6 ARABIC LETTER PEHEH * FB72 ARABIC LETTER DYEH ISOLATED FORM * 0684 ARABIC LETTER DYEH * FB73 ARABIC LETTER DYEH FINAL FORM * 0684 ARABIC LETTER DYEH * FB74 ARABIC LETTER DYEH INITIAL FORM * 0684 ARABIC LETTER DYEH * FB75 ARABIC LETTER DYEH MEDIAL FORM * 0684 ARABIC LETTER DYEH * FB76 ARABIC LETTER NYEH ISOLATED FORM * 0683 ARABIC LETTER NYEH * FB77 ARABIC LETTER NYEH FINAL FORM * 0683 ARABIC LETTER NYEH * FB78 ARABIC LETTER NYEH INITIAL FORM * 0683 ARABIC LETTER NYEH * FB79 ARABIC LETTER NYEH MEDIAL FORM * 0683 ARABIC LETTER NYEH * FB7A ARABIC LETTER TCHEH ISOLATED FORM * 0686 ARABIC LETTER TCHEH * FB7B ARABIC LETTER TCHEH FINAL FORM * 0686 ARABIC LETTER TCHEH * FB7C ARABIC LETTER TCHEH INITIAL FORM * 0686 ARABIC LETTER TCHEH * FB7D ARABIC LETTER TCHEH MEDIAL FORM * 0686 ARABIC LETTER TCHEH * FB7E ARABIC LETTER TCHEHEH ISOLATED FORM * 0687 ARABIC LETTER TCHEHEH * FB7F ARABIC LETTER TCHEHEH FINAL FORM * 0687 ARABIC LETTER TCHEHEH * FB80 ARABIC LETTER TCHEHEH INITIAL FORM * 0687 ARABIC LETTER TCHEHEH * FB81 ARABIC LETTER TCHEHEH MEDIAL FORM * 0687 ARABIC LETTER TCHEHEH * FB82 ARABIC LETTER DDAHAL ISOLATED FORM * 068D ARABIC LETTER DDAHAL * FB83 ARABIC LETTER DDAHAL FINAL FORM * 068D ARABIC LETTER DDAHAL * FB84 ARABIC LETTER DAHAL ISOLATED FORM * 068C ARABIC LETTER DAHAL * FB85 ARABIC LETTER DAHAL FINAL FORM * 068C ARABIC LETTER DAHAL * FB86 ARABIC LETTER DUL ISOLATED FORM * 068E ARABIC LETTER DUL * FB87 ARABIC LETTER DUL FINAL FORM * 068E ARABIC LETTER DUL * FB88 ARABIC LETTER DDAL ISOLATED FORM * 0688 ARABIC LETTER DDAL * FB89 ARABIC LETTER DDAL FINAL FORM * 0688 ARABIC LETTER DDAL * FB8A ARABIC LETTER JEH ISOLATED FORM * 0698 ARABIC LETTER JEH * FB8B ARABIC LETTER JEH FINAL FORM * 0698 ARABIC LETTER JEH * FB8C ARABIC LETTER RREH ISOLATED FORM * 0691 ARABIC LETTER RREH * FB8D ARABIC LETTER RREH FINAL FORM * 0691 ARABIC LETTER RREH * FB8E ARABIC LETTER KEHEH ISOLATED FORM * 06A9 ARABIC LETTER KEHEH * FB8F ARABIC LETTER KEHEH FINAL FORM * 06A9 ARABIC LETTER KEHEH * FB90 ARABIC LETTER KEHEH INITIAL FORM * 06A9 ARABIC LETTER KEHEH * FB91 ARABIC LETTER KEHEH MEDIAL FORM * 06A9 ARABIC LETTER KEHEH * FB92 ARABIC LETTER GAF ISOLATED FORM * 06AF ARABIC LETTER GAF * FB93 ARABIC LETTER GAF FINAL FORM * 06AF ARABIC LETTER GAF * FB94 ARABIC LETTER GAF INITIAL FORM * 06AF ARABIC LETTER GAF * FB95 ARABIC LETTER GAF MEDIAL FORM * 06AF ARABIC LETTER GAF * FB96 ARABIC LETTER GUEH ISOLATED FORM * 06B3 ARABIC LETTER GUEH * FB97 ARABIC LETTER GUEH FINAL FORM * 06B3 ARABIC LETTER GUEH * FB98 ARABIC LETTER GUEH INITIAL FORM * 06B3 ARABIC LETTER GUEH * FB99 ARABIC LETTER GUEH MEDIAL FORM * 06B3 ARABIC LETTER GUEH * FB9A ARABIC LETTER NGOEH ISOLATED FORM * 06B1 ARABIC LETTER NGOEH * FB9B ARABIC LETTER NGOEH FINAL FORM * 06B1 ARABIC LETTER NGOEH * FB9C ARABIC LETTER NGOEH INITIAL FORM * 06B1 ARABIC LETTER NGOEH * FB9D ARABIC LETTER NGOEH MEDIAL FORM * 06B1 ARABIC LETTER NGOEH * FB9E ARABIC LETTER NOON GHUNNA ISOLATED FORM * 06BA ARABIC LETTER NOON GHUNNA * FB9F ARABIC LETTER NOON GHUNNA FINAL FORM * 06BA ARABIC LETTER NOON GHUNNA * FBA0 ARABIC LETTER RNOON ISOLATED FORM * 06BB ARABIC LETTER RNOON * FBA1 ARABIC LETTER RNOON FINAL FORM * 06BB ARABIC LETTER RNOON * FBA2 ARABIC LETTER RNOON INITIAL FORM * 06BB ARABIC LETTER RNOON * FBA3 ARABIC LETTER RNOON MEDIAL FORM * 06BB ARABIC LETTER RNOON * FBA4 ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM * 06D5 ARABIC LETTER AE * FBA5 ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM * 06D5 ARABIC LETTER AE * FBA6 ARABIC LETTER HEH GOAL ISOLATED FORM * 06C1 ARABIC LETTER HEH GOAL * FBA7 ARABIC LETTER HEH GOAL FINAL FORM * 06C1 ARABIC LETTER HEH GOAL * FBA8 ARABIC LETTER HEH GOAL INITIAL FORM * 06C1 ARABIC LETTER HEH GOAL * FBA9 ARABIC LETTER HEH GOAL MEDIAL FORM * 06C1 ARABIC LETTER HEH GOAL * FBAA ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM * 06BE ARABIC LETTER HEH DOACHASHMEE * FBAB ARABIC LETTER HEH DOACHASHMEE FINAL FORM * 06BE ARABIC LETTER HEH DOACHASHMEE * FBAC ARABIC LETTER HEH DOACHASHMEE INITIAL FORM * 06BE ARABIC LETTER HEH DOACHASHMEE * FBAD ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM * 06BE ARABIC LETTER HEH DOACHASHMEE * FBAE ARABIC LETTER YEH BARREE ISOLATED FORM * 06D2 ARABIC LETTER YEH BARREE * FBAF ARABIC LETTER YEH BARREE FINAL FORM * 06D2 ARABIC LETTER YEH BARREE * FBB0 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM * 06D2 ARABIC LETTER YEH BARREE * FBB1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM * 06D2 ARABIC LETTER YEH BARREE * FBD3 ARABIC LETTER NG ISOLATED FORM * 06AD ARABIC LETTER NG * FBD4 ARABIC LETTER NG FINAL FORM * 06AD ARABIC LETTER NG * FBD5 ARABIC LETTER NG INITIAL FORM * 06AD ARABIC LETTER NG * FBD6 ARABIC LETTER NG MEDIAL FORM * 06AD ARABIC LETTER NG * FBD7 ARABIC LETTER U ISOLATED FORM * 06C7 ARABIC LETTER U * FBD8 ARABIC LETTER U FINAL FORM * 06C7 ARABIC LETTER U * FBD9 ARABIC LETTER OE ISOLATED FORM * 06C6 ARABIC LETTER OE * FBDA ARABIC LETTER OE FINAL FORM * 06C6 ARABIC LETTER OE * FBDB ARABIC LETTER YU ISOLATED FORM * 06C8 ARABIC LETTER YU * FBDC ARABIC LETTER YU FINAL FORM * 06C8 ARABIC LETTER YU * FBDD ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM * 06C7 ARABIC LETTER U * 0674 ARABIC LETTER HIGH HAMZA * FBDE ARABIC LETTER VE ISOLATED FORM * 06CB ARABIC LETTER VE * FBDF ARABIC LETTER VE FINAL FORM * 06CB ARABIC LETTER VE * FBE0 ARABIC LETTER KIRGHIZ OE ISOLATED FORM * 06C5 ARABIC LETTER KIRGHIZ OE * FBE1 ARABIC LETTER KIRGHIZ OE FINAL FORM * 06C5 ARABIC LETTER KIRGHIZ OE * FBE2 ARABIC LETTER KIRGHIZ YU ISOLATED FORM * 06C9 ARABIC LETTER KIRGHIZ YU * FBE3 ARABIC LETTER KIRGHIZ YU FINAL FORM * 06C9 ARABIC LETTER KIRGHIZ YU * FBE4 ARABIC LETTER E ISOLATED FORM * 06D0 ARABIC LETTER E * FBE5 ARABIC LETTER E FINAL FORM * 06D0 ARABIC LETTER E * FBE6 ARABIC LETTER E INITIAL FORM * 06D0 ARABIC LETTER E * FBE7 ARABIC LETTER E MEDIAL FORM * 06D0 ARABIC LETTER E * FBE8 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM * 0649 ARABIC LETTER ALEF MAKSURA * FBE9 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM * 0649 ARABIC LETTER ALEF MAKSURA * FBEA ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM * 0627 ARABIC LETTER ALEF * 064A ARABIC LETTER YEH * FBEB ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM * 0627 ARABIC LETTER ALEF * 064A ARABIC LETTER YEH * FBEC ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM * 06D5 ARABIC LETTER AE * 064A ARABIC LETTER YEH * FBED ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM * 06D5 ARABIC LETTER AE * 064A ARABIC LETTER YEH * FBEE ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM * 0648 ARABIC LETTER WAW * 064A ARABIC LETTER YEH * FBEF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM * 0648 ARABIC LETTER WAW * 064A ARABIC LETTER YEH * FBF0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM * 06C7 ARABIC LETTER U * 064A ARABIC LETTER YEH * FBF1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM * 06C7 ARABIC LETTER U * 064A ARABIC LETTER YEH * FBF2 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM * 06C6 ARABIC LETTER OE * 064A ARABIC LETTER YEH * FBF3 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM * 06C6 ARABIC LETTER OE * 064A ARABIC LETTER YEH * FBF4 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM * 06C8 ARABIC LETTER YU * 064A ARABIC LETTER YEH * FBF5 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM * 06C8 ARABIC LETTER YU * 064A ARABIC LETTER YEH * FBF6 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM * 06D0 ARABIC LETTER E * 064A ARABIC LETTER YEH * FBF7 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM * 06D0 ARABIC LETTER E * 064A ARABIC LETTER YEH * FBF8 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM * 06D0 ARABIC LETTER E * 064A ARABIC LETTER YEH * FBF9 ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM * 0649 ARABIC LETTER ALEF MAKSURA * 064A ARABIC LETTER YEH * FBFA ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM * 0649 ARABIC LETTER ALEF MAKSURA * 064A ARABIC LETTER YEH * FBFB ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM * 0649 ARABIC LETTER ALEF MAKSURA * 064A ARABIC LETTER YEH * FBFC ARABIC LETTER FARSI YEH ISOLATED FORM * 06CC ARABIC LETTER FARSI YEH * FBFD ARABIC LETTER FARSI YEH FINAL FORM * 06CC ARABIC LETTER FARSI YEH * FBFE ARABIC LETTER FARSI YEH INITIAL FORM * 06CC ARABIC LETTER FARSI YEH * FBFF ARABIC LETTER FARSI YEH MEDIAL FORM * 06CC ARABIC LETTER FARSI YEH * FC00 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM * 062C ARABIC LETTER JEEM * 064A ARABIC LETTER YEH * FC01 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FC02 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FC03 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM * 0649 ARABIC LETTER ALEF MAKSURA * 064A ARABIC LETTER YEH * FC04 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM * 064A ARABIC LETTER YEH * 064A ARABIC LETTER YEH * FC05 ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM * 0628 ARABIC LETTER BEH * 062C ARABIC LETTER JEEM * FC06 ARABIC LIGATURE BEH WITH HAH ISOLATED FORM * 0628 ARABIC LETTER BEH * 062D ARABIC LETTER HAH * FC07 ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM * 0628 ARABIC LETTER BEH * 062E ARABIC LETTER KHAH * FC08 ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM * 0628 ARABIC LETTER BEH * 0645 ARABIC LETTER MEEM * FC09 ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM * 0628 ARABIC LETTER BEH * 0649 ARABIC LETTER ALEF MAKSURA * FC0A ARABIC LIGATURE BEH WITH YEH ISOLATED FORM * 0628 ARABIC LETTER BEH * 064A ARABIC LETTER YEH * FC0B ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM * 062A ARABIC LETTER TEH * 062C ARABIC LETTER JEEM * FC0C ARABIC LIGATURE TEH WITH HAH ISOLATED FORM * 062A ARABIC LETTER TEH * 062D ARABIC LETTER HAH * FC0D ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM * 062A ARABIC LETTER TEH * 062E ARABIC LETTER KHAH * FC0E ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM * 062A ARABIC LETTER TEH * 0645 ARABIC LETTER MEEM * FC0F ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM * 062A ARABIC LETTER TEH * 0649 ARABIC LETTER ALEF MAKSURA * FC10 ARABIC LIGATURE TEH WITH YEH ISOLATED FORM * 062A ARABIC LETTER TEH * 064A ARABIC LETTER YEH * FC11 ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM * 062B ARABIC LETTER THEH * 062C ARABIC LETTER JEEM * FC12 ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM * 062B ARABIC LETTER THEH * 0645 ARABIC LETTER MEEM * FC13 ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM * 062B ARABIC LETTER THEH * 0649 ARABIC LETTER ALEF MAKSURA * FC14 ARABIC LIGATURE THEH WITH YEH ISOLATED FORM * 062B ARABIC LETTER THEH * 064A ARABIC LETTER YEH * FC15 ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM * 062C ARABIC LETTER JEEM * 062D ARABIC LETTER HAH * FC16 ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * FC17 ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM * 062D ARABIC LETTER HAH * 062C ARABIC LETTER JEEM * FC18 ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM * 062D ARABIC LETTER HAH * 0645 ARABIC LETTER MEEM * FC19 ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM * 062E ARABIC LETTER KHAH * 062C ARABIC LETTER JEEM * FC1A ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM * 062E ARABIC LETTER KHAH * 062D ARABIC LETTER HAH * FC1B ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM * 062E ARABIC LETTER KHAH * 0645 ARABIC LETTER MEEM * FC1C ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM * 0633 ARABIC LETTER SEEN * 062C ARABIC LETTER JEEM * FC1D ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM * 0633 ARABIC LETTER SEEN * 062D ARABIC LETTER HAH * FC1E ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM * 0633 ARABIC LETTER SEEN * 062E ARABIC LETTER KHAH * FC1F ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM * 0633 ARABIC LETTER SEEN * 0645 ARABIC LETTER MEEM * FC20 ARABIC LIGATURE SAD WITH HAH ISOLATED FORM * 0635 ARABIC LETTER SAD * 062D ARABIC LETTER HAH * FC21 ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM * 0635 ARABIC LETTER SAD * 0645 ARABIC LETTER MEEM * FC22 ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM * 0636 ARABIC LETTER DAD * 062C ARABIC LETTER JEEM * FC23 ARABIC LIGATURE DAD WITH HAH ISOLATED FORM * 0636 ARABIC LETTER DAD * 062D ARABIC LETTER HAH * FC24 ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM * 0636 ARABIC LETTER DAD * 062E ARABIC LETTER KHAH * FC25 ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM * 0636 ARABIC LETTER DAD * 0645 ARABIC LETTER MEEM * FC26 ARABIC LIGATURE TAH WITH HAH ISOLATED FORM * 0637 ARABIC LETTER TAH * 062D ARABIC LETTER HAH * FC27 ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM * 0637 ARABIC LETTER TAH * 0645 ARABIC LETTER MEEM * FC28 ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM * 0638 ARABIC LETTER ZAH * 0645 ARABIC LETTER MEEM * FC29 ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM * 0639 ARABIC LETTER AIN * 062C ARABIC LETTER JEEM * FC2A ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM * 0639 ARABIC LETTER AIN * 0645 ARABIC LETTER MEEM * FC2B ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM * 063A ARABIC LETTER GHAIN * 062C ARABIC LETTER JEEM * FC2C ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM * 063A ARABIC LETTER GHAIN * 0645 ARABIC LETTER MEEM * FC2D ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM * 0641 ARABIC LETTER FEH * 062C ARABIC LETTER JEEM * FC2E ARABIC LIGATURE FEH WITH HAH ISOLATED FORM * 0641 ARABIC LETTER FEH * 062D ARABIC LETTER HAH * FC2F ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM * 0641 ARABIC LETTER FEH * 062E ARABIC LETTER KHAH * FC30 ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM * 0641 ARABIC LETTER FEH * 0645 ARABIC LETTER MEEM * FC31 ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM * 0641 ARABIC LETTER FEH * 0649 ARABIC LETTER ALEF MAKSURA * FC32 ARABIC LIGATURE FEH WITH YEH ISOLATED FORM * 0641 ARABIC LETTER FEH * 064A ARABIC LETTER YEH * FC33 ARABIC LIGATURE QAF WITH HAH ISOLATED FORM * 0642 ARABIC LETTER QAF * 062D ARABIC LETTER HAH * FC34 ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM * 0642 ARABIC LETTER QAF * 0645 ARABIC LETTER MEEM * FC35 ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM * 0642 ARABIC LETTER QAF * 0649 ARABIC LETTER ALEF MAKSURA * FC36 ARABIC LIGATURE QAF WITH YEH ISOLATED FORM * 0642 ARABIC LETTER QAF * 064A ARABIC LETTER YEH * FC37 ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM * 0643 ARABIC LETTER KAF * 0627 ARABIC LETTER ALEF * FC38 ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM * 0643 ARABIC LETTER KAF * 062C ARABIC LETTER JEEM * FC39 ARABIC LIGATURE KAF WITH HAH ISOLATED FORM * 0643 ARABIC LETTER KAF * 062D ARABIC LETTER HAH * FC3A ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM * 0643 ARABIC LETTER KAF * 062E ARABIC LETTER KHAH * FC3B ARABIC LIGATURE KAF WITH LAM ISOLATED FORM * 0643 ARABIC LETTER KAF * 0644 ARABIC LETTER LAM * FC3C ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM * 0643 ARABIC LETTER KAF * 0645 ARABIC LETTER MEEM * FC3D ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM * 0643 ARABIC LETTER KAF * 0649 ARABIC LETTER ALEF MAKSURA * FC3E ARABIC LIGATURE KAF WITH YEH ISOLATED FORM * 0643 ARABIC LETTER KAF * 064A ARABIC LETTER YEH * FC3F ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM * 0644 ARABIC LETTER LAM * 062C ARABIC LETTER JEEM * FC40 ARABIC LIGATURE LAM WITH HAH ISOLATED FORM * 0644 ARABIC LETTER LAM * 062D ARABIC LETTER HAH * FC41 ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM * 0644 ARABIC LETTER LAM * 062E ARABIC LETTER KHAH * FC42 ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM * 0644 ARABIC LETTER LAM * 0645 ARABIC LETTER MEEM * FC43 ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM * 0644 ARABIC LETTER LAM * 0649 ARABIC LETTER ALEF MAKSURA * FC44 ARABIC LIGATURE LAM WITH YEH ISOLATED FORM * 0644 ARABIC LETTER LAM * 064A ARABIC LETTER YEH * FC45 ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM * 0645 ARABIC LETTER MEEM * 062C ARABIC LETTER JEEM * FC46 ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FC47 ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM * 0645 ARABIC LETTER MEEM * 062E ARABIC LETTER KHAH * FC48 ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FC49 ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM * 0645 ARABIC LETTER MEEM * 0649 ARABIC LETTER ALEF MAKSURA * FC4A ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FC4B ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM * 0646 ARABIC LETTER NOON * 062C ARABIC LETTER JEEM * FC4C ARABIC LIGATURE NOON WITH HAH ISOLATED FORM * 0646 ARABIC LETTER NOON * 062D ARABIC LETTER HAH * FC4D ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM * 0646 ARABIC LETTER NOON * 062E ARABIC LETTER KHAH * FC4E ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM * 0646 ARABIC LETTER NOON * 0645 ARABIC LETTER MEEM * FC4F ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM * 0646 ARABIC LETTER NOON * 0649 ARABIC LETTER ALEF MAKSURA * FC50 ARABIC LIGATURE NOON WITH YEH ISOLATED FORM * 0646 ARABIC LETTER NOON * 064A ARABIC LETTER YEH * FC51 ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM * 0647 ARABIC LETTER HEH * 062C ARABIC LETTER JEEM * FC52 ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM * 0647 ARABIC LETTER HEH * 0645 ARABIC LETTER MEEM * FC53 ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM * 0647 ARABIC LETTER HEH * 0649 ARABIC LETTER ALEF MAKSURA * FC54 ARABIC LIGATURE HEH WITH YEH ISOLATED FORM * 0647 ARABIC LETTER HEH * 064A ARABIC LETTER YEH * FC55 ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM * 064A ARABIC LETTER YEH * 062C ARABIC LETTER JEEM * FC56 ARABIC LIGATURE YEH WITH HAH ISOLATED FORM * 064A ARABIC LETTER YEH * 062D ARABIC LETTER HAH * FC57 ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM * 064A ARABIC LETTER YEH * 062E ARABIC LETTER KHAH * FC58 ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM * 064A ARABIC LETTER YEH * 0645 ARABIC LETTER MEEM * FC59 ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM * 064A ARABIC LETTER YEH * 0649 ARABIC LETTER ALEF MAKSURA * FC5A ARABIC LIGATURE YEH WITH YEH ISOLATED FORM * 064A ARABIC LETTER YEH * 064A ARABIC LETTER YEH * FC5B ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM * 0630 ARABIC LETTER THAL * FC5C ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM * 0631 ARABIC LETTER REH * FC5D ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM * 0649 ARABIC LETTER ALEF MAKSURA * FC5E ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM * 0020 SPACE * FC5F ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM * 0020 SPACE * FC60 ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM * 0020 SPACE * FC61 ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM * 0020 SPACE * FC62 ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM * 0020 SPACE * FC63 ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM * 0020 SPACE * FC64 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM * 0631 ARABIC LETTER REH * 064A ARABIC LETTER YEH * FC65 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM * 0632 ARABIC LETTER ZAIN * 064A ARABIC LETTER YEH * FC66 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FC67 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM * 0646 ARABIC LETTER NOON * 064A ARABIC LETTER YEH * FC68 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM * 0649 ARABIC LETTER ALEF MAKSURA * 064A ARABIC LETTER YEH * FC69 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM * 064A ARABIC LETTER YEH * 064A ARABIC LETTER YEH * FC6A ARABIC LIGATURE BEH WITH REH FINAL FORM * 0628 ARABIC LETTER BEH * 0631 ARABIC LETTER REH * FC6B ARABIC LIGATURE BEH WITH ZAIN FINAL FORM * 0628 ARABIC LETTER BEH * 0632 ARABIC LETTER ZAIN * FC6C ARABIC LIGATURE BEH WITH MEEM FINAL FORM * 0628 ARABIC LETTER BEH * 0645 ARABIC LETTER MEEM * FC6D ARABIC LIGATURE BEH WITH NOON FINAL FORM * 0628 ARABIC LETTER BEH * 0646 ARABIC LETTER NOON * FC6E ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM * 0628 ARABIC LETTER BEH * 0649 ARABIC LETTER ALEF MAKSURA * FC6F ARABIC LIGATURE BEH WITH YEH FINAL FORM * 0628 ARABIC LETTER BEH * 064A ARABIC LETTER YEH * FC70 ARABIC LIGATURE TEH WITH REH FINAL FORM * 062A ARABIC LETTER TEH * 0631 ARABIC LETTER REH * FC71 ARABIC LIGATURE TEH WITH ZAIN FINAL FORM * 062A ARABIC LETTER TEH * 0632 ARABIC LETTER ZAIN * FC72 ARABIC LIGATURE TEH WITH MEEM FINAL FORM * 062A ARABIC LETTER TEH * 0645 ARABIC LETTER MEEM * FC73 ARABIC LIGATURE TEH WITH NOON FINAL FORM * 062A ARABIC LETTER TEH * 0646 ARABIC LETTER NOON * FC74 ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM * 062A ARABIC LETTER TEH * 0649 ARABIC LETTER ALEF MAKSURA * FC75 ARABIC LIGATURE TEH WITH YEH FINAL FORM * 062A ARABIC LETTER TEH * 064A ARABIC LETTER YEH * FC76 ARABIC LIGATURE THEH WITH REH FINAL FORM * 062B ARABIC LETTER THEH * 0631 ARABIC LETTER REH * FC77 ARABIC LIGATURE THEH WITH ZAIN FINAL FORM * 062B ARABIC LETTER THEH * 0632 ARABIC LETTER ZAIN * FC78 ARABIC LIGATURE THEH WITH MEEM FINAL FORM * 062B ARABIC LETTER THEH * 0645 ARABIC LETTER MEEM * FC79 ARABIC LIGATURE THEH WITH NOON FINAL FORM * 062B ARABIC LETTER THEH * 0646 ARABIC LETTER NOON * FC7A ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM * 062B ARABIC LETTER THEH * 0649 ARABIC LETTER ALEF MAKSURA * FC7B ARABIC LIGATURE THEH WITH YEH FINAL FORM * 062B ARABIC LETTER THEH * 064A ARABIC LETTER YEH * FC7C ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM * 0641 ARABIC LETTER FEH * 0649 ARABIC LETTER ALEF MAKSURA * FC7D ARABIC LIGATURE FEH WITH YEH FINAL FORM * 0641 ARABIC LETTER FEH * 064A ARABIC LETTER YEH * FC7E ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM * 0642 ARABIC LETTER QAF * 0649 ARABIC LETTER ALEF MAKSURA * FC7F ARABIC LIGATURE QAF WITH YEH FINAL FORM * 0642 ARABIC LETTER QAF * 064A ARABIC LETTER YEH * FC80 ARABIC LIGATURE KAF WITH ALEF FINAL FORM * 0643 ARABIC LETTER KAF * 0627 ARABIC LETTER ALEF * FC81 ARABIC LIGATURE KAF WITH LAM FINAL FORM * 0643 ARABIC LETTER KAF * 0644 ARABIC LETTER LAM * FC82 ARABIC LIGATURE KAF WITH MEEM FINAL FORM * 0643 ARABIC LETTER KAF * 0645 ARABIC LETTER MEEM * FC83 ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM * 0643 ARABIC LETTER KAF * 0649 ARABIC LETTER ALEF MAKSURA * FC84 ARABIC LIGATURE KAF WITH YEH FINAL FORM * 0643 ARABIC LETTER KAF * 064A ARABIC LETTER YEH * FC85 ARABIC LIGATURE LAM WITH MEEM FINAL FORM * 0644 ARABIC LETTER LAM * 0645 ARABIC LETTER MEEM * FC86 ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM * 0644 ARABIC LETTER LAM * 0649 ARABIC LETTER ALEF MAKSURA * FC87 ARABIC LIGATURE LAM WITH YEH FINAL FORM * 0644 ARABIC LETTER LAM * 064A ARABIC LETTER YEH * FC88 ARABIC LIGATURE MEEM WITH ALEF FINAL FORM * 0645 ARABIC LETTER MEEM * 0627 ARABIC LETTER ALEF * FC89 ARABIC LIGATURE MEEM WITH MEEM FINAL FORM * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FC8A ARABIC LIGATURE NOON WITH REH FINAL FORM * 0646 ARABIC LETTER NOON * 0631 ARABIC LETTER REH * FC8B ARABIC LIGATURE NOON WITH ZAIN FINAL FORM * 0646 ARABIC LETTER NOON * 0632 ARABIC LETTER ZAIN * FC8C ARABIC LIGATURE NOON WITH MEEM FINAL FORM * 0646 ARABIC LETTER NOON * 0645 ARABIC LETTER MEEM * FC8D ARABIC LIGATURE NOON WITH NOON FINAL FORM * 0646 ARABIC LETTER NOON * 0646 ARABIC LETTER NOON * FC8E ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM * 0646 ARABIC LETTER NOON * 0649 ARABIC LETTER ALEF MAKSURA * FC8F ARABIC LIGATURE NOON WITH YEH FINAL FORM * 0646 ARABIC LETTER NOON * 064A ARABIC LETTER YEH * FC90 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM * 0649 ARABIC LETTER ALEF MAKSURA * FC91 ARABIC LIGATURE YEH WITH REH FINAL FORM * 064A ARABIC LETTER YEH * 0631 ARABIC LETTER REH * FC92 ARABIC LIGATURE YEH WITH ZAIN FINAL FORM * 064A ARABIC LETTER YEH * 0632 ARABIC LETTER ZAIN * FC93 ARABIC LIGATURE YEH WITH MEEM FINAL FORM * 064A ARABIC LETTER YEH * 0645 ARABIC LETTER MEEM * FC94 ARABIC LIGATURE YEH WITH NOON FINAL FORM * 064A ARABIC LETTER YEH * 0646 ARABIC LETTER NOON * FC95 ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM * 064A ARABIC LETTER YEH * 0649 ARABIC LETTER ALEF MAKSURA * FC96 ARABIC LIGATURE YEH WITH YEH FINAL FORM * 064A ARABIC LETTER YEH * 064A ARABIC LETTER YEH * FC97 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM * 062C ARABIC LETTER JEEM * 064A ARABIC LETTER YEH * FC98 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FC99 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM * 062E ARABIC LETTER KHAH * 064A ARABIC LETTER YEH * FC9A ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FC9B ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM * 0647 ARABIC LETTER HEH * 064A ARABIC LETTER YEH * FC9C ARABIC LIGATURE BEH WITH JEEM INITIAL FORM * 0628 ARABIC LETTER BEH * 062C ARABIC LETTER JEEM * FC9D ARABIC LIGATURE BEH WITH HAH INITIAL FORM * 0628 ARABIC LETTER BEH * 062D ARABIC LETTER HAH * FC9E ARABIC LIGATURE BEH WITH KHAH INITIAL FORM * 0628 ARABIC LETTER BEH * 062E ARABIC LETTER KHAH * FC9F ARABIC LIGATURE BEH WITH MEEM INITIAL FORM * 0628 ARABIC LETTER BEH * 0645 ARABIC LETTER MEEM * FCA0 ARABIC LIGATURE BEH WITH HEH INITIAL FORM * 0628 ARABIC LETTER BEH * 0647 ARABIC LETTER HEH * FCA1 ARABIC LIGATURE TEH WITH JEEM INITIAL FORM * 062A ARABIC LETTER TEH * 062C ARABIC LETTER JEEM * FCA2 ARABIC LIGATURE TEH WITH HAH INITIAL FORM * 062A ARABIC LETTER TEH * 062D ARABIC LETTER HAH * FCA3 ARABIC LIGATURE TEH WITH KHAH INITIAL FORM * 062A ARABIC LETTER TEH * 062E ARABIC LETTER KHAH * FCA4 ARABIC LIGATURE TEH WITH MEEM INITIAL FORM * 062A ARABIC LETTER TEH * 0645 ARABIC LETTER MEEM * FCA5 ARABIC LIGATURE TEH WITH HEH INITIAL FORM * 062A ARABIC LETTER TEH * 0647 ARABIC LETTER HEH * FCA6 ARABIC LIGATURE THEH WITH MEEM INITIAL FORM * 062B ARABIC LETTER THEH * 0645 ARABIC LETTER MEEM * FCA7 ARABIC LIGATURE JEEM WITH HAH INITIAL FORM * 062C ARABIC LETTER JEEM * 062D ARABIC LETTER HAH * FCA8 ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * FCA9 ARABIC LIGATURE HAH WITH JEEM INITIAL FORM * 062D ARABIC LETTER HAH * 062C ARABIC LETTER JEEM * FCAA ARABIC LIGATURE HAH WITH MEEM INITIAL FORM * 062D ARABIC LETTER HAH * 0645 ARABIC LETTER MEEM * FCAB ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM * 062E ARABIC LETTER KHAH * 062C ARABIC LETTER JEEM * FCAC ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM * 062E ARABIC LETTER KHAH * 0645 ARABIC LETTER MEEM * FCAD ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM * 0633 ARABIC LETTER SEEN * 062C ARABIC LETTER JEEM * FCAE ARABIC LIGATURE SEEN WITH HAH INITIAL FORM * 0633 ARABIC LETTER SEEN * 062D ARABIC LETTER HAH * FCAF ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM * 0633 ARABIC LETTER SEEN * 062E ARABIC LETTER KHAH * FCB0 ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM * 0633 ARABIC LETTER SEEN * 0645 ARABIC LETTER MEEM * FCB1 ARABIC LIGATURE SAD WITH HAH INITIAL FORM * 0635 ARABIC LETTER SAD * 062D ARABIC LETTER HAH * FCB2 ARABIC LIGATURE SAD WITH KHAH INITIAL FORM * 0635 ARABIC LETTER SAD * 062E ARABIC LETTER KHAH * FCB3 ARABIC LIGATURE SAD WITH MEEM INITIAL FORM * 0635 ARABIC LETTER SAD * 0645 ARABIC LETTER MEEM * FCB4 ARABIC LIGATURE DAD WITH JEEM INITIAL FORM * 0636 ARABIC LETTER DAD * 062C ARABIC LETTER JEEM * FCB5 ARABIC LIGATURE DAD WITH HAH INITIAL FORM * 0636 ARABIC LETTER DAD * 062D ARABIC LETTER HAH * FCB6 ARABIC LIGATURE DAD WITH KHAH INITIAL FORM * 0636 ARABIC LETTER DAD * 062E ARABIC LETTER KHAH * FCB7 ARABIC LIGATURE DAD WITH MEEM INITIAL FORM * 0636 ARABIC LETTER DAD * 0645 ARABIC LETTER MEEM * FCB8 ARABIC LIGATURE TAH WITH HAH INITIAL FORM * 0637 ARABIC LETTER TAH * 062D ARABIC LETTER HAH * FCB9 ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM * 0638 ARABIC LETTER ZAH * 0645 ARABIC LETTER MEEM * FCBA ARABIC LIGATURE AIN WITH JEEM INITIAL FORM * 0639 ARABIC LETTER AIN * 062C ARABIC LETTER JEEM * FCBB ARABIC LIGATURE AIN WITH MEEM INITIAL FORM * 0639 ARABIC LETTER AIN * 0645 ARABIC LETTER MEEM * FCBC ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM * 063A ARABIC LETTER GHAIN * 062C ARABIC LETTER JEEM * FCBD ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM * 063A ARABIC LETTER GHAIN * 0645 ARABIC LETTER MEEM * FCBE ARABIC LIGATURE FEH WITH JEEM INITIAL FORM * 0641 ARABIC LETTER FEH * 062C ARABIC LETTER JEEM * FCBF ARABIC LIGATURE FEH WITH HAH INITIAL FORM * 0641 ARABIC LETTER FEH * 062D ARABIC LETTER HAH * FCC0 ARABIC LIGATURE FEH WITH KHAH INITIAL FORM * 0641 ARABIC LETTER FEH * 062E ARABIC LETTER KHAH * FCC1 ARABIC LIGATURE FEH WITH MEEM INITIAL FORM * 0641 ARABIC LETTER FEH * 0645 ARABIC LETTER MEEM * FCC2 ARABIC LIGATURE QAF WITH HAH INITIAL FORM * 0642 ARABIC LETTER QAF * 062D ARABIC LETTER HAH * FCC3 ARABIC LIGATURE QAF WITH MEEM INITIAL FORM * 0642 ARABIC LETTER QAF * 0645 ARABIC LETTER MEEM * FCC4 ARABIC LIGATURE KAF WITH JEEM INITIAL FORM * 0643 ARABIC LETTER KAF * 062C ARABIC LETTER JEEM * FCC5 ARABIC LIGATURE KAF WITH HAH INITIAL FORM * 0643 ARABIC LETTER KAF * 062D ARABIC LETTER HAH * FCC6 ARABIC LIGATURE KAF WITH KHAH INITIAL FORM * 0643 ARABIC LETTER KAF * 062E ARABIC LETTER KHAH * FCC7 ARABIC LIGATURE KAF WITH LAM INITIAL FORM * 0643 ARABIC LETTER KAF * 0644 ARABIC LETTER LAM * FCC8 ARABIC LIGATURE KAF WITH MEEM INITIAL FORM * 0643 ARABIC LETTER KAF * 0645 ARABIC LETTER MEEM * FCC9 ARABIC LIGATURE LAM WITH JEEM INITIAL FORM * 0644 ARABIC LETTER LAM * 062C ARABIC LETTER JEEM * FCCA ARABIC LIGATURE LAM WITH HAH INITIAL FORM * 0644 ARABIC LETTER LAM * 062D ARABIC LETTER HAH * FCCB ARABIC LIGATURE LAM WITH KHAH INITIAL FORM * 0644 ARABIC LETTER LAM * 062E ARABIC LETTER KHAH * FCCC ARABIC LIGATURE LAM WITH MEEM INITIAL FORM * 0644 ARABIC LETTER LAM * 0645 ARABIC LETTER MEEM * FCCD ARABIC LIGATURE LAM WITH HEH INITIAL FORM * 0644 ARABIC LETTER LAM * 0647 ARABIC LETTER HEH * FCCE ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM * 0645 ARABIC LETTER MEEM * 062C ARABIC LETTER JEEM * FCCF ARABIC LIGATURE MEEM WITH HAH INITIAL FORM * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FCD0 ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM * 0645 ARABIC LETTER MEEM * 062E ARABIC LETTER KHAH * FCD1 ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FCD2 ARABIC LIGATURE NOON WITH JEEM INITIAL FORM * 0646 ARABIC LETTER NOON * 062C ARABIC LETTER JEEM * FCD3 ARABIC LIGATURE NOON WITH HAH INITIAL FORM * 0646 ARABIC LETTER NOON * 062D ARABIC LETTER HAH * FCD4 ARABIC LIGATURE NOON WITH KHAH INITIAL FORM * 0646 ARABIC LETTER NOON * 062E ARABIC LETTER KHAH * FCD5 ARABIC LIGATURE NOON WITH MEEM INITIAL FORM * 0646 ARABIC LETTER NOON * 0645 ARABIC LETTER MEEM * FCD6 ARABIC LIGATURE NOON WITH HEH INITIAL FORM * 0646 ARABIC LETTER NOON * 0647 ARABIC LETTER HEH * FCD7 ARABIC LIGATURE HEH WITH JEEM INITIAL FORM * 0647 ARABIC LETTER HEH * 062C ARABIC LETTER JEEM * FCD8 ARABIC LIGATURE HEH WITH MEEM INITIAL FORM * 0647 ARABIC LETTER HEH * 0645 ARABIC LETTER MEEM * FCD9 ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM * 0647 ARABIC LETTER HEH * FCDA ARABIC LIGATURE YEH WITH JEEM INITIAL FORM * 064A ARABIC LETTER YEH * 062C ARABIC LETTER JEEM * FCDB ARABIC LIGATURE YEH WITH HAH INITIAL FORM * 064A ARABIC LETTER YEH * 062D ARABIC LETTER HAH * FCDC ARABIC LIGATURE YEH WITH KHAH INITIAL FORM * 064A ARABIC LETTER YEH * 062E ARABIC LETTER KHAH * FCDD ARABIC LIGATURE YEH WITH MEEM INITIAL FORM * 064A ARABIC LETTER YEH * 0645 ARABIC LETTER MEEM * FCDE ARABIC LIGATURE YEH WITH HEH INITIAL FORM * 064A ARABIC LETTER YEH * 0647 ARABIC LETTER HEH * FCDF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FCE0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM * 0647 ARABIC LETTER HEH * 064A ARABIC LETTER YEH * FCE1 ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM * 0628 ARABIC LETTER BEH * 0645 ARABIC LETTER MEEM * FCE2 ARABIC LIGATURE BEH WITH HEH MEDIAL FORM * 0628 ARABIC LETTER BEH * 0647 ARABIC LETTER HEH * FCE3 ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM * 062A ARABIC LETTER TEH * 0645 ARABIC LETTER MEEM * FCE4 ARABIC LIGATURE TEH WITH HEH MEDIAL FORM * 062A ARABIC LETTER TEH * 0647 ARABIC LETTER HEH * FCE5 ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM * 062B ARABIC LETTER THEH * 0645 ARABIC LETTER MEEM * FCE6 ARABIC LIGATURE THEH WITH HEH MEDIAL FORM * 062B ARABIC LETTER THEH * 0647 ARABIC LETTER HEH * FCE7 ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM * 0633 ARABIC LETTER SEEN * 0645 ARABIC LETTER MEEM * FCE8 ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM * 0633 ARABIC LETTER SEEN * 0647 ARABIC LETTER HEH * FCE9 ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM * 0634 ARABIC LETTER SHEEN * 0645 ARABIC LETTER MEEM * FCEA ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM * 0634 ARABIC LETTER SHEEN * 0647 ARABIC LETTER HEH * FCEB ARABIC LIGATURE KAF WITH LAM MEDIAL FORM * 0643 ARABIC LETTER KAF * 0644 ARABIC LETTER LAM * FCEC ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM * 0643 ARABIC LETTER KAF * 0645 ARABIC LETTER MEEM * FCED ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM * 0644 ARABIC LETTER LAM * 0645 ARABIC LETTER MEEM * FCEE ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM * 0646 ARABIC LETTER NOON * 0645 ARABIC LETTER MEEM * FCEF ARABIC LIGATURE NOON WITH HEH MEDIAL FORM * 0646 ARABIC LETTER NOON * 0647 ARABIC LETTER HEH * FCF0 ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM * 064A ARABIC LETTER YEH * 0645 ARABIC LETTER MEEM * FCF1 ARABIC LIGATURE YEH WITH HEH MEDIAL FORM * 064A ARABIC LETTER YEH * 0647 ARABIC LETTER HEH * FCF2 ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM * 0640 ARABIC TATWEEL * FCF3 ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM * 0640 ARABIC TATWEEL * FCF4 ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM * 0640 ARABIC TATWEEL * FCF5 ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM * 0637 ARABIC LETTER TAH * 0649 ARABIC LETTER ALEF MAKSURA * FCF6 ARABIC LIGATURE TAH WITH YEH ISOLATED FORM * 0637 ARABIC LETTER TAH * 064A ARABIC LETTER YEH * FCF7 ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM * 0639 ARABIC LETTER AIN * 0649 ARABIC LETTER ALEF MAKSURA * FCF8 ARABIC LIGATURE AIN WITH YEH ISOLATED FORM * 0639 ARABIC LETTER AIN * 064A ARABIC LETTER YEH * FCF9 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM * 063A ARABIC LETTER GHAIN * 0649 ARABIC LETTER ALEF MAKSURA * FCFA ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM * 063A ARABIC LETTER GHAIN * 064A ARABIC LETTER YEH * FCFB ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM * 0633 ARABIC LETTER SEEN * 0649 ARABIC LETTER ALEF MAKSURA * FCFC ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM * 0633 ARABIC LETTER SEEN * 064A ARABIC LETTER YEH * FCFD ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM * 0634 ARABIC LETTER SHEEN * 0649 ARABIC LETTER ALEF MAKSURA * FCFE ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM * 0634 ARABIC LETTER SHEEN * 064A ARABIC LETTER YEH * FCFF ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM * 062D ARABIC LETTER HAH * 0649 ARABIC LETTER ALEF MAKSURA * FD00 ARABIC LIGATURE HAH WITH YEH ISOLATED FORM * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FD01 ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM * 062C ARABIC LETTER JEEM * 0649 ARABIC LETTER ALEF MAKSURA * FD02 ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM * 062C ARABIC LETTER JEEM * 064A ARABIC LETTER YEH * FD03 ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM * 062E ARABIC LETTER KHAH * 0649 ARABIC LETTER ALEF MAKSURA * FD04 ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM * 062E ARABIC LETTER KHAH * 064A ARABIC LETTER YEH * FD05 ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM * 0635 ARABIC LETTER SAD * 0649 ARABIC LETTER ALEF MAKSURA * FD06 ARABIC LIGATURE SAD WITH YEH ISOLATED FORM * 0635 ARABIC LETTER SAD * 064A ARABIC LETTER YEH * FD07 ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM * 0636 ARABIC LETTER DAD * 0649 ARABIC LETTER ALEF MAKSURA * FD08 ARABIC LIGATURE DAD WITH YEH ISOLATED FORM * 0636 ARABIC LETTER DAD * 064A ARABIC LETTER YEH * FD09 ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM * 0634 ARABIC LETTER SHEEN * 062C ARABIC LETTER JEEM * FD0A ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM * 0634 ARABIC LETTER SHEEN * 062D ARABIC LETTER HAH * FD0B ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM * 0634 ARABIC LETTER SHEEN * 062E ARABIC LETTER KHAH * FD0C ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM * 0634 ARABIC LETTER SHEEN * 0645 ARABIC LETTER MEEM * FD0D ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM * 0634 ARABIC LETTER SHEEN * 0631 ARABIC LETTER REH * FD0E ARABIC LIGATURE SEEN WITH REH ISOLATED FORM * 0633 ARABIC LETTER SEEN * 0631 ARABIC LETTER REH * FD0F ARABIC LIGATURE SAD WITH REH ISOLATED FORM * 0635 ARABIC LETTER SAD * 0631 ARABIC LETTER REH * FD10 ARABIC LIGATURE DAD WITH REH ISOLATED FORM * 0636 ARABIC LETTER DAD * 0631 ARABIC LETTER REH * FD11 ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM * 0637 ARABIC LETTER TAH * 0649 ARABIC LETTER ALEF MAKSURA * FD12 ARABIC LIGATURE TAH WITH YEH FINAL FORM * 0637 ARABIC LETTER TAH * 064A ARABIC LETTER YEH * FD13 ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM * 0639 ARABIC LETTER AIN * 0649 ARABIC LETTER ALEF MAKSURA * FD14 ARABIC LIGATURE AIN WITH YEH FINAL FORM * 0639 ARABIC LETTER AIN * 064A ARABIC LETTER YEH * FD15 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM * 063A ARABIC LETTER GHAIN * 0649 ARABIC LETTER ALEF MAKSURA * FD16 ARABIC LIGATURE GHAIN WITH YEH FINAL FORM * 063A ARABIC LETTER GHAIN * 064A ARABIC LETTER YEH * FD17 ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM * 0633 ARABIC LETTER SEEN * 0649 ARABIC LETTER ALEF MAKSURA * FD18 ARABIC LIGATURE SEEN WITH YEH FINAL FORM * 0633 ARABIC LETTER SEEN * 064A ARABIC LETTER YEH * FD19 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM * 0634 ARABIC LETTER SHEEN * 0649 ARABIC LETTER ALEF MAKSURA * FD1A ARABIC LIGATURE SHEEN WITH YEH FINAL FORM * 0634 ARABIC LETTER SHEEN * 064A ARABIC LETTER YEH * FD1B ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM * 062D ARABIC LETTER HAH * 0649 ARABIC LETTER ALEF MAKSURA * FD1C ARABIC LIGATURE HAH WITH YEH FINAL FORM * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FD1D ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM * 062C ARABIC LETTER JEEM * 0649 ARABIC LETTER ALEF MAKSURA * FD1E ARABIC LIGATURE JEEM WITH YEH FINAL FORM * 062C ARABIC LETTER JEEM * 064A ARABIC LETTER YEH * FD1F ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM * 062E ARABIC LETTER KHAH * 0649 ARABIC LETTER ALEF MAKSURA * FD20 ARABIC LIGATURE KHAH WITH YEH FINAL FORM * 062E ARABIC LETTER KHAH * 064A ARABIC LETTER YEH * FD21 ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM * 0635 ARABIC LETTER SAD * 0649 ARABIC LETTER ALEF MAKSURA * FD22 ARABIC LIGATURE SAD WITH YEH FINAL FORM * 0635 ARABIC LETTER SAD * 064A ARABIC LETTER YEH * FD23 ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM * 0636 ARABIC LETTER DAD * 0649 ARABIC LETTER ALEF MAKSURA * FD24 ARABIC LIGATURE DAD WITH YEH FINAL FORM * 0636 ARABIC LETTER DAD * 064A ARABIC LETTER YEH * FD25 ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM * 0634 ARABIC LETTER SHEEN * 062C ARABIC LETTER JEEM * FD26 ARABIC LIGATURE SHEEN WITH HAH FINAL FORM * 0634 ARABIC LETTER SHEEN * 062D ARABIC LETTER HAH * FD27 ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM * 0634 ARABIC LETTER SHEEN * 062E ARABIC LETTER KHAH * FD28 ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM * 0634 ARABIC LETTER SHEEN * 0645 ARABIC LETTER MEEM * FD29 ARABIC LIGATURE SHEEN WITH REH FINAL FORM * 0634 ARABIC LETTER SHEEN * 0631 ARABIC LETTER REH * FD2A ARABIC LIGATURE SEEN WITH REH FINAL FORM * 0633 ARABIC LETTER SEEN * 0631 ARABIC LETTER REH * FD2B ARABIC LIGATURE SAD WITH REH FINAL FORM * 0635 ARABIC LETTER SAD * 0631 ARABIC LETTER REH * FD2C ARABIC LIGATURE DAD WITH REH FINAL FORM * 0636 ARABIC LETTER DAD * 0631 ARABIC LETTER REH * FD2D ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM * 0634 ARABIC LETTER SHEEN * 062C ARABIC LETTER JEEM * FD2E ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM * 0634 ARABIC LETTER SHEEN * 062D ARABIC LETTER HAH * FD2F ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM * 0634 ARABIC LETTER SHEEN * 062E ARABIC LETTER KHAH * FD30 ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM * 0634 ARABIC LETTER SHEEN * 0645 ARABIC LETTER MEEM * FD31 ARABIC LIGATURE SEEN WITH HEH INITIAL FORM * 0633 ARABIC LETTER SEEN * 0647 ARABIC LETTER HEH * FD32 ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM * 0634 ARABIC LETTER SHEEN * 0647 ARABIC LETTER HEH * FD33 ARABIC LIGATURE TAH WITH MEEM INITIAL FORM * 0637 ARABIC LETTER TAH * 0645 ARABIC LETTER MEEM * FD34 ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM * 0633 ARABIC LETTER SEEN * 062C ARABIC LETTER JEEM * FD35 ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM * 0633 ARABIC LETTER SEEN * 062D ARABIC LETTER HAH * FD36 ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM * 0633 ARABIC LETTER SEEN * 062E ARABIC LETTER KHAH * FD37 ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM * 0634 ARABIC LETTER SHEEN * 062C ARABIC LETTER JEEM * FD38 ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM * 0634 ARABIC LETTER SHEEN * 062D ARABIC LETTER HAH * FD39 ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM * 0634 ARABIC LETTER SHEEN * 062E ARABIC LETTER KHAH * FD3A ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM * 0637 ARABIC LETTER TAH * 0645 ARABIC LETTER MEEM * FD3B ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM * 0638 ARABIC LETTER ZAH * 0645 ARABIC LETTER MEEM * FD3C ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM * 0627 ARABIC LETTER ALEF * FD3D ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM * 0627 ARABIC LETTER ALEF * FD50 ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM * 062A ARABIC LETTER TEH * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * FD51 ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM * 062A ARABIC LETTER TEH * 062D ARABIC LETTER HAH * 062C ARABIC LETTER JEEM * FD52 ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM * 062A ARABIC LETTER TEH * 062D ARABIC LETTER HAH * 062C ARABIC LETTER JEEM * FD53 ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM * 062A ARABIC LETTER TEH * 062D ARABIC LETTER HAH * 0645 ARABIC LETTER MEEM * FD54 ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM * 062A ARABIC LETTER TEH * 062E ARABIC LETTER KHAH * 0645 ARABIC LETTER MEEM * FD55 ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM * 062A ARABIC LETTER TEH * 0645 ARABIC LETTER MEEM * 062C ARABIC LETTER JEEM * FD56 ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM * 062A ARABIC LETTER TEH * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FD57 ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM * 062A ARABIC LETTER TEH * 0645 ARABIC LETTER MEEM * 062E ARABIC LETTER KHAH * FD58 ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FD59 ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FD5A ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM * 062D ARABIC LETTER HAH * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FD5B ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM * 062D ARABIC LETTER HAH * 0645 ARABIC LETTER MEEM * 0649 ARABIC LETTER ALEF MAKSURA * FD5C ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM * 0633 ARABIC LETTER SEEN * 062D ARABIC LETTER HAH * 062C ARABIC LETTER JEEM * FD5D ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM * 0633 ARABIC LETTER SEEN * 062C ARABIC LETTER JEEM * 062D ARABIC LETTER HAH * FD5E ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM * 0633 ARABIC LETTER SEEN * 062C ARABIC LETTER JEEM * 0649 ARABIC LETTER ALEF MAKSURA * FD5F ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM * 0633 ARABIC LETTER SEEN * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FD60 ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM * 0633 ARABIC LETTER SEEN * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FD61 ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM * 0633 ARABIC LETTER SEEN * 0645 ARABIC LETTER MEEM * 062C ARABIC LETTER JEEM * FD62 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM * 0633 ARABIC LETTER SEEN * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD63 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM * 0633 ARABIC LETTER SEEN * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD64 ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM * 0635 ARABIC LETTER SAD * 062D ARABIC LETTER HAH * 062D ARABIC LETTER HAH * FD65 ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM * 0635 ARABIC LETTER SAD * 062D ARABIC LETTER HAH * 062D ARABIC LETTER HAH * FD66 ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM * 0635 ARABIC LETTER SAD * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD67 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM * 0634 ARABIC LETTER SHEEN * 062D ARABIC LETTER HAH * 0645 ARABIC LETTER MEEM * FD68 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM * 0634 ARABIC LETTER SHEEN * 062D ARABIC LETTER HAH * 0645 ARABIC LETTER MEEM * FD69 ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM * 0634 ARABIC LETTER SHEEN * 062C ARABIC LETTER JEEM * 064A ARABIC LETTER YEH * FD6A ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM * 0634 ARABIC LETTER SHEEN * 0645 ARABIC LETTER MEEM * 062E ARABIC LETTER KHAH * FD6B ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM * 0634 ARABIC LETTER SHEEN * 0645 ARABIC LETTER MEEM * 062E ARABIC LETTER KHAH * FD6C ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM * 0634 ARABIC LETTER SHEEN * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD6D ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM * 0634 ARABIC LETTER SHEEN * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD6E ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM * 0636 ARABIC LETTER DAD * 062D ARABIC LETTER HAH * 0649 ARABIC LETTER ALEF MAKSURA * FD6F ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM * 0636 ARABIC LETTER DAD * 062E ARABIC LETTER KHAH * 0645 ARABIC LETTER MEEM * FD70 ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM * 0636 ARABIC LETTER DAD * 062E ARABIC LETTER KHAH * 0645 ARABIC LETTER MEEM * FD71 ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM * 0637 ARABIC LETTER TAH * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FD72 ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM * 0637 ARABIC LETTER TAH * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FD73 ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM * 0637 ARABIC LETTER TAH * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD74 ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM * 0637 ARABIC LETTER TAH * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FD75 ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM * 0639 ARABIC LETTER AIN * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * FD76 ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM * 0639 ARABIC LETTER AIN * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD77 ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM * 0639 ARABIC LETTER AIN * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD78 ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM * 0639 ARABIC LETTER AIN * 0645 ARABIC LETTER MEEM * 0649 ARABIC LETTER ALEF MAKSURA * FD79 ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM * 063A ARABIC LETTER GHAIN * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD7A ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM * 063A ARABIC LETTER GHAIN * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FD7B ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM * 063A ARABIC LETTER GHAIN * 0645 ARABIC LETTER MEEM * 0649 ARABIC LETTER ALEF MAKSURA * FD7C ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM * 0641 ARABIC LETTER FEH * 062E ARABIC LETTER KHAH * 0645 ARABIC LETTER MEEM * FD7D ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM * 0641 ARABIC LETTER FEH * 062E ARABIC LETTER KHAH * 0645 ARABIC LETTER MEEM * FD7E ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM * 0642 ARABIC LETTER QAF * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FD7F ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM * 0642 ARABIC LETTER QAF * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD80 ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM * 0644 ARABIC LETTER LAM * 062D ARABIC LETTER HAH * 0645 ARABIC LETTER MEEM * FD81 ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM * 0644 ARABIC LETTER LAM * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FD82 ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM * 0644 ARABIC LETTER LAM * 062D ARABIC LETTER HAH * 0649 ARABIC LETTER ALEF MAKSURA * FD83 ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM * 0644 ARABIC LETTER LAM * 062C ARABIC LETTER JEEM * 062C ARABIC LETTER JEEM * FD84 ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM * 0644 ARABIC LETTER LAM * 062C ARABIC LETTER JEEM * 062C ARABIC LETTER JEEM * FD85 ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM * 0644 ARABIC LETTER LAM * 062E ARABIC LETTER KHAH * 0645 ARABIC LETTER MEEM * FD86 ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM * 0644 ARABIC LETTER LAM * 062E ARABIC LETTER KHAH * 0645 ARABIC LETTER MEEM * FD87 ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM * 0644 ARABIC LETTER LAM * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FD88 ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM * 0644 ARABIC LETTER LAM * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FD89 ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * 062C ARABIC LETTER JEEM * FD8A ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * 0645 ARABIC LETTER MEEM * FD8B ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FD8C ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM * 0645 ARABIC LETTER MEEM * 062C ARABIC LETTER JEEM * 062D ARABIC LETTER HAH * FD8D ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM * 0645 ARABIC LETTER MEEM * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * FD8E ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM * 0645 ARABIC LETTER MEEM * 062E ARABIC LETTER KHAH * 062C ARABIC LETTER JEEM * FD8F ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM * 0645 ARABIC LETTER MEEM * 062E ARABIC LETTER KHAH * 0645 ARABIC LETTER MEEM * FD92 ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM * 0645 ARABIC LETTER MEEM * 062C ARABIC LETTER JEEM * 062E ARABIC LETTER KHAH * FD93 ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM * 0647 ARABIC LETTER HEH * 0645 ARABIC LETTER MEEM * 062C ARABIC LETTER JEEM * FD94 ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM * 0647 ARABIC LETTER HEH * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD95 ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM * 0646 ARABIC LETTER NOON * 062D ARABIC LETTER HAH * 0645 ARABIC LETTER MEEM * FD96 ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM * 0646 ARABIC LETTER NOON * 062D ARABIC LETTER HAH * 0649 ARABIC LETTER ALEF MAKSURA * FD97 ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM * 0646 ARABIC LETTER NOON * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * FD98 ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM * 0646 ARABIC LETTER NOON * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * FD99 ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM * 0646 ARABIC LETTER NOON * 062C ARABIC LETTER JEEM * 0649 ARABIC LETTER ALEF MAKSURA * FD9A ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM * 0646 ARABIC LETTER NOON * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FD9B ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM * 0646 ARABIC LETTER NOON * 0645 ARABIC LETTER MEEM * 0649 ARABIC LETTER ALEF MAKSURA * FD9C ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM * 064A ARABIC LETTER YEH * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD9D ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM * 064A ARABIC LETTER YEH * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FD9E ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM * 0628 ARABIC LETTER BEH * 062E ARABIC LETTER KHAH * 064A ARABIC LETTER YEH * FD9F ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM * 062A ARABIC LETTER TEH * 062C ARABIC LETTER JEEM * 064A ARABIC LETTER YEH * FDA0 ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM * 062A ARABIC LETTER TEH * 062C ARABIC LETTER JEEM * 0649 ARABIC LETTER ALEF MAKSURA * FDA1 ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM * 062A ARABIC LETTER TEH * 062E ARABIC LETTER KHAH * 064A ARABIC LETTER YEH * FDA2 ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM * 062A ARABIC LETTER TEH * 062E ARABIC LETTER KHAH * 0649 ARABIC LETTER ALEF MAKSURA * FDA3 ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM * 062A ARABIC LETTER TEH * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FDA4 ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM * 062A ARABIC LETTER TEH * 0645 ARABIC LETTER MEEM * 0649 ARABIC LETTER ALEF MAKSURA * FDA5 ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FDA6 ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM * 062C ARABIC LETTER JEEM * 062D ARABIC LETTER HAH * 0649 ARABIC LETTER ALEF MAKSURA * FDA7 ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * 0649 ARABIC LETTER ALEF MAKSURA * FDA8 ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM * 0633 ARABIC LETTER SEEN * 062E ARABIC LETTER KHAH * 0649 ARABIC LETTER ALEF MAKSURA * FDA9 ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM * 0635 ARABIC LETTER SAD * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FDAA ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM * 0634 ARABIC LETTER SHEEN * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FDAB ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM * 0636 ARABIC LETTER DAD * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FDAC ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM * 0644 ARABIC LETTER LAM * 062C ARABIC LETTER JEEM * 064A ARABIC LETTER YEH * FDAD ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM * 0644 ARABIC LETTER LAM * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FDAE ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM * 064A ARABIC LETTER YEH * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FDAF ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM * 064A ARABIC LETTER YEH * 062C ARABIC LETTER JEEM * 064A ARABIC LETTER YEH * FDB0 ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM * 064A ARABIC LETTER YEH * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FDB1 ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FDB2 ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM * 0642 ARABIC LETTER QAF * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FDB3 ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM * 0646 ARABIC LETTER NOON * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FDB4 ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM * 0642 ARABIC LETTER QAF * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * FDB5 ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM * 0644 ARABIC LETTER LAM * 062D ARABIC LETTER HAH * 0645 ARABIC LETTER MEEM * FDB6 ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM * 0639 ARABIC LETTER AIN * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FDB7 ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM * 0643 ARABIC LETTER KAF * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FDB8 ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM * 0646 ARABIC LETTER NOON * 062C ARABIC LETTER JEEM * 062D ARABIC LETTER HAH * FDB9 ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM * 0645 ARABIC LETTER MEEM * 062E ARABIC LETTER KHAH * 064A ARABIC LETTER YEH * FDBA ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM * 0644 ARABIC LETTER LAM * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * FDBB ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM * 0643 ARABIC LETTER KAF * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FDBC ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM * 0644 ARABIC LETTER LAM * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * FDBD ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM * 0646 ARABIC LETTER NOON * 062C ARABIC LETTER JEEM * 062D ARABIC LETTER HAH * FDBE ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM * 062C ARABIC LETTER JEEM * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FDBF ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM * 062D ARABIC LETTER HAH * 062C ARABIC LETTER JEEM * 064A ARABIC LETTER YEH * FDC0 ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM * 0645 ARABIC LETTER MEEM * 062C ARABIC LETTER JEEM * 064A ARABIC LETTER YEH * FDC1 ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM * 0641 ARABIC LETTER FEH * 0645 ARABIC LETTER MEEM * 064A ARABIC LETTER YEH * FDC2 ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM * 0628 ARABIC LETTER BEH * 062D ARABIC LETTER HAH * 064A ARABIC LETTER YEH * FDC3 ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM * 0643 ARABIC LETTER KAF * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FDC4 ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM * 0639 ARABIC LETTER AIN * 062C ARABIC LETTER JEEM * 0645 ARABIC LETTER MEEM * FDC5 ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM * 0635 ARABIC LETTER SAD * 0645 ARABIC LETTER MEEM * 0645 ARABIC LETTER MEEM * FDC6 ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM * 0633 ARABIC LETTER SEEN * 062E ARABIC LETTER KHAH * 064A ARABIC LETTER YEH * FDC7 ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM * 0646 ARABIC LETTER NOON * 062C ARABIC LETTER JEEM * 064A ARABIC LETTER YEH * FDF0 ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM * 0635 ARABIC LETTER SAD * 0644 ARABIC LETTER LAM * 06D2 ARABIC LETTER YEH BARREE * FDF1 ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM * 0642 ARABIC LETTER QAF * 0644 ARABIC LETTER LAM * 06D2 ARABIC LETTER YEH BARREE * FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM * 0627 ARABIC LETTER ALEF * 0644 ARABIC LETTER LAM * 0644 ARABIC LETTER LAM * 0647 ARABIC LETTER HEH * FDF3 ARABIC LIGATURE AKBAR ISOLATED FORM * 0627 ARABIC LETTER ALEF * 0643 ARABIC LETTER KAF * 0628 ARABIC LETTER BEH * 0631 ARABIC LETTER REH * FDF4 ARABIC LIGATURE MOHAMMAD ISOLATED FORM * 0645 ARABIC LETTER MEEM * 062D ARABIC LETTER HAH * 0645 ARABIC LETTER MEEM * 062F ARABIC LETTER DAL * FDF5 ARABIC LIGATURE SALAM ISOLATED FORM * 0635 ARABIC LETTER SAD * 0644 ARABIC LETTER LAM * 0639 ARABIC LETTER AIN * 0645 ARABIC LETTER MEEM * FDF6 ARABIC LIGATURE RASOUL ISOLATED FORM * 0631 ARABIC LETTER REH * 0633 ARABIC LETTER SEEN * 0648 ARABIC LETTER WAW * 0644 ARABIC LETTER LAM * FDF7 ARABIC LIGATURE ALAYHE ISOLATED FORM * 0639 ARABIC LETTER AIN * 0644 ARABIC LETTER LAM * 064A ARABIC LETTER YEH * 0647 ARABIC LETTER HEH * FDF8 ARABIC LIGATURE WASALLAM ISOLATED FORM * 0648 ARABIC LETTER WAW * 0633 ARABIC LETTER SEEN * 0644 ARABIC LETTER LAM * 0645 ARABIC LETTER MEEM * FDF9 ARABIC LIGATURE SALLA ISOLATED FORM * 0635 ARABIC LETTER SAD * 0644 ARABIC LETTER LAM * 0649 ARABIC LETTER ALEF MAKSURA * FDFA ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM * 0635 ARABIC LETTER SAD * 0644 ARABIC LETTER LAM * 0649 ARABIC LETTER ALEF MAKSURA * 0020 SPACE * 0627 ARABIC LETTER ALEF * 0644 ARABIC LETTER LAM * 0644 ARABIC LETTER LAM * 0647 ARABIC LETTER HEH * 0020 SPACE * 0639 ARABIC LETTER AIN * 0644 ARABIC LETTER LAM * 064A ARABIC LETTER YEH * 0647 ARABIC LETTER HEH * 0020 SPACE * 0648 ARABIC LETTER WAW * 0633 ARABIC LETTER SEEN * 0644 ARABIC LETTER LAM * 0645 ARABIC LETTER MEEM * FDFB ARABIC LIGATURE JALLAJALALOUHOU * 062C ARABIC LETTER JEEM * 0644 ARABIC LETTER LAM * 0020 SPACE * 062C ARABIC LETTER JEEM * 0644 ARABIC LETTER LAM * 0627 ARABIC LETTER ALEF * 0644 ARABIC LETTER LAM * 0647 ARABIC LETTER HEH * FDFC RIAL SIGN * 0631 ARABIC LETTER REH * 06CC ARABIC LETTER FARSI YEH * 0627 ARABIC LETTER ALEF * 0644 ARABIC LETTER LAM * FE00 VARIATION SELECTOR-1 * 0000 * FE01 VARIATION SELECTOR-2 * 0000 * FE02 VARIATION SELECTOR-3 * 0000 * FE03 VARIATION SELECTOR-4 * 0000 * FE04 VARIATION SELECTOR-5 * 0000 * FE05 VARIATION SELECTOR-6 * 0000 * FE06 VARIATION SELECTOR-7 * 0000 * FE07 VARIATION SELECTOR-8 * 0000 * FE08 VARIATION SELECTOR-9 * 0000 * FE09 VARIATION SELECTOR-10 * 0000 * FE0A VARIATION SELECTOR-11 * 0000 * FE0B VARIATION SELECTOR-12 * 0000 * FE0C VARIATION SELECTOR-13 * 0000 * FE0D VARIATION SELECTOR-14 * 0000 * FE0E VARIATION SELECTOR-15 * 0000 * FE0F VARIATION SELECTOR-16 * 0000 * FE10 PRESENTATION FORM FOR VERTICAL COMMA * 002C COMMA * FE11 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA * 3001 IDEOGRAPHIC COMMA * FE12 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP * 3002 IDEOGRAPHIC FULL STOP * FE13 PRESENTATION FORM FOR VERTICAL COLON * 003A COLON * FE14 PRESENTATION FORM FOR VERTICAL SEMICOLON * 003B SEMICOLON * FE15 PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK * 0021 EXCLAMATION MARK * FE16 PRESENTATION FORM FOR VERTICAL QUESTION MARK * 003F QUESTION MARK * FE17 PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET * 3016 LEFT WHITE LENTICULAR BRACKET * FE18 PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET * 3017 RIGHT WHITE LENTICULAR BRACKET * FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS * 002E FULL STOP * 002E FULL STOP * 002E FULL STOP * FE20 COMBINING LIGATURE LEFT HALF * 0000 * FE21 COMBINING LIGATURE RIGHT HALF * 0000 * FE22 COMBINING DOUBLE TILDE LEFT HALF * 0000 * FE23 COMBINING DOUBLE TILDE RIGHT HALF * 0000 * FE24 COMBINING MACRON LEFT HALF * 0000 * FE25 COMBINING MACRON RIGHT HALF * 0000 * FE26 COMBINING CONJOINING MACRON * 0000 * FE30 PRESENTATION FORM FOR VERTICAL TWO DOT LEADER * 002E FULL STOP * 002E FULL STOP * FE31 PRESENTATION FORM FOR VERTICAL EM DASH * 2014 EM DASH * FE32 PRESENTATION FORM FOR VERTICAL EN DASH * 2013 EN DASH * FE33 PRESENTATION FORM FOR VERTICAL LOW LINE * 005F LOW LINE * FE34 PRESENTATION FORM FOR VERTICAL WAVY LOW LINE * 005F LOW LINE * FE35 PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS * 0028 LEFT PARENTHESIS * FE36 PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS * 0029 RIGHT PARENTHESIS * FE37 PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET * 007B LEFT CURLY BRACKET * FE38 PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET * 007D RIGHT CURLY BRACKET * FE39 PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET * 3014 LEFT TORTOISE SHELL BRACKET * FE3A PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET * 3015 RIGHT TORTOISE SHELL BRACKET * FE3B PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET * 3010 LEFT BLACK LENTICULAR BRACKET * FE3C PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET * 3011 RIGHT BLACK LENTICULAR BRACKET * FE3D PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET * 300A LEFT DOUBLE ANGLE BRACKET * FE3E PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET * 300B RIGHT DOUBLE ANGLE BRACKET * FE3F PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET * 3008 LEFT ANGLE BRACKET * FE40 PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET * 3009 RIGHT ANGLE BRACKET * FE41 PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET * 300C LEFT CORNER BRACKET * FE42 PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET * 300D RIGHT CORNER BRACKET * FE43 PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET * 300E LEFT WHITE CORNER BRACKET * FE44 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET * 300F RIGHT WHITE CORNER BRACKET * FE47 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET * 005B LEFT SQUARE BRACKET * FE48 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET * 005D RIGHT SQUARE BRACKET * FE49 DASHED OVERLINE * 0020 SPACE * FE4A CENTRELINE OVERLINE * 0020 SPACE * FE4B WAVY OVERLINE * 0020 SPACE * FE4C DOUBLE WAVY OVERLINE * 0020 SPACE * FE4D DASHED LOW LINE * 005F LOW LINE * FE4E CENTRELINE LOW LINE * 005F LOW LINE * FE4F WAVY LOW LINE * 005F LOW LINE * FE50 SMALL COMMA * 002C COMMA * FE51 SMALL IDEOGRAPHIC COMMA * 3001 IDEOGRAPHIC COMMA * FE52 SMALL FULL STOP * 002E FULL STOP * FE54 SMALL SEMICOLON * 003B SEMICOLON * FE55 SMALL COLON * 003A COLON * FE56 SMALL QUESTION MARK * 003F QUESTION MARK * FE57 SMALL EXCLAMATION MARK * 0021 EXCLAMATION MARK * FE58 SMALL EM DASH * 2014 EM DASH * FE59 SMALL LEFT PARENTHESIS * 0028 LEFT PARENTHESIS * FE5A SMALL RIGHT PARENTHESIS * 0029 RIGHT PARENTHESIS * FE5B SMALL LEFT CURLY BRACKET * 007B LEFT CURLY BRACKET * FE5C SMALL RIGHT CURLY BRACKET * 007D RIGHT CURLY BRACKET * FE5D SMALL LEFT TORTOISE SHELL BRACKET * 3014 LEFT TORTOISE SHELL BRACKET * FE5E SMALL RIGHT TORTOISE SHELL BRACKET * 3015 RIGHT TORTOISE SHELL BRACKET * FE5F SMALL NUMBER SIGN * 0023 NUMBER SIGN * FE60 SMALL AMPERSAND * 0026 AMPERSAND * FE61 SMALL ASTERISK * 002A ASTERISK * FE62 SMALL PLUS SIGN * 002B PLUS SIGN * FE63 SMALL HYPHEN-MINUS * 002D HYPHEN-MINUS * FE64 SMALL LESS-THAN SIGN * 003C LESS-THAN SIGN * FE65 SMALL GREATER-THAN SIGN * 003E GREATER-THAN SIGN * FE66 SMALL EQUALS SIGN * 003D EQUALS SIGN * FE68 SMALL REVERSE SOLIDUS * 005C REVERSE SOLIDUS * FE69 SMALL DOLLAR SIGN * 0024 DOLLAR SIGN * FE6A SMALL PERCENT SIGN * 0025 PERCENT SIGN * FE6B SMALL COMMERCIAL AT * 0040 COMMERCIAL AT * FE70 ARABIC FATHATAN ISOLATED FORM * 0020 SPACE * FE71 ARABIC TATWEEL WITH FATHATAN ABOVE * 0640 ARABIC TATWEEL * FE72 ARABIC DAMMATAN ISOLATED FORM * 0020 SPACE * FE74 ARABIC KASRATAN ISOLATED FORM * 0020 SPACE * FE76 ARABIC FATHA ISOLATED FORM * 0020 SPACE * FE77 ARABIC FATHA MEDIAL FORM * 0640 ARABIC TATWEEL * FE78 ARABIC DAMMA ISOLATED FORM * 0020 SPACE * FE79 ARABIC DAMMA MEDIAL FORM * 0640 ARABIC TATWEEL * FE7A ARABIC KASRA ISOLATED FORM * 0020 SPACE * FE7B ARABIC KASRA MEDIAL FORM * 0640 ARABIC TATWEEL * FE7C ARABIC SHADDA ISOLATED FORM * 0020 SPACE * FE7D ARABIC SHADDA MEDIAL FORM * 0640 ARABIC TATWEEL * FE7E ARABIC SUKUN ISOLATED FORM * 0020 SPACE * FE7F ARABIC SUKUN MEDIAL FORM * 0640 ARABIC TATWEEL * FE80 ARABIC LETTER HAMZA ISOLATED FORM * 0621 ARABIC LETTER HAMZA * FE81 ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM * 0627 ARABIC LETTER ALEF * FE82 ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM * 0627 ARABIC LETTER ALEF * FE83 ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM * 0627 ARABIC LETTER ALEF * FE84 ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM * 0627 ARABIC LETTER ALEF * FE85 ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM * 0648 ARABIC LETTER WAW * FE86 ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM * 0648 ARABIC LETTER WAW * FE87 ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM * 0627 ARABIC LETTER ALEF * FE88 ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM * 0627 ARABIC LETTER ALEF * FE89 ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM * 064A ARABIC LETTER YEH * FE8A ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM * 064A ARABIC LETTER YEH * FE8B ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM * 064A ARABIC LETTER YEH * FE8C ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM * 064A ARABIC LETTER YEH * FE8D ARABIC LETTER ALEF ISOLATED FORM * 0627 ARABIC LETTER ALEF * FE8E ARABIC LETTER ALEF FINAL FORM * 0627 ARABIC LETTER ALEF * FE8F ARABIC LETTER BEH ISOLATED FORM * 0628 ARABIC LETTER BEH * FE90 ARABIC LETTER BEH FINAL FORM * 0628 ARABIC LETTER BEH * FE91 ARABIC LETTER BEH INITIAL FORM * 0628 ARABIC LETTER BEH * FE92 ARABIC LETTER BEH MEDIAL FORM * 0628 ARABIC LETTER BEH * FE93 ARABIC LETTER TEH MARBUTA ISOLATED FORM * 0629 ARABIC LETTER TEH MARBUTA * FE94 ARABIC LETTER TEH MARBUTA FINAL FORM * 0629 ARABIC LETTER TEH MARBUTA * FE95 ARABIC LETTER TEH ISOLATED FORM * 062A ARABIC LETTER TEH * FE96 ARABIC LETTER TEH FINAL FORM * 062A ARABIC LETTER TEH * FE97 ARABIC LETTER TEH INITIAL FORM * 062A ARABIC LETTER TEH * FE98 ARABIC LETTER TEH MEDIAL FORM * 062A ARABIC LETTER TEH * FE99 ARABIC LETTER THEH ISOLATED FORM * 062B ARABIC LETTER THEH * FE9A ARABIC LETTER THEH FINAL FORM * 062B ARABIC LETTER THEH * FE9B ARABIC LETTER THEH INITIAL FORM * 062B ARABIC LETTER THEH * FE9C ARABIC LETTER THEH MEDIAL FORM * 062B ARABIC LETTER THEH * FE9D ARABIC LETTER JEEM ISOLATED FORM * 062C ARABIC LETTER JEEM * FE9E ARABIC LETTER JEEM FINAL FORM * 062C ARABIC LETTER JEEM * FE9F ARABIC LETTER JEEM INITIAL FORM * 062C ARABIC LETTER JEEM * FEA0 ARABIC LETTER JEEM MEDIAL FORM * 062C ARABIC LETTER JEEM * FEA1 ARABIC LETTER HAH ISOLATED FORM * 062D ARABIC LETTER HAH * FEA2 ARABIC LETTER HAH FINAL FORM * 062D ARABIC LETTER HAH * FEA3 ARABIC LETTER HAH INITIAL FORM * 062D ARABIC LETTER HAH * FEA4 ARABIC LETTER HAH MEDIAL FORM * 062D ARABIC LETTER HAH * FEA5 ARABIC LETTER KHAH ISOLATED FORM * 062E ARABIC LETTER KHAH * FEA6 ARABIC LETTER KHAH FINAL FORM * 062E ARABIC LETTER KHAH * FEA7 ARABIC LETTER KHAH INITIAL FORM * 062E ARABIC LETTER KHAH * FEA8 ARABIC LETTER KHAH MEDIAL FORM * 062E ARABIC LETTER KHAH * FEA9 ARABIC LETTER DAL ISOLATED FORM * 062F ARABIC LETTER DAL * FEAA ARABIC LETTER DAL FINAL FORM * 062F ARABIC LETTER DAL * FEAB ARABIC LETTER THAL ISOLATED FORM * 0630 ARABIC LETTER THAL * FEAC ARABIC LETTER THAL FINAL FORM * 0630 ARABIC LETTER THAL * FEAD ARABIC LETTER REH ISOLATED FORM * 0631 ARABIC LETTER REH * FEAE ARABIC LETTER REH FINAL FORM * 0631 ARABIC LETTER REH * FEAF ARABIC LETTER ZAIN ISOLATED FORM * 0632 ARABIC LETTER ZAIN * FEB0 ARABIC LETTER ZAIN FINAL FORM * 0632 ARABIC LETTER ZAIN * FEB1 ARABIC LETTER SEEN ISOLATED FORM * 0633 ARABIC LETTER SEEN * FEB2 ARABIC LETTER SEEN FINAL FORM * 0633 ARABIC LETTER SEEN * FEB3 ARABIC LETTER SEEN INITIAL FORM * 0633 ARABIC LETTER SEEN * FEB4 ARABIC LETTER SEEN MEDIAL FORM * 0633 ARABIC LETTER SEEN * FEB5 ARABIC LETTER SHEEN ISOLATED FORM * 0634 ARABIC LETTER SHEEN * FEB6 ARABIC LETTER SHEEN FINAL FORM * 0634 ARABIC LETTER SHEEN * FEB7 ARABIC LETTER SHEEN INITIAL FORM * 0634 ARABIC LETTER SHEEN * FEB8 ARABIC LETTER SHEEN MEDIAL FORM * 0634 ARABIC LETTER SHEEN * FEB9 ARABIC LETTER SAD ISOLATED FORM * 0635 ARABIC LETTER SAD * FEBA ARABIC LETTER SAD FINAL FORM * 0635 ARABIC LETTER SAD * FEBB ARABIC LETTER SAD INITIAL FORM * 0635 ARABIC LETTER SAD * FEBC ARABIC LETTER SAD MEDIAL FORM * 0635 ARABIC LETTER SAD * FEBD ARABIC LETTER DAD ISOLATED FORM * 0636 ARABIC LETTER DAD * FEBE ARABIC LETTER DAD FINAL FORM * 0636 ARABIC LETTER DAD * FEBF ARABIC LETTER DAD INITIAL FORM * 0636 ARABIC LETTER DAD * FEC0 ARABIC LETTER DAD MEDIAL FORM * 0636 ARABIC LETTER DAD * FEC1 ARABIC LETTER TAH ISOLATED FORM * 0637 ARABIC LETTER TAH * FEC2 ARABIC LETTER TAH FINAL FORM * 0637 ARABIC LETTER TAH * FEC3 ARABIC LETTER TAH INITIAL FORM * 0637 ARABIC LETTER TAH * FEC4 ARABIC LETTER TAH MEDIAL FORM * 0637 ARABIC LETTER TAH * FEC5 ARABIC LETTER ZAH ISOLATED FORM * 0638 ARABIC LETTER ZAH * FEC6 ARABIC LETTER ZAH FINAL FORM * 0638 ARABIC LETTER ZAH * FEC7 ARABIC LETTER ZAH INITIAL FORM * 0638 ARABIC LETTER ZAH * FEC8 ARABIC LETTER ZAH MEDIAL FORM * 0638 ARABIC LETTER ZAH * FEC9 ARABIC LETTER AIN ISOLATED FORM * 0639 ARABIC LETTER AIN * FECA ARABIC LETTER AIN FINAL FORM * 0639 ARABIC LETTER AIN * FECB ARABIC LETTER AIN INITIAL FORM * 0639 ARABIC LETTER AIN * FECC ARABIC LETTER AIN MEDIAL FORM * 0639 ARABIC LETTER AIN * FECD ARABIC LETTER GHAIN ISOLATED FORM * 063A ARABIC LETTER GHAIN * FECE ARABIC LETTER GHAIN FINAL FORM * 063A ARABIC LETTER GHAIN * FECF ARABIC LETTER GHAIN INITIAL FORM * 063A ARABIC LETTER GHAIN * FED0 ARABIC LETTER GHAIN MEDIAL FORM * 063A ARABIC LETTER GHAIN * FED1 ARABIC LETTER FEH ISOLATED FORM * 0641 ARABIC LETTER FEH * FED2 ARABIC LETTER FEH FINAL FORM * 0641 ARABIC LETTER FEH * FED3 ARABIC LETTER FEH INITIAL FORM * 0641 ARABIC LETTER FEH * FED4 ARABIC LETTER FEH MEDIAL FORM * 0641 ARABIC LETTER FEH * FED5 ARABIC LETTER QAF ISOLATED FORM * 0642 ARABIC LETTER QAF * FED6 ARABIC LETTER QAF FINAL FORM * 0642 ARABIC LETTER QAF * FED7 ARABIC LETTER QAF INITIAL FORM * 0642 ARABIC LETTER QAF * FED8 ARABIC LETTER QAF MEDIAL FORM * 0642 ARABIC LETTER QAF * FED9 ARABIC LETTER KAF ISOLATED FORM * 0643 ARABIC LETTER KAF * FEDA ARABIC LETTER KAF FINAL FORM * 0643 ARABIC LETTER KAF * FEDB ARABIC LETTER KAF INITIAL FORM * 0643 ARABIC LETTER KAF * FEDC ARABIC LETTER KAF MEDIAL FORM * 0643 ARABIC LETTER KAF * FEDD ARABIC LETTER LAM ISOLATED FORM * 0644 ARABIC LETTER LAM * FEDE ARABIC LETTER LAM FINAL FORM * 0644 ARABIC LETTER LAM * FEDF ARABIC LETTER LAM INITIAL FORM * 0644 ARABIC LETTER LAM * FEE0 ARABIC LETTER LAM MEDIAL FORM * 0644 ARABIC LETTER LAM * FEE1 ARABIC LETTER MEEM ISOLATED FORM * 0645 ARABIC LETTER MEEM * FEE2 ARABIC LETTER MEEM FINAL FORM * 0645 ARABIC LETTER MEEM * FEE3 ARABIC LETTER MEEM INITIAL FORM * 0645 ARABIC LETTER MEEM * FEE4 ARABIC LETTER MEEM MEDIAL FORM * 0645 ARABIC LETTER MEEM * FEE5 ARABIC LETTER NOON ISOLATED FORM * 0646 ARABIC LETTER NOON * FEE6 ARABIC LETTER NOON FINAL FORM * 0646 ARABIC LETTER NOON * FEE7 ARABIC LETTER NOON INITIAL FORM * 0646 ARABIC LETTER NOON * FEE8 ARABIC LETTER NOON MEDIAL FORM * 0646 ARABIC LETTER NOON * FEE9 ARABIC LETTER HEH ISOLATED FORM * 0647 ARABIC LETTER HEH * FEEA ARABIC LETTER HEH FINAL FORM * 0647 ARABIC LETTER HEH * FEEB ARABIC LETTER HEH INITIAL FORM * 0647 ARABIC LETTER HEH * FEEC ARABIC LETTER HEH MEDIAL FORM * 0647 ARABIC LETTER HEH * FEED ARABIC LETTER WAW ISOLATED FORM * 0648 ARABIC LETTER WAW * FEEE ARABIC LETTER WAW FINAL FORM * 0648 ARABIC LETTER WAW * FEEF ARABIC LETTER ALEF MAKSURA ISOLATED FORM * 0649 ARABIC LETTER ALEF MAKSURA * FEF0 ARABIC LETTER ALEF MAKSURA FINAL FORM * 0649 ARABIC LETTER ALEF MAKSURA * FEF1 ARABIC LETTER YEH ISOLATED FORM * 064A ARABIC LETTER YEH * FEF2 ARABIC LETTER YEH FINAL FORM * 064A ARABIC LETTER YEH * FEF3 ARABIC LETTER YEH INITIAL FORM * 064A ARABIC LETTER YEH * FEF4 ARABIC LETTER YEH MEDIAL FORM * 064A ARABIC LETTER YEH * FEF5 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM * 0644 ARABIC LETTER LAM * 0627 ARABIC LETTER ALEF * FEF6 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM * 0644 ARABIC LETTER LAM * 0627 ARABIC LETTER ALEF * FEF7 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM * 0644 ARABIC LETTER LAM * 0627 ARABIC LETTER ALEF * FEF8 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM * 0644 ARABIC LETTER LAM * 0627 ARABIC LETTER ALEF * FEF9 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM * 0644 ARABIC LETTER LAM * 0627 ARABIC LETTER ALEF * FEFA ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM * 0644 ARABIC LETTER LAM * 0627 ARABIC LETTER ALEF * FEFB ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM * 0644 ARABIC LETTER LAM * 0627 ARABIC LETTER ALEF * FEFC ARABIC LIGATURE LAM WITH ALEF FINAL FORM * 0644 ARABIC LETTER LAM * 0627 ARABIC LETTER ALEF * FF01 FULLWIDTH EXCLAMATION MARK * 0021 EXCLAMATION MARK * FF02 FULLWIDTH QUOTATION MARK * 0022 QUOTATION MARK * FF03 FULLWIDTH NUMBER SIGN * 0023 NUMBER SIGN * FF04 FULLWIDTH DOLLAR SIGN * 0024 DOLLAR SIGN * FF05 FULLWIDTH PERCENT SIGN * 0025 PERCENT SIGN * FF06 FULLWIDTH AMPERSAND * 0026 AMPERSAND * FF07 FULLWIDTH APOSTROPHE * 0027 APOSTROPHE * FF08 FULLWIDTH LEFT PARENTHESIS * 0028 LEFT PARENTHESIS * FF09 FULLWIDTH RIGHT PARENTHESIS * 0029 RIGHT PARENTHESIS * FF0A FULLWIDTH ASTERISK * 002A ASTERISK * FF0B FULLWIDTH PLUS SIGN * 002B PLUS SIGN * FF0C FULLWIDTH COMMA * 002C COMMA * FF0D FULLWIDTH HYPHEN-MINUS * 002D HYPHEN-MINUS * FF0E FULLWIDTH FULL STOP * 002E FULL STOP * FF0F FULLWIDTH SOLIDUS * 002F SOLIDUS * FF10 FULLWIDTH DIGIT ZERO * 0030 DIGIT ZERO * FF11 FULLWIDTH DIGIT ONE * 0031 DIGIT ONE * FF12 FULLWIDTH DIGIT TWO * 0032 DIGIT TWO * FF13 FULLWIDTH DIGIT THREE * 0033 DIGIT THREE * FF14 FULLWIDTH DIGIT FOUR * 0034 DIGIT FOUR * FF15 FULLWIDTH DIGIT FIVE * 0035 DIGIT FIVE * FF16 FULLWIDTH DIGIT SIX * 0036 DIGIT SIX * FF17 FULLWIDTH DIGIT SEVEN * 0037 DIGIT SEVEN * FF18 FULLWIDTH DIGIT EIGHT * 0038 DIGIT EIGHT * FF19 FULLWIDTH DIGIT NINE * 0039 DIGIT NINE * FF1A FULLWIDTH COLON * 003A COLON * FF1B FULLWIDTH SEMICOLON * 003B SEMICOLON * FF1C FULLWIDTH LESS-THAN SIGN * 003C LESS-THAN SIGN * FF1D FULLWIDTH EQUALS SIGN * 003D EQUALS SIGN * FF1E FULLWIDTH GREATER-THAN SIGN * 003E GREATER-THAN SIGN * FF1F FULLWIDTH QUESTION MARK * 003F QUESTION MARK * FF20 FULLWIDTH COMMERCIAL AT * 0040 COMMERCIAL AT * FF21 FULLWIDTH LATIN CAPITAL LETTER A * 0041 LATIN CAPITAL LETTER A * FF22 FULLWIDTH LATIN CAPITAL LETTER B * 0042 LATIN CAPITAL LETTER B * FF23 FULLWIDTH LATIN CAPITAL LETTER C * 0043 LATIN CAPITAL LETTER C * FF24 FULLWIDTH LATIN CAPITAL LETTER D * 0044 LATIN CAPITAL LETTER D * FF25 FULLWIDTH LATIN CAPITAL LETTER E * 0045 LATIN CAPITAL LETTER E * FF26 FULLWIDTH LATIN CAPITAL LETTER F * 0046 LATIN CAPITAL LETTER F * FF27 FULLWIDTH LATIN CAPITAL LETTER G * 0047 LATIN CAPITAL LETTER G * FF28 FULLWIDTH LATIN CAPITAL LETTER H * 0048 LATIN CAPITAL LETTER H * FF29 FULLWIDTH LATIN CAPITAL LETTER I * 0049 LATIN CAPITAL LETTER I * FF2A FULLWIDTH LATIN CAPITAL LETTER J * 004A LATIN CAPITAL LETTER J * FF2B FULLWIDTH LATIN CAPITAL LETTER K * 004B LATIN CAPITAL LETTER K * FF2C FULLWIDTH LATIN CAPITAL LETTER L * 004C LATIN CAPITAL LETTER L * FF2D FULLWIDTH LATIN CAPITAL LETTER M * 004D LATIN CAPITAL LETTER M * FF2E FULLWIDTH LATIN CAPITAL LETTER N * 004E LATIN CAPITAL LETTER N * FF2F FULLWIDTH LATIN CAPITAL LETTER O * 004F LATIN CAPITAL LETTER O * FF30 FULLWIDTH LATIN CAPITAL LETTER P * 0050 LATIN CAPITAL LETTER P * FF31 FULLWIDTH LATIN CAPITAL LETTER Q * 0051 LATIN CAPITAL LETTER Q * FF32 FULLWIDTH LATIN CAPITAL LETTER R * 0052 LATIN CAPITAL LETTER R * FF33 FULLWIDTH LATIN CAPITAL LETTER S * 0053 LATIN CAPITAL LETTER S * FF34 FULLWIDTH LATIN CAPITAL LETTER T * 0054 LATIN CAPITAL LETTER T * FF35 FULLWIDTH LATIN CAPITAL LETTER U * 0055 LATIN CAPITAL LETTER U * FF36 FULLWIDTH LATIN CAPITAL LETTER V * 0056 LATIN CAPITAL LETTER V * FF37 FULLWIDTH LATIN CAPITAL LETTER W * 0057 LATIN CAPITAL LETTER W * FF38 FULLWIDTH LATIN CAPITAL LETTER X * 0058 LATIN CAPITAL LETTER X * FF39 FULLWIDTH LATIN CAPITAL LETTER Y * 0059 LATIN CAPITAL LETTER Y * FF3A FULLWIDTH LATIN CAPITAL LETTER Z * 005A LATIN CAPITAL LETTER Z * FF3B FULLWIDTH LEFT SQUARE BRACKET * 005B LEFT SQUARE BRACKET * FF3C FULLWIDTH REVERSE SOLIDUS * 005C REVERSE SOLIDUS * FF3D FULLWIDTH RIGHT SQUARE BRACKET * 005D RIGHT SQUARE BRACKET * FF3E FULLWIDTH CIRCUMFLEX ACCENT * 005E CIRCUMFLEX ACCENT * FF3F FULLWIDTH LOW LINE * 005F LOW LINE * FF40 FULLWIDTH GRAVE ACCENT * 0060 GRAVE ACCENT * FF41 FULLWIDTH LATIN SMALL LETTER A * 0061 LATIN SMALL LETTER A * FF42 FULLWIDTH LATIN SMALL LETTER B * 0062 LATIN SMALL LETTER B * FF43 FULLWIDTH LATIN SMALL LETTER C * 0063 LATIN SMALL LETTER C * FF44 FULLWIDTH LATIN SMALL LETTER D * 0064 LATIN SMALL LETTER D * FF45 FULLWIDTH LATIN SMALL LETTER E * 0065 LATIN SMALL LETTER E * FF46 FULLWIDTH LATIN SMALL LETTER F * 0066 LATIN SMALL LETTER F * FF47 FULLWIDTH LATIN SMALL LETTER G * 0067 LATIN SMALL LETTER G * FF48 FULLWIDTH LATIN SMALL LETTER H * 0068 LATIN SMALL LETTER H * FF49 FULLWIDTH LATIN SMALL LETTER I * 0069 LATIN SMALL LETTER I * FF4A FULLWIDTH LATIN SMALL LETTER J * 006A LATIN SMALL LETTER J * FF4B FULLWIDTH LATIN SMALL LETTER K * 006B LATIN SMALL LETTER K * FF4C FULLWIDTH LATIN SMALL LETTER L * 006C LATIN SMALL LETTER L * FF4D FULLWIDTH LATIN SMALL LETTER M * 006D LATIN SMALL LETTER M * FF4E FULLWIDTH LATIN SMALL LETTER N * 006E LATIN SMALL LETTER N * FF4F FULLWIDTH LATIN SMALL LETTER O * 006F LATIN SMALL LETTER O * FF50 FULLWIDTH LATIN SMALL LETTER P * 0070 LATIN SMALL LETTER P * FF51 FULLWIDTH LATIN SMALL LETTER Q * 0071 LATIN SMALL LETTER Q * FF52 FULLWIDTH LATIN SMALL LETTER R * 0072 LATIN SMALL LETTER R * FF53 FULLWIDTH LATIN SMALL LETTER S * 0073 LATIN SMALL LETTER S * FF54 FULLWIDTH LATIN SMALL LETTER T * 0074 LATIN SMALL LETTER T * FF55 FULLWIDTH LATIN SMALL LETTER U * 0075 LATIN SMALL LETTER U * FF56 FULLWIDTH LATIN SMALL LETTER V * 0076 LATIN SMALL LETTER V * FF57 FULLWIDTH LATIN SMALL LETTER W * 0077 LATIN SMALL LETTER W * FF58 FULLWIDTH LATIN SMALL LETTER X * 0078 LATIN SMALL LETTER X * FF59 FULLWIDTH LATIN SMALL LETTER Y * 0079 LATIN SMALL LETTER Y * FF5A FULLWIDTH LATIN SMALL LETTER Z * 007A LATIN SMALL LETTER Z * FF5B FULLWIDTH LEFT CURLY BRACKET * 007B LEFT CURLY BRACKET * FF5C FULLWIDTH VERTICAL LINE * 007C VERTICAL LINE * FF5D FULLWIDTH RIGHT CURLY BRACKET * 007D RIGHT CURLY BRACKET * FF5E FULLWIDTH TILDE * 007E TILDE * FF5F FULLWIDTH LEFT WHITE PARENTHESIS * 2985 LEFT WHITE PARENTHESIS * FF60 FULLWIDTH RIGHT WHITE PARENTHESIS * 2986 RIGHT WHITE PARENTHESIS * FF61 HALFWIDTH IDEOGRAPHIC FULL STOP * 3002 IDEOGRAPHIC FULL STOP * FF62 HALFWIDTH LEFT CORNER BRACKET * 300C LEFT CORNER BRACKET * FF63 HALFWIDTH RIGHT CORNER BRACKET * 300D RIGHT CORNER BRACKET * FF64 HALFWIDTH IDEOGRAPHIC COMMA * 3001 IDEOGRAPHIC COMMA * FFA0 HALFWIDTH HANGUL FILLER * 1160 HANGUL JUNGSEONG FILLER * FFA1 HALFWIDTH HANGUL LETTER KIYEOK * 1100 HANGUL CHOSEONG KIYEOK * FFA2 HALFWIDTH HANGUL LETTER SSANGKIYEOK * 1101 HANGUL CHOSEONG SSANGKIYEOK * FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS * 11AA HANGUL JONGSEONG KIYEOK-SIOS * FFA4 HALFWIDTH HANGUL LETTER NIEUN * 1102 HANGUL CHOSEONG NIEUN * FFA5 HALFWIDTH HANGUL LETTER NIEUN-CIEUC * 11AC HANGUL JONGSEONG NIEUN-CIEUC * FFA6 HALFWIDTH HANGUL LETTER NIEUN-HIEUH * 11AD HANGUL JONGSEONG NIEUN-HIEUH * FFA7 HALFWIDTH HANGUL LETTER TIKEUT * 1103 HANGUL CHOSEONG TIKEUT * FFA8 HALFWIDTH HANGUL LETTER SSANGTIKEUT * 1104 HANGUL CHOSEONG SSANGTIKEUT * FFA9 HALFWIDTH HANGUL LETTER RIEUL * 1105 HANGUL CHOSEONG RIEUL * FFAA HALFWIDTH HANGUL LETTER RIEUL-KIYEOK * 11B0 HANGUL JONGSEONG RIEUL-KIYEOK * FFAB HALFWIDTH HANGUL LETTER RIEUL-MIEUM * 11B1 HANGUL JONGSEONG RIEUL-MIEUM * FFAC HALFWIDTH HANGUL LETTER RIEUL-PIEUP * 11B2 HANGUL JONGSEONG RIEUL-PIEUP * FFAD HALFWIDTH HANGUL LETTER RIEUL-SIOS * 11B3 HANGUL JONGSEONG RIEUL-SIOS * FFAE HALFWIDTH HANGUL LETTER RIEUL-THIEUTH * 11B4 HANGUL JONGSEONG RIEUL-THIEUTH * FFAF HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH * 11B5 HANGUL JONGSEONG RIEUL-PHIEUPH * FFB0 HALFWIDTH HANGUL LETTER RIEUL-HIEUH * 111A HANGUL CHOSEONG RIEUL-HIEUH * FFB1 HALFWIDTH HANGUL LETTER MIEUM * 1106 HANGUL CHOSEONG MIEUM * FFB2 HALFWIDTH HANGUL LETTER PIEUP * 1107 HANGUL CHOSEONG PIEUP * FFB3 HALFWIDTH HANGUL LETTER SSANGPIEUP * 1108 HANGUL CHOSEONG SSANGPIEUP * FFB4 HALFWIDTH HANGUL LETTER PIEUP-SIOS * 1121 HANGUL CHOSEONG PIEUP-SIOS * FFB5 HALFWIDTH HANGUL LETTER SIOS * 1109 HANGUL CHOSEONG SIOS * FFB6 HALFWIDTH HANGUL LETTER SSANGSIOS * 110A HANGUL CHOSEONG SSANGSIOS * FFB7 HALFWIDTH HANGUL LETTER IEUNG * 110B HANGUL CHOSEONG IEUNG * FFB8 HALFWIDTH HANGUL LETTER CIEUC * 110C HANGUL CHOSEONG CIEUC * FFB9 HALFWIDTH HANGUL LETTER SSANGCIEUC * 110D HANGUL CHOSEONG SSANGCIEUC * FFBA HALFWIDTH HANGUL LETTER CHIEUCH * 110E HANGUL CHOSEONG CHIEUCH * FFBB HALFWIDTH HANGUL LETTER KHIEUKH * 110F HANGUL CHOSEONG KHIEUKH * FFBC HALFWIDTH HANGUL LETTER THIEUTH * 1110 HANGUL CHOSEONG THIEUTH * FFBD HALFWIDTH HANGUL LETTER PHIEUPH * 1111 HANGUL CHOSEONG PHIEUPH * FFBE HALFWIDTH HANGUL LETTER HIEUH * 1112 HANGUL CHOSEONG HIEUH * FFC2 HALFWIDTH HANGUL LETTER A * 1161 HANGUL JUNGSEONG A * FFC3 HALFWIDTH HANGUL LETTER AE * 1162 HANGUL JUNGSEONG AE * FFC4 HALFWIDTH HANGUL LETTER YA * 1163 HANGUL JUNGSEONG YA * FFC5 HALFWIDTH HANGUL LETTER YAE * 1164 HANGUL JUNGSEONG YAE * FFC6 HALFWIDTH HANGUL LETTER EO * 1165 HANGUL JUNGSEONG EO * FFC7 HALFWIDTH HANGUL LETTER E * 1166 HANGUL JUNGSEONG E * FFCA HALFWIDTH HANGUL LETTER YEO * 1167 HANGUL JUNGSEONG YEO * FFCB HALFWIDTH HANGUL LETTER YE * 1168 HANGUL JUNGSEONG YE * FFCC HALFWIDTH HANGUL LETTER O * 1169 HANGUL JUNGSEONG O * FFCD HALFWIDTH HANGUL LETTER WA * 116A HANGUL JUNGSEONG WA * FFCE HALFWIDTH HANGUL LETTER WAE * 116B HANGUL JUNGSEONG WAE * FFCF HALFWIDTH HANGUL LETTER OE * 116C HANGUL JUNGSEONG OE * FFD2 HALFWIDTH HANGUL LETTER YO * 116D HANGUL JUNGSEONG YO * FFD3 HALFWIDTH HANGUL LETTER U * 116E HANGUL JUNGSEONG U * FFD4 HALFWIDTH HANGUL LETTER WEO * 116F HANGUL JUNGSEONG WEO * FFD5 HALFWIDTH HANGUL LETTER WE * 1170 HANGUL JUNGSEONG WE * FFD6 HALFWIDTH HANGUL LETTER WI * 1171 HANGUL JUNGSEONG WI * FFD7 HALFWIDTH HANGUL LETTER YU * 1172 HANGUL JUNGSEONG YU * FFDA HALFWIDTH HANGUL LETTER EU * 1173 HANGUL JUNGSEONG EU * FFDB HALFWIDTH HANGUL LETTER YI * 1174 HANGUL JUNGSEONG YI * FFDC HALFWIDTH HANGUL LETTER I * 1175 HANGUL JUNGSEONG I * FFE0 FULLWIDTH CENT SIGN * 00A2 CENT SIGN * FFE1 FULLWIDTH POUND SIGN * 00A3 POUND SIGN * FFE2 FULLWIDTH NOT SIGN * 00AC NOT SIGN * FFE3 FULLWIDTH MACRON * 0020 SPACE * FFE4 FULLWIDTH BROKEN BAR * 00A6 BROKEN BAR * FFE5 FULLWIDTH YEN SIGN * 00A5 YEN SIGN * FFE6 FULLWIDTH WON SIGN * 20A9 WON SIGN * FFE8 HALFWIDTH FORMS LIGHT VERTICAL * 2502 BOX DRAWINGS LIGHT VERTICAL * FFE9 HALFWIDTH LEFTWARDS ARROW * 2190 LEFTWARDS ARROW * FFEA HALFWIDTH UPWARDS ARROW * 2191 UPWARDS ARROW * FFEB HALFWIDTH RIGHTWARDS ARROW * 2192 RIGHTWARDS ARROW * FFEC HALFWIDTH DOWNWARDS ARROW * 2193 DOWNWARDS ARROW * FFED HALFWIDTH BLACK SQUARE * 25A0 BLACK SQUARE * FFEE HALFWIDTH WHITE CIRCLE * 25CB WHITE CIRCLE */ unsigned short unac_indexes[UNAC_INDEXES_SIZE] = { 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 30, 0, 31, 32, 0, 33, 33, 33, 33, 33, 33, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 0, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 0, 64, 65, 33, 66, 67, 0, 0, 0, 0, 68, 69, 0, 70, 71, 0, 72, 0, 0, 0, 0, 73, 74, 75, 0, 0, 76, 0, 33, 68, 0, 0, 0, 0, 0, 77, 78, 0, 0, 70, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 81, 82, 83, 84, 85, 0, 80, 0, 0, 86, 87, 88, 85, 0, 80, 0, 0, 89, 90, 91, 0, 92, 80, 0, 0, 86, 93, 0, 85, 0, 80, 0, 0, 86, 87, 94, 85, 0, 95, 96, 0, 97, 98, 99, 0, 0, 80, 0, 0, 97, 100, 101, 85, 0, 85, 0, 0, 86, 100, 101, 85, 0, 85, 0, 0, 97, 100, 99, 85, 0, 85, 0, 0, 0, 102, 103, 0, 85, 0, 0, 0, 104, 105, 0, 0, 0, 0, 0, 0, 106, 107, 108, 0, 0, 109, 110, 0, 111, 112, 113, 114, 65, 115, 116, 33, 117, 118, 0, 0, 0, 0, 0, 119, 71, 0, 120, 121, 122, 123, 0, 124, 125, 126, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 129, 0, 85, 0, 85, 0, 0, 0, 77, 33, 130, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 133, 133, 0, 0, 0, 0, 0, 0, 0, 33, 134, 0, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 137, 0, 138, 139, 0, 70, 79, 140, 0, 141, 0, 0, 0, 0, 0, 0, 0, 138, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 144, 145, 146, 147, 148, 0, 149, 150, 151, 33, 33, 152, 97, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 169, 171, 175, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 0, 188, 189, 190, 191, 0, 0, 33, 33, 78, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 0, 203, 0, 0, 0, 204, 0, 205, 206, 207, 0, 208, 209, 210, 0, 211, 0, 0, 0, 212, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214, 215, 216, 217, 218, 219, 220, 221, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, 228, 0, 0, 0, 229, 230, 231, 232, 233, 234, 235, 236, 237, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 0, 0, 255, 0, 256, 257, 0, 0, 0, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 260, 261, 262, 263, 264, 265, 0, 0, 0, 0, 0, 0, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 299, 300, 301, 302, 303, 0, 0, 0, 0, 0, 0, 0, 0, 304, 305, 306, 307, 308, 309, 310, 0, 0, 0, 0, 0, 0, 0, 311, 0, 312, 0, 0, 0, 0, 0, 313, 0, 0, 138, 139, 0, 0, 0, 0, 0, 314, 0, 315, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 316, 152, 317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 0, 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 0, 383, 384, 385, 386, 387, 388, 389, 390, 0, 0, 391, 33, 392, 152, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 0, 0, 0, 413, 414, 415, 416, 417, 0 }; unsigned char unac_positions[UNAC_BLOCK_COUNT][2*UNAC_BLOCK_SIZE + 1] = { /* 0 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 1 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 2 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 3 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 4 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 27, 30, 33, 36, 39, 42, 43, 44 }, /* 5 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 6 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33 }, /* 7 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 8 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 9 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 10 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 11 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 12 */ { 0, 1, 2, 3, 4, 6, 8, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 38 }, /* 13 */ { 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36 }, /* 14 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 15 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 16 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 17 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 18 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 19 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 20 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 21 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 45, 46, 47, 48, 49, 50 }, /* 22 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 23 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 24 */ { 0, 1, 2, 4, 6, 8, 10, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38 }, /* 25 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 26 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 27 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 28 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 29 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 30 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 31 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 32 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 33 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 34 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 35 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 36 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 37 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 38 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 39 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 40 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 41 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 42 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 43 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 44 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 45 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 46 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 47 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 48 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 49 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 50 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 51 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 52 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 53 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 54 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 55 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 56 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 57 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 58 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 59 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 60 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 61 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 62 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 63 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 64 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34 }, /* 65 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 66 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 67 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 68 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 69 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 70 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 71 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 72 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 }, /* 73 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 74 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 75 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 76 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 77 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 78 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 79 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 80 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 81 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 82 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 83 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 84 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 85 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 86 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 87 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 88 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 89 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 90 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 91 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 92 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 93 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 94 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 95 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 96 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 97 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 98 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 99 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 100 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 101 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 102 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 103 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 104 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 105 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 106 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 107 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 108 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 28, 30, 32, 33, 34, 35, 36 }, /* 109 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 110 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 111 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 112 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 113 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 114 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 115 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 116 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 117 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 118 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 119 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 120 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 121 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 122 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 123 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 124 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 125 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 126 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 127 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 128 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 129 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 130 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 131 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 132 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 133 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 134 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 135 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 136 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 137 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 138 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 139 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 140 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 141 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 142 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 143 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 144 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 145 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 146 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 147 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 148 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 149 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 150 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 151 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 152 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 153 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 154 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 155 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 156 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 157 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 158 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 159 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 160 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 161 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 162 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35 }, /* 163 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 164 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 165 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 166 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 167 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 168 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 169 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 170 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 171 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 172 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 173 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 174 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 175 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 176 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 177 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 178 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 179 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 180 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 181 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 182 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 183 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 184 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38 }, /* 185 */ { 0, 1, 2, 3, 4, 5, 6, 8, 10, 13, 16, 17, 18, 20, 22, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 40, 41, 42, 43, 44, 45, 46 }, /* 186 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38 }, /* 187 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38 }, /* 188 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 189 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 190 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 191 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34 }, /* 192 */ { 0, 3, 6, 9, 12, 13, 14, 16, 18, 19, 20, 23, 26, 29, 32, 33, 34, 35, 36, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 }, /* 193 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34 }, /* 194 */ { 0, 2, 4, 7, 10, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 }, /* 195 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36 }, /* 196 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 197 */ { 0, 1, 2, 3, 4, 5, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 80, 82 }, /* 198 */ { 0, 1, 2, 4, 6, 9, 12, 14, 16, 17, 18, 20, 22, 25, 28, 32, 36, 38, 40, 41, 42, 44, 46, 49, 52, 53, 54, 55, 56, 57, 58, 59, 60 }, /* 199 */ { 0, 1, 2, 4, 6, 9, 12, 14, 16, 17, 18, 20, 22, 25, 28, 32, 36, 38, 40, 41, 42, 44, 46, 49, 52, 53, 54, 55, 56, 57, 58, 59, 60 }, /* 200 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 201 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 202 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 203 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 204 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 205 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 28, 31, 34, 35, 36, 38, 40 }, /* 206 */ { 0, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36 }, /* 207 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 208 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 209 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 210 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 211 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 212 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 213 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 214 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46 }, /* 215 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 74, 78, 82, 86, 90, 94 }, /* 216 */ { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96 }, /* 217 */ { 0, 2, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88, 91, 94 }, /* 218 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96 }, /* 219 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56 }, /* 220 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 221 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 222 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 223 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 28, 32, 33, 34, 35, 36, 37, 38 }, /* 224 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 14, 16, 18, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42 }, /* 225 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 226 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 227 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 228 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 229 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 230 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 231 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 232 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 233 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 234 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 235 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 236 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 237 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 238 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 239 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 240 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 241 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 242 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 243 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 244 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 245 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 246 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 247 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 248 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 249 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 250 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 251 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 252 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 253 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 254 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 255 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 256 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 257 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 258 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 259 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 260 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 261 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 262 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 263 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 264 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 265 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 266 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 88, 92, 96, 100 }, /* 267 */ { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 111, 118, 124, 130, 131, 132 }, /* 268 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96 }, /* 269 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96 }, /* 270 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48 }, /* 271 */ { 0, 3, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66 }, /* 272 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 32, 34, 36 }, /* 273 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 53, 58, 62, 66, 68, 70, 71, 72 }, /* 274 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 275 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 276 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 277 */ { 0, 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62 }, /* 278 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 39, 42, 45, 48, 51, 54, 56, 58, 61, 64, 66, 68, 71, 74 }, /* 279 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 280 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 281 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 282 */ { 0, 4, 8, 12, 16, 20, 24, 27, 30, 34, 38, 41, 44, 47, 50, 55, 60, 64, 68, 71, 74, 77, 80, 83, 86, 90, 94, 98, 102, 105, 108, 111, 114 }, /* 283 */ { 0, 2, 4, 7, 10, 14, 18, 22, 26, 28, 30, 35, 40, 46, 52, 57, 62, 65, 68, 73, 78, 83, 88, 92, 96, 99, 102, 105, 108, 111, 114, 118, 122 }, /* 284 */ { 0, 5, 10, 14, 18, 21, 24, 27, 30, 33, 36, 38, 40, 42, 44, 46, 48, 50, 52, 55, 58, 61, 64, 69, 74, 77, 80, 84, 88, 93, 98, 101, 104 }, /* 285 */ { 0, 2, 4, 6, 8, 13, 18, 22, 26, 31, 36, 39, 42, 47, 52, 54, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 90, 94, 97, 100, 102, 104 }, /* 286 */ { 0, 3, 6, 9, 12, 15, 18, 22, 26, 29, 32, 35, 38, 41, 44, 49, 54, 58, 62, 64, 66, 71, 76, 78, 80, 84, 88, 92, 96, 99, 102, 105, 108 }, /* 287 */ { 0, 3, 6, 10, 14, 16, 18, 21, 24, 28, 32, 34, 36, 41, 46, 49, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84 }, /* 288 */ { 0, 2, 4, 6, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92 }, /* 289 */ { 0, 3, 6, 9, 12, 14, 16, 18, 20, 23, 26, 28, 30, 32, 34, 36, 38, 41, 44, 47, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 74, 78 }, /* 290 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 35, 38, 42, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70 }, /* 291 */ { 0, 2, 4, 7, 10, 13, 16, 19, 22, 25, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 71, 74 }, /* 292 */ { 0, 3, 6, 8, 10, 13, 16, 19, 22, 25, 28, 30, 32, 35, 38, 41, 44, 48, 52, 54, 56, 59, 62, 65, 68, 71, 74, 77, 80, 85, 90, 96, 102 }, /* 293 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 294 */ { 0, 2, 4, 6, 8, 12, 16, 18, 20, 22, 24, 26, 28, 32, 36, 39, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74 }, /* 295 */ { 0, 2, 4, 6, 8, 11, 14, 16, 18, 20, 22, 25, 28, 31, 34, 36, 38, 42, 46, 49, 52, 54, 56, 58, 60, 62, 64, 66, 68, 71, 74, 77, 80 }, /* 296 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78 }, /* 297 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96 }, /* 298 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 299 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 300 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 301 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 302 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 303 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 304 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 305 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 306 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 307 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 308 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 309 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 310 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 311 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 312 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 313 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 314 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 315 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 316 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 317 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 318 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 319 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 320 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 321 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 322 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 323 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 324 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 325 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 326 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 327 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 328 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 329 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 330 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 331 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 332 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 333 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 334 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 335 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 336 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 337 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 338 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 339 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 340 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 341 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 342 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 343 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 344 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 345 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 346 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 347 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 348 */ { 0, 2, 4, 6, 8, 10, 12, 15, 18, 21, 24, 26, 28, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 }, /* 349 */ { 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42 }, /* 350 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 351 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 352 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 34 }, /* 353 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 354 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 355 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 356 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 357 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 358 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 359 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 360 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 30, 31, 32, 33, 34 }, /* 361 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44 }, /* 362 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56 }, /* 363 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 364 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 365 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 366 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 367 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 368 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54 }, /* 369 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56 }, /* 370 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 371 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 372 */ { 0, 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62 }, /* 373 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 374 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 375 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 376 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 37, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62 }, /* 377 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 378 */ { 0, 2, 4, 6, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58 }, /* 379 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 380 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 381 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }, /* 382 */ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56 }, /* 383 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96 }, /* 384 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96 }, /* 385 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96 }, /* 386 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96 }, /* 387 */ { 0, 1, 2, 3, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88 }, /* 388 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96 }, /* 389 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96 }, /* 390 */ { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64 }, /* 391 */ { 0, 3, 6, 9, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 71, 74, 92, 110, 118, 126, 130, 134, 135, 136, 137, 138, 139, 140 }, /* 392 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36 }, /* 393 */ { 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34 }, /* 394 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 395 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 396 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 397 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 398 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 399 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 400 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 401 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 402 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 403 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 404 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 405 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 43, 44, 45, 46, 47, 48 }, /* 406 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 407 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 408 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 409 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 410 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 411 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 412 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 413 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 414 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 415 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 416 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }, /* 417 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 } }; unsigned short unac_data0[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data1[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0x0061, 0xFFFF, 0x0062, 0xFFFF, 0x0063, 0xFFFF, 0x0064, 0xFFFF, 0x0065, 0xFFFF, 0x0066, 0xFFFF, 0x0067, 0xFFFF, 0x0068, 0xFFFF, 0x0069, 0xFFFF, 0x006A, 0xFFFF, 0x006B, 0xFFFF, 0x006C, 0xFFFF, 0x006D, 0xFFFF, 0x006E, 0xFFFF, 0x006F }; unsigned short unac_data2[] = { 0xFFFF, 0x0070, 0xFFFF, 0x0071, 0xFFFF, 0x0072, 0xFFFF, 0x0073, 0xFFFF, 0x0074, 0xFFFF, 0x0075, 0xFFFF, 0x0076, 0xFFFF, 0x0077, 0xFFFF, 0x0078, 0xFFFF, 0x0079, 0xFFFF, 0x007A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data3[] = { 0x0020, 0x0020, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0020, 0x0020, 0xFFFF, 0xFFFF, 0x0061, 0x0061, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0020, 0x0020 }; unsigned short unac_data4[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0032, 0x0032, 0x0033, 0x0033, 0x0020, 0x0020, 0x03BC, 0x03BC, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0020, 0x0020, 0x0031, 0x0031, 0x006F, 0x006F, 0xFFFF, 0xFFFF, 0x0031, 0x2044, 0x0034, 0x0031, 0x2044, 0x0034, 0x0031, 0x2044, 0x0032, 0x0031, 0x2044, 0x0032, 0x0033, 0x2044, 0x0034, 0x0033, 0x2044, 0x0034, 0xFFFF, 0xFFFF }; unsigned short unac_data5[] = { 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0xFFFF, 0x00E6, 0x0043, 0x0063, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069 }; unsigned short unac_data6[] = { 0xFFFF, 0x00F0, 0x004E, 0x006E, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0xFFFF, 0xFFFF, 0xFFFF, 0x00F8, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0059, 0x0079, 0xFFFF, 0x00FE, 0xFFFF, 0x0073, 0x0073 }; unsigned short unac_data7[] = { 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0xFFFF, 0xFFFF, 0x0063, 0x0063, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069 }; unsigned short unac_data8[] = { 0xFFFF, 0xFFFF, 0x006E, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0079, 0x0079, 0xFFFF, 0xFFFF, 0x0079, 0x0079 }; unsigned short unac_data9[] = { 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061, 0x0043, 0x0063, 0x0063, 0x0063, 0x0043, 0x0063, 0x0063, 0x0063, 0x0043, 0x0063, 0x0063, 0x0063, 0x0043, 0x0063, 0x0063, 0x0063, 0x0044, 0x0064, 0x0064, 0x0064 }; unsigned short unac_data10[] = { 0xFFFF, 0x0111, 0xFFFF, 0xFFFF, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0047, 0x0067, 0x0067, 0x0067, 0x0047, 0x0067, 0x0067, 0x0067 }; unsigned short unac_data11[] = { 0x0047, 0x0067, 0x0067, 0x0067, 0x0047, 0x0067, 0x0067, 0x0067, 0x0048, 0x0068, 0x0068, 0x0068, 0xFFFF, 0x0127, 0xFFFF, 0xFFFF, 0x0049, 0x0069, 0x0069, 0x0069, 0x0049, 0x0069, 0x0069, 0x0069, 0x0049, 0x0069, 0x0069, 0x0069, 0x0049, 0x0069, 0x0069, 0x0069 }; unsigned short unac_data12[] = { 0x0049, 0x0069, 0xFFFF, 0xFFFF, 0x0049, 0x004A, 0x0069, 0x006A, 0x0069, 0x006A, 0x0069, 0x006A, 0x004A, 0x006A, 0x006A, 0x006A, 0x004B, 0x006B, 0x006B, 0x006B, 0xFFFF, 0xFFFF, 0x004C, 0x006C, 0x006C, 0x006C, 0x004C, 0x006C, 0x006C, 0x006C, 0x004C, 0x006C, 0x006C, 0x006C, 0x004C, 0x00B7, 0x006C, 0x00B7 }; unsigned short unac_data13[] = { 0x006C, 0x00B7, 0x006C, 0x00B7, 0xFFFF, 0x0142, 0xFFFF, 0xFFFF, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x02BC, 0x006E, 0x02BC, 0x006E, 0xFFFF, 0x014B, 0xFFFF, 0xFFFF, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F }; unsigned short unac_data14[] = { 0x004F, 0x006F, 0x006F, 0x006F, 0xFFFF, 0x0153, 0xFFFF, 0xFFFF, 0x0052, 0x0072, 0x0072, 0x0072, 0x0052, 0x0072, 0x0072, 0x0072, 0x0052, 0x0072, 0x0072, 0x0072, 0x0053, 0x0073, 0x0073, 0x0073, 0x0053, 0x0073, 0x0073, 0x0073, 0x0053, 0x0073, 0x0073, 0x0073 }; unsigned short unac_data15[] = { 0x0053, 0x0073, 0x0073, 0x0073, 0x0054, 0x0074, 0x0074, 0x0074, 0x0054, 0x0074, 0x0074, 0x0074, 0xFFFF, 0x0167, 0xFFFF, 0xFFFF, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075 }; unsigned short unac_data16[] = { 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0057, 0x0077, 0x0077, 0x0077, 0x0059, 0x0079, 0x0079, 0x0079, 0x0059, 0x0079, 0x005A, 0x007A, 0x007A, 0x007A, 0x005A, 0x007A, 0x007A, 0x007A, 0x005A, 0x007A, 0x007A, 0x007A, 0x0073, 0x0073 }; unsigned short unac_data17[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0x0253, 0xFFFF, 0x0183, 0xFFFF, 0xFFFF, 0xFFFF, 0x0185, 0xFFFF, 0xFFFF, 0xFFFF, 0x0254, 0xFFFF, 0x0188, 0xFFFF, 0xFFFF, 0xFFFF, 0x0256, 0xFFFF, 0x0257, 0xFFFF, 0x018C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x01DD, 0xFFFF, 0x0259 }; unsigned short unac_data18[] = { 0xFFFF, 0x025B, 0xFFFF, 0x0192, 0xFFFF, 0xFFFF, 0xFFFF, 0x0260, 0xFFFF, 0x0263, 0xFFFF, 0xFFFF, 0xFFFF, 0x0269, 0xFFFF, 0x0268, 0xFFFF, 0x0199, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x026F, 0xFFFF, 0x0272, 0xFFFF, 0xFFFF, 0xFFFF, 0x0275 }; unsigned short unac_data19[] = { 0x004F, 0x006F, 0x006F, 0x006F, 0xFFFF, 0x01A3, 0xFFFF, 0xFFFF, 0xFFFF, 0x01A5, 0xFFFF, 0xFFFF, 0xFFFF, 0x0280, 0xFFFF, 0x01A8, 0xFFFF, 0xFFFF, 0xFFFF, 0x0283, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x01AD, 0xFFFF, 0xFFFF, 0xFFFF, 0x0288, 0x0055, 0x0075 }; unsigned short unac_data20[] = { 0x0075, 0x0075, 0xFFFF, 0x028A, 0xFFFF, 0x028B, 0xFFFF, 0x01B4, 0xFFFF, 0xFFFF, 0xFFFF, 0x01B6, 0xFFFF, 0xFFFF, 0xFFFF, 0x0292, 0xFFFF, 0x01B9, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x01BD, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data21[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0044, 0x005A, 0x0064, 0x007A, 0x0044, 0x007A, 0x0064, 0x007A, 0x0064, 0x007A, 0x0064, 0x007A, 0x004C, 0x004A, 0x006C, 0x006A, 0x004C, 0x006A, 0x006C, 0x006A, 0x006C, 0x006A, 0x006C, 0x006A, 0x004E, 0x004A, 0x006E, 0x006A, 0x004E, 0x006A, 0x006E, 0x006A, 0x006E, 0x006A, 0x006E, 0x006A, 0x0041, 0x0061, 0x0061, 0x0061, 0x0049, 0x0069 }; unsigned short unac_data22[] = { 0x0069, 0x0069, 0x004F, 0x006F, 0x006F, 0x006F, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0xFFFF, 0xFFFF, 0x0041, 0x0061, 0x0061, 0x0061 }; unsigned short unac_data23[] = { 0x0041, 0x0061, 0x0061, 0x0061, 0x00C6, 0x00E6, 0x00E6, 0x00E6, 0xFFFF, 0x01E5, 0xFFFF, 0xFFFF, 0x0047, 0x0067, 0x0067, 0x0067, 0x004B, 0x006B, 0x006B, 0x006B, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F, 0x01B7, 0x0292, 0x0292, 0x0292 }; unsigned short unac_data24[] = { 0x006A, 0x006A, 0x0044, 0x005A, 0x0064, 0x007A, 0x0044, 0x007A, 0x0064, 0x007A, 0x0064, 0x007A, 0x0064, 0x007A, 0x0047, 0x0067, 0x0067, 0x0067, 0xFFFF, 0x0195, 0xFFFF, 0x01BF, 0x004E, 0x006E, 0x006E, 0x006E, 0x0041, 0x0061, 0x0061, 0x0061, 0x00C6, 0x00E6, 0x00E6, 0x00E6, 0x00D8, 0x00F8, 0x00F8, 0x00F8 }; unsigned short unac_data25[] = { 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0049, 0x0069, 0x0069, 0x0069, 0x0049, 0x0069, 0x0069, 0x0069, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F }; unsigned short unac_data26[] = { 0x0052, 0x0072, 0x0072, 0x0072, 0x0052, 0x0072, 0x0072, 0x0072, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0053, 0x0073, 0x0073, 0x0073, 0x0054, 0x0074, 0x0074, 0x0074, 0xFFFF, 0x021D, 0xFFFF, 0xFFFF, 0x0048, 0x0068, 0x0068, 0x0068 }; unsigned short unac_data27[] = { 0xFFFF, 0x019E, 0xFFFF, 0xFFFF, 0xFFFF, 0x0223, 0xFFFF, 0xFFFF, 0xFFFF, 0x0225, 0xFFFF, 0xFFFF, 0x0041, 0x0061, 0x0061, 0x0061, 0x0045, 0x0065, 0x0065, 0x0065, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F }; unsigned short unac_data28[] = { 0x004F, 0x006F, 0x006F, 0x006F, 0x0059, 0x0079, 0x0079, 0x0079, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C65, 0xFFFF, 0x023C, 0xFFFF, 0xFFFF, 0xFFFF, 0x019A, 0xFFFF, 0x2C66, 0xFFFF, 0xFFFF }; unsigned short unac_data29[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0x0242, 0xFFFF, 0xFFFF, 0xFFFF, 0x0180, 0xFFFF, 0x0289, 0xFFFF, 0x028C, 0xFFFF, 0x0247, 0xFFFF, 0xFFFF, 0xFFFF, 0x0249, 0xFFFF, 0xFFFF, 0xFFFF, 0x024B, 0xFFFF, 0xFFFF, 0xFFFF, 0x024D, 0xFFFF, 0xFFFF, 0xFFFF, 0x024F, 0xFFFF, 0xFFFF }; unsigned short unac_data30[] = { 0x0068, 0x0068, 0x0266, 0x0266, 0x006A, 0x006A, 0x0072, 0x0072, 0x0279, 0x0279, 0x027B, 0x027B, 0x0281, 0x0281, 0x0077, 0x0077, 0x0079, 0x0079, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data31[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data32[] = { 0x0263, 0x0263, 0x006C, 0x006C, 0x0073, 0x0073, 0x0078, 0x0078, 0x0295, 0x0295, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data33[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data34[] = { 0xFFFF, 0x0371, 0xFFFF, 0xFFFF, 0xFFFF, 0x0373, 0xFFFF, 0xFFFF, 0x02B9, 0x02B9, 0xFFFF, 0xFFFF, 0xFFFF, 0x0377, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0020, 0x0020, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x003B, 0x003B, 0xFFFF, 0xFFFF }; unsigned short unac_data35[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0020, 0x0020, 0x0020, 0x0020, 0x0391, 0x03B1, 0x00B7, 0x00B7, 0x0395, 0x03B5, 0x0397, 0x03B7, 0x0399, 0x03B9, 0xFFFF, 0xFFFF, 0x039F, 0x03BF, 0xFFFF, 0xFFFF, 0x03A5, 0x03C5, 0x03A9, 0x03C9 }; unsigned short unac_data36[] = { 0x03B9, 0x03B9, 0xFFFF, 0x03B1, 0xFFFF, 0x03B2, 0xFFFF, 0x03B3, 0xFFFF, 0x03B4, 0xFFFF, 0x03B5, 0xFFFF, 0x03B6, 0xFFFF, 0x03B7, 0xFFFF, 0x03B8, 0xFFFF, 0x03B9, 0xFFFF, 0x03BA, 0xFFFF, 0x03BB, 0xFFFF, 0x03BC, 0xFFFF, 0x03BD, 0xFFFF, 0x03BE, 0xFFFF, 0x03BF }; unsigned short unac_data37[] = { 0xFFFF, 0x03C0, 0xFFFF, 0x03C1, 0xFFFF, 0xFFFF, 0xFFFF, 0x03C3, 0xFFFF, 0x03C4, 0xFFFF, 0x03C5, 0xFFFF, 0x03C6, 0xFFFF, 0x03C7, 0xFFFF, 0x03C8, 0xFFFF, 0x03C9, 0x0399, 0x03B9, 0x03A5, 0x03C5, 0x03B1, 0x03B1, 0x03B5, 0x03B5, 0x03B7, 0x03B7, 0x03B9, 0x03B9 }; unsigned short unac_data38[] = { 0x03C5, 0x03C5, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data39[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x03C3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x03B9, 0x03B9, 0x03C5, 0x03C5, 0x03BF, 0x03BF, 0x03C5, 0x03C5, 0x03C9, 0x03C9, 0xFFFF, 0x03D7 }; unsigned short unac_data40[] = { 0x03B2, 0x03B2, 0x03B8, 0x03B8, 0x03A5, 0x03C5, 0x03A5, 0x03C5, 0x03A5, 0x03C5, 0x03C6, 0x03C6, 0x03C0, 0x03C0, 0xFFFF, 0xFFFF, 0xFFFF, 0x03D9, 0xFFFF, 0xFFFF, 0xFFFF, 0x03DB, 0xFFFF, 0xFFFF, 0xFFFF, 0x03DD, 0xFFFF, 0xFFFF, 0xFFFF, 0x03DF, 0xFFFF, 0xFFFF }; unsigned short unac_data41[] = { 0xFFFF, 0x03E1, 0xFFFF, 0xFFFF, 0xFFFF, 0x03E3, 0xFFFF, 0xFFFF, 0xFFFF, 0x03E5, 0xFFFF, 0xFFFF, 0xFFFF, 0x03E7, 0xFFFF, 0xFFFF, 0xFFFF, 0x03E9, 0xFFFF, 0xFFFF, 0xFFFF, 0x03EB, 0xFFFF, 0xFFFF, 0xFFFF, 0x03ED, 0xFFFF, 0xFFFF, 0xFFFF, 0x03EF, 0xFFFF, 0xFFFF }; unsigned short unac_data42[] = { 0x03BA, 0x03BA, 0x03C1, 0x03C1, 0x03C2, 0x03C3, 0xFFFF, 0xFFFF, 0x0398, 0x03B8, 0x03B5, 0x03B5, 0xFFFF, 0xFFFF, 0xFFFF, 0x03F8, 0xFFFF, 0xFFFF, 0x03A3, 0x03C3, 0xFFFF, 0x03FB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x037B, 0xFFFF, 0x037C, 0xFFFF, 0x037D }; unsigned short unac_data43[] = { 0x0415, 0x0435, 0x0415, 0x0435, 0xFFFF, 0x0452, 0x0413, 0x0433, 0xFFFF, 0x0454, 0xFFFF, 0x0455, 0xFFFF, 0x0456, 0x0406, 0x0456, 0xFFFF, 0x0458, 0xFFFF, 0x0459, 0xFFFF, 0x045A, 0xFFFF, 0x045B, 0x041A, 0x043A, 0x0418, 0x0438, 0x0423, 0x0443, 0xFFFF, 0x045F }; unsigned short unac_data44[] = { 0xFFFF, 0x0430, 0xFFFF, 0x0431, 0xFFFF, 0x0432, 0xFFFF, 0x0433, 0xFFFF, 0x0434, 0xFFFF, 0x0435, 0xFFFF, 0x0436, 0xFFFF, 0x0437, 0xFFFF, 0x0438, 0x0418, 0x0438, 0xFFFF, 0x043A, 0xFFFF, 0x043B, 0xFFFF, 0x043C, 0xFFFF, 0x043D, 0xFFFF, 0x043E, 0xFFFF, 0x043F }; unsigned short unac_data45[] = { 0xFFFF, 0x0440, 0xFFFF, 0x0441, 0xFFFF, 0x0442, 0xFFFF, 0x0443, 0xFFFF, 0x0444, 0xFFFF, 0x0445, 0xFFFF, 0x0446, 0xFFFF, 0x0447, 0xFFFF, 0x0448, 0xFFFF, 0x0449, 0xFFFF, 0x044A, 0xFFFF, 0x044B, 0xFFFF, 0x044C, 0xFFFF, 0x044D, 0xFFFF, 0x044E, 0xFFFF, 0x044F }; unsigned short unac_data46[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0438, 0x0438, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data47[] = { 0x0435, 0x0435, 0x0435, 0x0435, 0xFFFF, 0xFFFF, 0x0433, 0x0433, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0456, 0x0456, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x043A, 0x043A, 0x0438, 0x0438, 0x0443, 0x0443, 0xFFFF, 0xFFFF }; unsigned short unac_data48[] = { 0xFFFF, 0x0461, 0xFFFF, 0xFFFF, 0xFFFF, 0x0463, 0xFFFF, 0xFFFF, 0xFFFF, 0x0465, 0xFFFF, 0xFFFF, 0xFFFF, 0x0467, 0xFFFF, 0xFFFF, 0xFFFF, 0x0469, 0xFFFF, 0xFFFF, 0xFFFF, 0x046B, 0xFFFF, 0xFFFF, 0xFFFF, 0x046D, 0xFFFF, 0xFFFF, 0xFFFF, 0x046F, 0xFFFF, 0xFFFF }; unsigned short unac_data49[] = { 0xFFFF, 0x0471, 0xFFFF, 0xFFFF, 0xFFFF, 0x0473, 0xFFFF, 0xFFFF, 0xFFFF, 0x0475, 0xFFFF, 0xFFFF, 0x0474, 0x0475, 0x0475, 0x0475, 0xFFFF, 0x0479, 0xFFFF, 0xFFFF, 0xFFFF, 0x047B, 0xFFFF, 0xFFFF, 0xFFFF, 0x047D, 0xFFFF, 0xFFFF, 0xFFFF, 0x047F, 0xFFFF, 0xFFFF }; unsigned short unac_data50[] = { 0xFFFF, 0x0481, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0x048B, 0xFFFF, 0xFFFF, 0xFFFF, 0x048D, 0xFFFF, 0xFFFF, 0xFFFF, 0x048F, 0xFFFF, 0xFFFF }; unsigned short unac_data51[] = { 0xFFFF, 0x0491, 0xFFFF, 0xFFFF, 0xFFFF, 0x0493, 0xFFFF, 0xFFFF, 0xFFFF, 0x0495, 0xFFFF, 0xFFFF, 0xFFFF, 0x0497, 0xFFFF, 0xFFFF, 0xFFFF, 0x0499, 0xFFFF, 0xFFFF, 0xFFFF, 0x049B, 0xFFFF, 0xFFFF, 0xFFFF, 0x049D, 0xFFFF, 0xFFFF, 0xFFFF, 0x049F, 0xFFFF, 0xFFFF }; unsigned short unac_data52[] = { 0xFFFF, 0x04A1, 0xFFFF, 0xFFFF, 0xFFFF, 0x04A3, 0xFFFF, 0xFFFF, 0xFFFF, 0x04A5, 0xFFFF, 0xFFFF, 0xFFFF, 0x04A7, 0xFFFF, 0xFFFF, 0xFFFF, 0x04A9, 0xFFFF, 0xFFFF, 0xFFFF, 0x04AB, 0xFFFF, 0xFFFF, 0xFFFF, 0x04AD, 0xFFFF, 0xFFFF, 0xFFFF, 0x04AF, 0xFFFF, 0xFFFF }; unsigned short unac_data53[] = { 0xFFFF, 0x04B1, 0xFFFF, 0xFFFF, 0xFFFF, 0x04B3, 0xFFFF, 0xFFFF, 0xFFFF, 0x04B5, 0xFFFF, 0xFFFF, 0xFFFF, 0x04B7, 0xFFFF, 0xFFFF, 0xFFFF, 0x04B9, 0xFFFF, 0xFFFF, 0xFFFF, 0x04BB, 0xFFFF, 0xFFFF, 0xFFFF, 0x04BD, 0xFFFF, 0xFFFF, 0xFFFF, 0x04BF, 0xFFFF, 0xFFFF }; unsigned short unac_data54[] = { 0xFFFF, 0x04CF, 0x0416, 0x0436, 0x0436, 0x0436, 0xFFFF, 0x04C4, 0xFFFF, 0xFFFF, 0xFFFF, 0x04C6, 0xFFFF, 0xFFFF, 0xFFFF, 0x04C8, 0xFFFF, 0xFFFF, 0xFFFF, 0x04CA, 0xFFFF, 0xFFFF, 0xFFFF, 0x04CC, 0xFFFF, 0xFFFF, 0xFFFF, 0x04CE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data55[] = { 0x0410, 0x0430, 0x0430, 0x0430, 0x0410, 0x0430, 0x0430, 0x0430, 0xFFFF, 0x04D5, 0xFFFF, 0xFFFF, 0x0415, 0x0435, 0x0435, 0x0435, 0xFFFF, 0x04D9, 0xFFFF, 0xFFFF, 0x04D8, 0x04D9, 0x04D9, 0x04D9, 0x0416, 0x0436, 0x0436, 0x0436, 0x0417, 0x0437, 0x0437, 0x0437 }; unsigned short unac_data56[] = { 0xFFFF, 0x04E1, 0xFFFF, 0xFFFF, 0x0418, 0x0438, 0x0438, 0x0438, 0x0418, 0x0438, 0x0438, 0x0438, 0x041E, 0x043E, 0x043E, 0x043E, 0xFFFF, 0x04E9, 0xFFFF, 0xFFFF, 0x04E8, 0x04E9, 0x04E9, 0x04E9, 0x042D, 0x044D, 0x044D, 0x044D, 0x0423, 0x0443, 0x0443, 0x0443 }; unsigned short unac_data57[] = { 0x0423, 0x0443, 0x0443, 0x0443, 0x0423, 0x0443, 0x0443, 0x0443, 0x0427, 0x0447, 0x0447, 0x0447, 0xFFFF, 0x04F7, 0xFFFF, 0xFFFF, 0x042B, 0x044B, 0x044B, 0x044B, 0xFFFF, 0x04FB, 0xFFFF, 0xFFFF, 0xFFFF, 0x04FD, 0xFFFF, 0xFFFF, 0xFFFF, 0x04FF, 0xFFFF, 0xFFFF }; unsigned short unac_data58[] = { 0xFFFF, 0x0501, 0xFFFF, 0xFFFF, 0xFFFF, 0x0503, 0xFFFF, 0xFFFF, 0xFFFF, 0x0505, 0xFFFF, 0xFFFF, 0xFFFF, 0x0507, 0xFFFF, 0xFFFF, 0xFFFF, 0x0509, 0xFFFF, 0xFFFF, 0xFFFF, 0x050B, 0xFFFF, 0xFFFF, 0xFFFF, 0x050D, 0xFFFF, 0xFFFF, 0xFFFF, 0x050F, 0xFFFF, 0xFFFF }; unsigned short unac_data59[] = { 0xFFFF, 0x0511, 0xFFFF, 0xFFFF, 0xFFFF, 0x0513, 0xFFFF, 0xFFFF, 0xFFFF, 0x0515, 0xFFFF, 0xFFFF, 0xFFFF, 0x0517, 0xFFFF, 0xFFFF, 0xFFFF, 0x0519, 0xFFFF, 0xFFFF, 0xFFFF, 0x051B, 0xFFFF, 0xFFFF, 0xFFFF, 0x051D, 0xFFFF, 0xFFFF, 0xFFFF, 0x051F, 0xFFFF, 0xFFFF }; unsigned short unac_data60[] = { 0xFFFF, 0x0521, 0xFFFF, 0xFFFF, 0xFFFF, 0x0523, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data61[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0x0561, 0xFFFF, 0x0562, 0xFFFF, 0x0563, 0xFFFF, 0x0564, 0xFFFF, 0x0565, 0xFFFF, 0x0566, 0xFFFF, 0x0567, 0xFFFF, 0x0568, 0xFFFF, 0x0569, 0xFFFF, 0x056A, 0xFFFF, 0x056B, 0xFFFF, 0x056C, 0xFFFF, 0x056D, 0xFFFF, 0x056E, 0xFFFF, 0x056F }; unsigned short unac_data62[] = { 0xFFFF, 0x0570, 0xFFFF, 0x0571, 0xFFFF, 0x0572, 0xFFFF, 0x0573, 0xFFFF, 0x0574, 0xFFFF, 0x0575, 0xFFFF, 0x0576, 0xFFFF, 0x0577, 0xFFFF, 0x0578, 0xFFFF, 0x0579, 0xFFFF, 0x057A, 0xFFFF, 0x057B, 0xFFFF, 0x057C, 0xFFFF, 0x057D, 0xFFFF, 0x057E, 0xFFFF, 0x057F }; unsigned short unac_data63[] = { 0xFFFF, 0x0580, 0xFFFF, 0x0581, 0xFFFF, 0x0582, 0xFFFF, 0x0583, 0xFFFF, 0x0584, 0xFFFF, 0x0585, 0xFFFF, 0x0586, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data64[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0565, 0x0582, 0x0565, 0x0582, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data65[] = { 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data66[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000 }; unsigned short unac_data67[] = { 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data68[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data69[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0627, 0x0627, 0x0627, 0x0627, 0x0648, 0x0648, 0x0627, 0x0627, 0x064A, 0x064A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data70[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data71[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF }; unsigned short unac_data72[] = { 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0627, 0x0674, 0x0627, 0x0674, 0x0648, 0x0674, 0x0648, 0x0674, 0x06C7, 0x0674, 0x06C7, 0x0674, 0x064A, 0x0674, 0x064A, 0x0674, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data73[] = { 0x06D5, 0x06D5, 0xFFFF, 0xFFFF, 0x06C1, 0x06C1, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data74[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x06D2, 0x06D2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data75[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data76[] = { 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data77[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data78[] = { 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data79[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data80[] = { 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data81[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0928, 0x0928, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data82[] = { 0xFFFF, 0xFFFF, 0x0930, 0x0930, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0933, 0x0933, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data83[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data84[] = { 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0915, 0x0915, 0x0916, 0x0916, 0x0917, 0x0917, 0x091C, 0x091C, 0x0921, 0x0921, 0x0922, 0x0922, 0x092B, 0x092B, 0x092F, 0x092F }; unsigned short unac_data85[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data86[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data87[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data88[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x09A1, 0x09A1, 0x09A2, 0x09A2, 0xFFFF, 0xFFFF, 0x09AF, 0x09AF }; unsigned short unac_data89[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0A32, 0x0A32, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0A38, 0x0A38, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data90[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data91[] = { 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0A16, 0x0A16, 0x0A17, 0x0A17, 0x0A1C, 0x0A1C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0A2B, 0x0A2B, 0xFFFF, 0xFFFF }; unsigned short unac_data92[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data93[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data94[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0B21, 0x0B21, 0x0B22, 0x0B22, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data95[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data96[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0B92, 0x0B92, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data97[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data98[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data99[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data100[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data101[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data102[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000 }; unsigned short unac_data103[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data104[] = { 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0E32, 0x0E32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data105[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF }; unsigned short unac_data106[] = { 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0EB2, 0x0EB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data107[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data108[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0EAB, 0x0E99, 0x0EAB, 0x0E99, 0x0EAB, 0x0EA1, 0x0EAB, 0x0EA1, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data109[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0F0B, 0x0F0B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data110[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data111[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data112[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0F42, 0x0F42, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0F4C, 0x0F4C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data113[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0F51, 0x0F51, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0F56, 0x0F56, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0F5B, 0x0F5B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data114[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0F40, 0x0F40, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data115[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data116[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data117[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data118[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data119[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1025, 0x1025, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data120[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data121[] = { 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data122[] = { 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data123[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000 }; unsigned short unac_data124[] = { 0xFFFF, 0x2D00, 0xFFFF, 0x2D01, 0xFFFF, 0x2D02, 0xFFFF, 0x2D03, 0xFFFF, 0x2D04, 0xFFFF, 0x2D05, 0xFFFF, 0x2D06, 0xFFFF, 0x2D07, 0xFFFF, 0x2D08, 0xFFFF, 0x2D09, 0xFFFF, 0x2D0A, 0xFFFF, 0x2D0B, 0xFFFF, 0x2D0C, 0xFFFF, 0x2D0D, 0xFFFF, 0x2D0E, 0xFFFF, 0x2D0F }; unsigned short unac_data125[] = { 0xFFFF, 0x2D10, 0xFFFF, 0x2D11, 0xFFFF, 0x2D12, 0xFFFF, 0x2D13, 0xFFFF, 0x2D14, 0xFFFF, 0x2D15, 0xFFFF, 0x2D16, 0xFFFF, 0x2D17, 0xFFFF, 0x2D18, 0xFFFF, 0x2D19, 0xFFFF, 0x2D1A, 0xFFFF, 0x2D1B, 0xFFFF, 0x2D1C, 0xFFFF, 0x2D1D, 0xFFFF, 0x2D1E, 0xFFFF, 0x2D1F }; unsigned short unac_data126[] = { 0xFFFF, 0x2D20, 0xFFFF, 0x2D21, 0xFFFF, 0x2D22, 0xFFFF, 0x2D23, 0xFFFF, 0x2D24, 0xFFFF, 0x2D25, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data127[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x10DC, 0x10DC, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data128[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000 }; unsigned short unac_data129[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data130[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data131[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data132[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data133[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data134[] = { 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data135[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data136[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x1B05, 0x1B05, 0xFFFF, 0xFFFF, 0x1B07, 0x1B07, 0xFFFF, 0xFFFF, 0x1B09, 0x1B09, 0xFFFF, 0xFFFF, 0x1B0B, 0x1B0B, 0xFFFF, 0xFFFF, 0x1B0D, 0x1B0D, 0xFFFF, 0xFFFF }; unsigned short unac_data137[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1B11, 0x1B11, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data138[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data139[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data140[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data141[] = { 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data142[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data143[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0041, 0x0061, 0x00C6, 0x00E6, 0x0042, 0x0062, 0xFFFF, 0xFFFF }; unsigned short unac_data144[] = { 0x0044, 0x0064, 0x0045, 0x0065, 0x018E, 0x01DD, 0x0047, 0x0067, 0x0048, 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C, 0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0xFFFF, 0xFFFF, 0x004F, 0x006F, 0x0222, 0x0223, 0x0050, 0x0070, 0x0052, 0x0072 }; unsigned short unac_data145[] = { 0x0054, 0x0074, 0x0055, 0x0075, 0x0057, 0x0077, 0x0061, 0x0061, 0x0250, 0x0250, 0x0251, 0x0251, 0x1D02, 0x1D02, 0x0062, 0x0062, 0x0064, 0x0064, 0x0065, 0x0065, 0x0259, 0x0259, 0x025B, 0x025B, 0x025C, 0x025C, 0x0067, 0x0067, 0xFFFF, 0xFFFF, 0x006B, 0x006B }; unsigned short unac_data146[] = { 0x006D, 0x006D, 0x014B, 0x014B, 0x006F, 0x006F, 0x0254, 0x0254, 0x1D16, 0x1D16, 0x1D17, 0x1D17, 0x0070, 0x0070, 0x0074, 0x0074, 0x0075, 0x0075, 0x1D1D, 0x1D1D, 0x026F, 0x026F, 0x0076, 0x0076, 0x1D25, 0x1D25, 0x03B2, 0x03B2, 0x03B3, 0x03B3, 0x03B4, 0x03B4 }; unsigned short unac_data147[] = { 0x03C6, 0x03C6, 0x03C7, 0x03C7, 0x0069, 0x0069, 0x0072, 0x0072, 0x0075, 0x0075, 0x0076, 0x0076, 0x03B2, 0x03B2, 0x03B3, 0x03B3, 0x03C1, 0x03C1, 0x03C6, 0x03C6, 0x03C7, 0x03C7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data148[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x043D, 0x043D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data149[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0252, 0x0252, 0x0063, 0x0063, 0x0255, 0x0255, 0x00F0, 0x00F0, 0x025C, 0x025C }; unsigned short unac_data150[] = { 0x0066, 0x0066, 0x025F, 0x025F, 0x0261, 0x0261, 0x0265, 0x0265, 0x0268, 0x0268, 0x0269, 0x0269, 0x026A, 0x026A, 0x1D7B, 0x1D7B, 0x029D, 0x029D, 0x026D, 0x026D, 0x1D85, 0x1D85, 0x029F, 0x029F, 0x0271, 0x0271, 0x0270, 0x0270, 0x0272, 0x0272, 0x0273, 0x0273 }; unsigned short unac_data151[] = { 0x0274, 0x0274, 0x0275, 0x0275, 0x0278, 0x0278, 0x0282, 0x0282, 0x0283, 0x0283, 0x01AB, 0x01AB, 0x0289, 0x0289, 0x028A, 0x028A, 0x1D1C, 0x1D1C, 0x028B, 0x028B, 0x028C, 0x028C, 0x007A, 0x007A, 0x0290, 0x0290, 0x0291, 0x0291, 0x0292, 0x0292, 0x03B8, 0x03B8 }; unsigned short unac_data152[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data153[] = { 0x0041, 0x0061, 0x0061, 0x0061, 0x0042, 0x0062, 0x0062, 0x0062, 0x0042, 0x0062, 0x0062, 0x0062, 0x0042, 0x0062, 0x0062, 0x0062, 0x0043, 0x0063, 0x0063, 0x0063, 0x0044, 0x0064, 0x0064, 0x0064, 0x0044, 0x0064, 0x0064, 0x0064, 0x0044, 0x0064, 0x0064, 0x0064 }; unsigned short unac_data154[] = { 0x0044, 0x0064, 0x0064, 0x0064, 0x0044, 0x0064, 0x0064, 0x0064, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0046, 0x0066, 0x0066, 0x0066 }; unsigned short unac_data155[] = { 0x0047, 0x0067, 0x0067, 0x0067, 0x0048, 0x0068, 0x0068, 0x0068, 0x0048, 0x0068, 0x0068, 0x0068, 0x0048, 0x0068, 0x0068, 0x0068, 0x0048, 0x0068, 0x0068, 0x0068, 0x0048, 0x0068, 0x0068, 0x0068, 0x0049, 0x0069, 0x0069, 0x0069, 0x0049, 0x0069, 0x0069, 0x0069 }; unsigned short unac_data156[] = { 0x004B, 0x006B, 0x006B, 0x006B, 0x004B, 0x006B, 0x006B, 0x006B, 0x004B, 0x006B, 0x006B, 0x006B, 0x004C, 0x006C, 0x006C, 0x006C, 0x004C, 0x006C, 0x006C, 0x006C, 0x004C, 0x006C, 0x006C, 0x006C, 0x004C, 0x006C, 0x006C, 0x006C, 0x004D, 0x006D, 0x006D, 0x006D }; unsigned short unac_data157[] = { 0x004D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F }; unsigned short unac_data158[] = { 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F, 0x0050, 0x0070, 0x0070, 0x0070, 0x0050, 0x0070, 0x0070, 0x0070, 0x0052, 0x0072, 0x0072, 0x0072, 0x0052, 0x0072, 0x0072, 0x0072, 0x0052, 0x0072, 0x0072, 0x0072, 0x0052, 0x0072, 0x0072, 0x0072 }; unsigned short unac_data159[] = { 0x0053, 0x0073, 0x0073, 0x0073, 0x0053, 0x0073, 0x0073, 0x0073, 0x0053, 0x0073, 0x0073, 0x0073, 0x0053, 0x0073, 0x0073, 0x0073, 0x0053, 0x0073, 0x0073, 0x0073, 0x0054, 0x0074, 0x0074, 0x0074, 0x0054, 0x0074, 0x0074, 0x0074, 0x0054, 0x0074, 0x0074, 0x0074 }; unsigned short unac_data160[] = { 0x0054, 0x0074, 0x0074, 0x0074, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0056, 0x0076, 0x0076, 0x0076, 0x0056, 0x0076, 0x0076, 0x0076 }; unsigned short unac_data161[] = { 0x0057, 0x0077, 0x0077, 0x0077, 0x0057, 0x0077, 0x0077, 0x0077, 0x0057, 0x0077, 0x0077, 0x0077, 0x0057, 0x0077, 0x0077, 0x0077, 0x0057, 0x0077, 0x0077, 0x0077, 0x0058, 0x0078, 0x0078, 0x0078, 0x0058, 0x0078, 0x0078, 0x0078, 0x0059, 0x0079, 0x0079, 0x0079 }; unsigned short unac_data162[] = { 0x005A, 0x007A, 0x007A, 0x007A, 0x005A, 0x007A, 0x007A, 0x007A, 0x005A, 0x007A, 0x007A, 0x007A, 0x0068, 0x0068, 0x0074, 0x0074, 0x0077, 0x0077, 0x0079, 0x0079, 0x0061, 0x02BE, 0x0061, 0x02BE, 0x0073, 0x0073, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0073, 0x0073, 0xFFFF, 0xFFFF }; unsigned short unac_data163[] = { 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061 }; unsigned short unac_data164[] = { 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061, 0x0041, 0x0061, 0x0061, 0x0061, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065 }; unsigned short unac_data165[] = { 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0045, 0x0065, 0x0065, 0x0065, 0x0049, 0x0069, 0x0069, 0x0069, 0x0049, 0x0069, 0x0069, 0x0069, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F }; unsigned short unac_data166[] = { 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F }; unsigned short unac_data167[] = { 0x004F, 0x006F, 0x006F, 0x006F, 0x004F, 0x006F, 0x006F, 0x006F, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075, 0x0055, 0x0075, 0x0075, 0x0075 }; unsigned short unac_data168[] = { 0x0055, 0x0075, 0x0075, 0x0075, 0x0059, 0x0079, 0x0079, 0x0079, 0x0059, 0x0079, 0x0079, 0x0079, 0x0059, 0x0079, 0x0079, 0x0079, 0x0059, 0x0079, 0x0079, 0x0079, 0xFFFF, 0x1EFB, 0xFFFF, 0xFFFF, 0xFFFF, 0x1EFD, 0xFFFF, 0xFFFF, 0xFFFF, 0x1EFF, 0xFFFF, 0xFFFF }; unsigned short unac_data169[] = { 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x03B1, 0x0391, 0x03B1, 0x0391, 0x03B1, 0x0391, 0x03B1, 0x0391, 0x03B1, 0x0391, 0x03B1, 0x0391, 0x03B1, 0x0391, 0x03B1 }; unsigned short unac_data170[] = { 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0395, 0x03B5, 0x0395, 0x03B5, 0x0395, 0x03B5, 0x0395, 0x03B5, 0x0395, 0x03B5, 0x0395, 0x03B5, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data171[] = { 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x0397, 0x03B7, 0x0397, 0x03B7, 0x0397, 0x03B7, 0x0397, 0x03B7, 0x0397, 0x03B7, 0x0397, 0x03B7, 0x0397, 0x03B7 }; unsigned short unac_data172[] = { 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x0399, 0x03B9, 0x0399, 0x03B9, 0x0399, 0x03B9, 0x0399, 0x03B9, 0x0399, 0x03B9, 0x0399, 0x03B9, 0x0399, 0x03B9, 0x0399, 0x03B9 }; unsigned short unac_data173[] = { 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x039F, 0x03BF, 0x039F, 0x03BF, 0x039F, 0x03BF, 0x039F, 0x03BF, 0x039F, 0x03BF, 0x039F, 0x03BF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data174[] = { 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0xFFFF, 0xFFFF, 0x03A5, 0x03C5, 0xFFFF, 0xFFFF, 0x03A5, 0x03C5, 0xFFFF, 0xFFFF, 0x03A5, 0x03C5, 0xFFFF, 0xFFFF, 0x03A5, 0x03C5 }; unsigned short unac_data175[] = { 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9, 0x03C9, 0x03A9, 0x03C9, 0x03A9, 0x03C9, 0x03A9, 0x03C9, 0x03A9, 0x03C9, 0x03A9, 0x03C9, 0x03A9, 0x03C9, 0x03A9, 0x03C9 }; unsigned short unac_data176[] = { 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data177[] = { 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0xFFFF, 0xFFFF, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x03B1, 0x0391, 0x03B1, 0x0391, 0x03B1, 0x0391, 0x03B1, 0x0391, 0x03B1, 0x0020, 0x0020, 0x03B9, 0x03B9, 0x0020, 0x0020 }; unsigned short unac_data178[] = { 0x0020, 0x0020, 0x0020, 0x0020, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0xFFFF, 0xFFFF, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0395, 0x03B5, 0x0395, 0x03B5, 0x0397, 0x03B7, 0x0397, 0x03B7, 0x0397, 0x03B7, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020 }; unsigned short unac_data179[] = { 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x0399, 0x03B9, 0x0399, 0x03B9, 0x0399, 0x03B9, 0x0399, 0x03B9, 0xFFFF, 0xFFFF, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020 }; unsigned short unac_data180[] = { 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C1, 0x03C1, 0x03C1, 0x03C1, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03A5, 0x03C5, 0x03A5, 0x03C5, 0x03A5, 0x03C5, 0x03A5, 0x03C5, 0x03A1, 0x03C1, 0x0020, 0x0020, 0x0020, 0x0020, 0x0060, 0x0060 }; unsigned short unac_data181[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0xFFFF, 0xFFFF, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x039F, 0x03BF, 0x039F, 0x03BF, 0x03A9, 0x03C9, 0x03A9, 0x03C9, 0x03A9, 0x03C9, 0x0020, 0x0020, 0x0020, 0x0020, 0xFFFF, 0xFFFF }; unsigned short unac_data182[] = { 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data183[] = { 0xFFFF, 0xFFFF, 0x2010, 0x2010, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0020, 0x0020, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data184[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0020, 0x0020 }; unsigned short unac_data185[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2032, 0x2032, 0x2032, 0x2032, 0x2032, 0x2032, 0x2032, 0x2032, 0x2032, 0x2032, 0xFFFF, 0xFFFF, 0x2035, 0x2035, 0x2035, 0x2035, 0x2035, 0x2035, 0x2035, 0x2035, 0x2035, 0x2035, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0021, 0x0021, 0x0021, 0x0021, 0xFFFF, 0xFFFF, 0x0020, 0x0020, 0xFFFF, 0xFFFF }; unsigned short unac_data186[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x0021, 0x003F, 0x0021, 0x0021, 0x003F, 0x0021, 0x003F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data187[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2032, 0x2032, 0x2032, 0x2032, 0x2032, 0x2032, 0x2032, 0x2032, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0020, 0x0020 }; unsigned short unac_data188[] = { 0x0030, 0x0030, 0x0069, 0x0069, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0034, 0x0034, 0x0035, 0x0035, 0x0036, 0x0036, 0x0037, 0x0037, 0x0038, 0x0038, 0x0039, 0x0039, 0x002B, 0x002B, 0x2212, 0x2212, 0x003D, 0x003D, 0x0028, 0x0028, 0x0029, 0x0029, 0x006E, 0x006E }; unsigned short unac_data189[] = { 0x0030, 0x0030, 0x0031, 0x0031, 0x0032, 0x0032, 0x0033, 0x0033, 0x0034, 0x0034, 0x0035, 0x0035, 0x0036, 0x0036, 0x0037, 0x0037, 0x0038, 0x0038, 0x0039, 0x0039, 0x002B, 0x002B, 0x2212, 0x2212, 0x003D, 0x003D, 0x0028, 0x0028, 0x0029, 0x0029, 0xFFFF, 0xFFFF }; unsigned short unac_data190[] = { 0x0061, 0x0061, 0x0065, 0x0065, 0x006F, 0x006F, 0x0078, 0x0078, 0x0259, 0x0259, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data191[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0052, 0x0073, 0x0072, 0x0073, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data192[] = { 0x0061, 0x002F, 0x0063, 0x0061, 0x002F, 0x0063, 0x0061, 0x002F, 0x0073, 0x0061, 0x002F, 0x0073, 0x0043, 0x0063, 0x00B0, 0x0043, 0x00B0, 0x0063, 0xFFFF, 0xFFFF, 0x0063, 0x002F, 0x006F, 0x0063, 0x002F, 0x006F, 0x0063, 0x002F, 0x0075, 0x0063, 0x002F, 0x0075, 0x0190, 0x025B, 0xFFFF, 0xFFFF, 0x00B0, 0x0046, 0x00B0, 0x0066, 0x0067, 0x0067, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0068, 0x0068, 0x0127, 0x0127 }; unsigned short unac_data193[] = { 0x0049, 0x0069, 0x0049, 0x0069, 0x004C, 0x006C, 0x006C, 0x006C, 0xFFFF, 0xFFFF, 0x004E, 0x006E, 0x004E, 0x006F, 0x006E, 0x006F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0050, 0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data194[] = { 0x0053, 0x004D, 0x0073, 0x006D, 0x0054, 0x0045, 0x004C, 0x0074, 0x0065, 0x006C, 0x0054, 0x004D, 0x0074, 0x006D, 0xFFFF, 0xFFFF, 0x005A, 0x007A, 0xFFFF, 0xFFFF, 0x03A9, 0x03C9, 0xFFFF, 0xFFFF, 0x005A, 0x007A, 0xFFFF, 0xFFFF, 0x004B, 0x006B, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0xFFFF, 0xFFFF, 0x0065, 0x0065 }; unsigned short unac_data195[] = { 0x0045, 0x0065, 0x0046, 0x0066, 0xFFFF, 0x214E, 0x004D, 0x006D, 0x006F, 0x006F, 0x05D0, 0x05D0, 0x05D1, 0x05D1, 0x05D2, 0x05D2, 0x05D3, 0x05D3, 0x0069, 0x0069, 0xFFFF, 0xFFFF, 0x0046, 0x0041, 0x0058, 0x0066, 0x0061, 0x0078, 0x03C0, 0x03C0, 0x03B3, 0x03B3, 0x0393, 0x03B3, 0x03A0, 0x03C0 }; unsigned short unac_data196[] = { 0x2211, 0x2211, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0044, 0x0064, 0x0064, 0x0064, 0x0065, 0x0065, 0x0069, 0x0069, 0x006A, 0x006A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data197[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0031, 0x2044, 0x0033, 0x0031, 0x2044, 0x0033, 0x0032, 0x2044, 0x0033, 0x0032, 0x2044, 0x0033, 0x0031, 0x2044, 0x0035, 0x0031, 0x2044, 0x0035, 0x0032, 0x2044, 0x0035, 0x0032, 0x2044, 0x0035, 0x0033, 0x2044, 0x0035, 0x0033, 0x2044, 0x0035, 0x0034, 0x2044, 0x0035, 0x0034, 0x2044, 0x0035, 0x0031, 0x2044, 0x0036, 0x0031, 0x2044, 0x0036, 0x0035, 0x2044, 0x0036, 0x0035, 0x2044, 0x0036, 0x0031, 0x2044, 0x0038, 0x0031, 0x2044, 0x0038, 0x0033, 0x2044, 0x0038, 0x0033, 0x2044, 0x0038, 0x0035, 0x2044, 0x0038, 0x0035, 0x2044, 0x0038, 0x0037, 0x2044, 0x0038, 0x0037, 0x2044, 0x0038, 0x0031, 0x2044, 0x0031, 0x2044 }; unsigned short unac_data198[] = { 0x0049, 0x0069, 0x0049, 0x0049, 0x0069, 0x0069, 0x0049, 0x0049, 0x0049, 0x0069, 0x0069, 0x0069, 0x0049, 0x0056, 0x0069, 0x0076, 0x0056, 0x0076, 0x0056, 0x0049, 0x0076, 0x0069, 0x0056, 0x0049, 0x0049, 0x0076, 0x0069, 0x0069, 0x0056, 0x0049, 0x0049, 0x0049, 0x0076, 0x0069, 0x0069, 0x0069, 0x0049, 0x0058, 0x0069, 0x0078, 0x0058, 0x0078, 0x0058, 0x0049, 0x0078, 0x0069, 0x0058, 0x0049, 0x0049, 0x0078, 0x0069, 0x0069, 0x004C, 0x006C, 0x0043, 0x0063, 0x0044, 0x0064, 0x004D, 0x006D }; unsigned short unac_data199[] = { 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0076, 0x0069, 0x0076, 0x0076, 0x0076, 0x0076, 0x0069, 0x0076, 0x0069, 0x0076, 0x0069, 0x0069, 0x0076, 0x0069, 0x0069, 0x0076, 0x0069, 0x0069, 0x0069, 0x0076, 0x0069, 0x0069, 0x0069, 0x0069, 0x0078, 0x0069, 0x0078, 0x0078, 0x0078, 0x0078, 0x0069, 0x0078, 0x0069, 0x0078, 0x0069, 0x0069, 0x0078, 0x0069, 0x0069, 0x006C, 0x006C, 0x0063, 0x0063, 0x0064, 0x0064, 0x006D, 0x006D }; unsigned short unac_data200[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2184, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data201[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2190, 0x2190, 0x2192, 0x2192, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data202[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2194, 0x2194, 0xFFFF, 0xFFFF }; unsigned short unac_data203[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x21D0, 0x21D0, 0x21D4, 0x21D4, 0x21D2, 0x21D2 }; unsigned short unac_data204[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2203, 0x2203, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2208, 0x2208, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x220B, 0x220B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data205[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2223, 0x2223, 0xFFFF, 0xFFFF, 0x2225, 0x2225, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x222B, 0x222B, 0x222B, 0x222B, 0x222B, 0x222B, 0x222B, 0x222B, 0x222B, 0x222B, 0xFFFF, 0xFFFF, 0x222E, 0x222E, 0x222E, 0x222E }; unsigned short unac_data206[] = { 0x222E, 0x222E, 0x222E, 0x222E, 0x222E, 0x222E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data207[] = { 0xFFFF, 0xFFFF, 0x223C, 0x223C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2243, 0x2243, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2245, 0x2245, 0xFFFF, 0xFFFF, 0x2248, 0x2248, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data208[] = { 0x003D, 0x003D, 0xFFFF, 0xFFFF, 0x2261, 0x2261, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x224D, 0x224D, 0x003C, 0x003C, 0x003E, 0x003E }; unsigned short unac_data209[] = { 0x2264, 0x2264, 0x2265, 0x2265, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2272, 0x2272, 0x2273, 0x2273, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2276, 0x2276, 0x2277, 0x2277, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data210[] = { 0x227A, 0x227A, 0x227B, 0x227B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2282, 0x2282, 0x2283, 0x2283, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2286, 0x2286, 0x2287, 0x2287, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data211[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x22A2, 0x22A2, 0x22A8, 0x22A8, 0x22A9, 0x22A9, 0x22AB, 0x22AB }; unsigned short unac_data212[] = { 0x227C, 0x227C, 0x227D, 0x227D, 0x2291, 0x2291, 0x2292, 0x2292, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x22B2, 0x22B2, 0x22B3, 0x22B3, 0x22B4, 0x22B4, 0x22B5, 0x22B5, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data213[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x3008, 0x3008, 0x3009, 0x3009, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data214[] = { 0x0031, 0x0031, 0x0032, 0x0032, 0x0033, 0x0033, 0x0034, 0x0034, 0x0035, 0x0035, 0x0036, 0x0036, 0x0037, 0x0037, 0x0038, 0x0038, 0x0039, 0x0039, 0x0031, 0x0030, 0x0031, 0x0030, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0032, 0x0031, 0x0032, 0x0031, 0x0033, 0x0031, 0x0033, 0x0031, 0x0034, 0x0031, 0x0034, 0x0031, 0x0035, 0x0031, 0x0035, 0x0031, 0x0036, 0x0031, 0x0036 }; unsigned short unac_data215[] = { 0x0031, 0x0037, 0x0031, 0x0037, 0x0031, 0x0038, 0x0031, 0x0038, 0x0031, 0x0039, 0x0031, 0x0039, 0x0032, 0x0030, 0x0032, 0x0030, 0x0028, 0x0031, 0x0029, 0x0028, 0x0031, 0x0029, 0x0028, 0x0032, 0x0029, 0x0028, 0x0032, 0x0029, 0x0028, 0x0033, 0x0029, 0x0028, 0x0033, 0x0029, 0x0028, 0x0034, 0x0029, 0x0028, 0x0034, 0x0029, 0x0028, 0x0035, 0x0029, 0x0028, 0x0035, 0x0029, 0x0028, 0x0036, 0x0029, 0x0028, 0x0036, 0x0029, 0x0028, 0x0037, 0x0029, 0x0028, 0x0037, 0x0029, 0x0028, 0x0038, 0x0029, 0x0028, 0x0038, 0x0029, 0x0028, 0x0039, 0x0029, 0x0028, 0x0039, 0x0029, 0x0028, 0x0031, 0x0030, 0x0029, 0x0028, 0x0031, 0x0030, 0x0029, 0x0028, 0x0031, 0x0031, 0x0029, 0x0028, 0x0031, 0x0031, 0x0029, 0x0028, 0x0031, 0x0032, 0x0029, 0x0028, 0x0031, 0x0032, 0x0029 }; unsigned short unac_data216[] = { 0x0028, 0x0031, 0x0033, 0x0029, 0x0028, 0x0031, 0x0033, 0x0029, 0x0028, 0x0031, 0x0034, 0x0029, 0x0028, 0x0031, 0x0034, 0x0029, 0x0028, 0x0031, 0x0035, 0x0029, 0x0028, 0x0031, 0x0035, 0x0029, 0x0028, 0x0031, 0x0036, 0x0029, 0x0028, 0x0031, 0x0036, 0x0029, 0x0028, 0x0031, 0x0037, 0x0029, 0x0028, 0x0031, 0x0037, 0x0029, 0x0028, 0x0031, 0x0038, 0x0029, 0x0028, 0x0031, 0x0038, 0x0029, 0x0028, 0x0031, 0x0039, 0x0029, 0x0028, 0x0031, 0x0039, 0x0029, 0x0028, 0x0032, 0x0030, 0x0029, 0x0028, 0x0032, 0x0030, 0x0029, 0x0031, 0x002E, 0x0031, 0x002E, 0x0032, 0x002E, 0x0032, 0x002E, 0x0033, 0x002E, 0x0033, 0x002E, 0x0034, 0x002E, 0x0034, 0x002E, 0x0035, 0x002E, 0x0035, 0x002E, 0x0036, 0x002E, 0x0036, 0x002E, 0x0037, 0x002E, 0x0037, 0x002E, 0x0038, 0x002E, 0x0038, 0x002E }; unsigned short unac_data217[] = { 0x0039, 0x002E, 0x0039, 0x002E, 0x0031, 0x0030, 0x002E, 0x0031, 0x0030, 0x002E, 0x0031, 0x0031, 0x002E, 0x0031, 0x0031, 0x002E, 0x0031, 0x0032, 0x002E, 0x0031, 0x0032, 0x002E, 0x0031, 0x0033, 0x002E, 0x0031, 0x0033, 0x002E, 0x0031, 0x0034, 0x002E, 0x0031, 0x0034, 0x002E, 0x0031, 0x0035, 0x002E, 0x0031, 0x0035, 0x002E, 0x0031, 0x0036, 0x002E, 0x0031, 0x0036, 0x002E, 0x0031, 0x0037, 0x002E, 0x0031, 0x0037, 0x002E, 0x0031, 0x0038, 0x002E, 0x0031, 0x0038, 0x002E, 0x0031, 0x0039, 0x002E, 0x0031, 0x0039, 0x002E, 0x0032, 0x0030, 0x002E, 0x0032, 0x0030, 0x002E, 0x0028, 0x0061, 0x0029, 0x0028, 0x0061, 0x0029, 0x0028, 0x0062, 0x0029, 0x0028, 0x0062, 0x0029, 0x0028, 0x0063, 0x0029, 0x0028, 0x0063, 0x0029, 0x0028, 0x0064, 0x0029, 0x0028, 0x0064, 0x0029 }; unsigned short unac_data218[] = { 0x0028, 0x0065, 0x0029, 0x0028, 0x0065, 0x0029, 0x0028, 0x0066, 0x0029, 0x0028, 0x0066, 0x0029, 0x0028, 0x0067, 0x0029, 0x0028, 0x0067, 0x0029, 0x0028, 0x0068, 0x0029, 0x0028, 0x0068, 0x0029, 0x0028, 0x0069, 0x0029, 0x0028, 0x0069, 0x0029, 0x0028, 0x006A, 0x0029, 0x0028, 0x006A, 0x0029, 0x0028, 0x006B, 0x0029, 0x0028, 0x006B, 0x0029, 0x0028, 0x006C, 0x0029, 0x0028, 0x006C, 0x0029, 0x0028, 0x006D, 0x0029, 0x0028, 0x006D, 0x0029, 0x0028, 0x006E, 0x0029, 0x0028, 0x006E, 0x0029, 0x0028, 0x006F, 0x0029, 0x0028, 0x006F, 0x0029, 0x0028, 0x0070, 0x0029, 0x0028, 0x0070, 0x0029, 0x0028, 0x0071, 0x0029, 0x0028, 0x0071, 0x0029, 0x0028, 0x0072, 0x0029, 0x0028, 0x0072, 0x0029, 0x0028, 0x0073, 0x0029, 0x0028, 0x0073, 0x0029, 0x0028, 0x0074, 0x0029, 0x0028, 0x0074, 0x0029 }; unsigned short unac_data219[] = { 0x0028, 0x0075, 0x0029, 0x0028, 0x0075, 0x0029, 0x0028, 0x0076, 0x0029, 0x0028, 0x0076, 0x0029, 0x0028, 0x0077, 0x0029, 0x0028, 0x0077, 0x0029, 0x0028, 0x0078, 0x0029, 0x0028, 0x0078, 0x0029, 0x0028, 0x0079, 0x0029, 0x0028, 0x0079, 0x0029, 0x0028, 0x007A, 0x0029, 0x0028, 0x007A, 0x0029, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044, 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048, 0x0068, 0x0049, 0x0069, 0x004A, 0x006A }; unsigned short unac_data220[] = { 0x004B, 0x006B, 0x004C, 0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050, 0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054, 0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058, 0x0078, 0x0059, 0x0079, 0x005A, 0x007A }; unsigned short unac_data221[] = { 0x0061, 0x0061, 0x0062, 0x0062, 0x0063, 0x0063, 0x0064, 0x0064, 0x0065, 0x0065, 0x0066, 0x0066, 0x0067, 0x0067, 0x0068, 0x0068, 0x0069, 0x0069, 0x006A, 0x006A, 0x006B, 0x006B, 0x006C, 0x006C, 0x006D, 0x006D, 0x006E, 0x006E, 0x006F, 0x006F, 0x0070, 0x0070 }; unsigned short unac_data222[] = { 0x0071, 0x0071, 0x0072, 0x0072, 0x0073, 0x0073, 0x0074, 0x0074, 0x0075, 0x0075, 0x0076, 0x0076, 0x0077, 0x0077, 0x0078, 0x0078, 0x0079, 0x0079, 0x007A, 0x007A, 0x0030, 0x0030, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data223[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x222B, 0x222B, 0x222B, 0x222B, 0x222B, 0x222B, 0x222B, 0x222B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data224[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x003A, 0x003A, 0x003D, 0x003A, 0x003A, 0x003D, 0x003D, 0x003D, 0x003D, 0x003D, 0x003D, 0x003D, 0x003D, 0x003D, 0x003D, 0x003D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data225[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2ADD, 0x2ADD, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data226[] = { 0xFFFF, 0x2C30, 0xFFFF, 0x2C31, 0xFFFF, 0x2C32, 0xFFFF, 0x2C33, 0xFFFF, 0x2C34, 0xFFFF, 0x2C35, 0xFFFF, 0x2C36, 0xFFFF, 0x2C37, 0xFFFF, 0x2C38, 0xFFFF, 0x2C39, 0xFFFF, 0x2C3A, 0xFFFF, 0x2C3B, 0xFFFF, 0x2C3C, 0xFFFF, 0x2C3D, 0xFFFF, 0x2C3E, 0xFFFF, 0x2C3F }; unsigned short unac_data227[] = { 0xFFFF, 0x2C40, 0xFFFF, 0x2C41, 0xFFFF, 0x2C42, 0xFFFF, 0x2C43, 0xFFFF, 0x2C44, 0xFFFF, 0x2C45, 0xFFFF, 0x2C46, 0xFFFF, 0x2C47, 0xFFFF, 0x2C48, 0xFFFF, 0x2C49, 0xFFFF, 0x2C4A, 0xFFFF, 0x2C4B, 0xFFFF, 0x2C4C, 0xFFFF, 0x2C4D, 0xFFFF, 0x2C4E, 0xFFFF, 0x2C4F }; unsigned short unac_data228[] = { 0xFFFF, 0x2C50, 0xFFFF, 0x2C51, 0xFFFF, 0x2C52, 0xFFFF, 0x2C53, 0xFFFF, 0x2C54, 0xFFFF, 0x2C55, 0xFFFF, 0x2C56, 0xFFFF, 0x2C57, 0xFFFF, 0x2C58, 0xFFFF, 0x2C59, 0xFFFF, 0x2C5A, 0xFFFF, 0x2C5B, 0xFFFF, 0x2C5C, 0xFFFF, 0x2C5D, 0xFFFF, 0x2C5E, 0xFFFF, 0xFFFF }; unsigned short unac_data229[] = { 0xFFFF, 0x2C61, 0xFFFF, 0xFFFF, 0xFFFF, 0x026B, 0xFFFF, 0x1D7D, 0xFFFF, 0x027D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C68, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C6A, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C6C, 0xFFFF, 0xFFFF, 0xFFFF, 0x0251, 0xFFFF, 0x0271, 0xFFFF, 0x0250 }; unsigned short unac_data230[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C73, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C76, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x006A, 0x006A, 0x0056, 0x0076, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data231[] = { 0xFFFF, 0x2C81, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C83, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C85, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C87, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C89, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C8B, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C8D, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C8F, 0xFFFF, 0xFFFF }; unsigned short unac_data232[] = { 0xFFFF, 0x2C91, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C93, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C95, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C97, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C99, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C9B, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C9D, 0xFFFF, 0xFFFF, 0xFFFF, 0x2C9F, 0xFFFF, 0xFFFF }; unsigned short unac_data233[] = { 0xFFFF, 0x2CA1, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CA3, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CA5, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CA7, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CA9, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CAB, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CAD, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CAF, 0xFFFF, 0xFFFF }; unsigned short unac_data234[] = { 0xFFFF, 0x2CB1, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CB3, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CB5, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CB7, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CB9, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CBB, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CBD, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CBF, 0xFFFF, 0xFFFF }; unsigned short unac_data235[] = { 0xFFFF, 0x2CC1, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CC3, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CC5, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CC7, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CC9, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CCB, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CCD, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CCF, 0xFFFF, 0xFFFF }; unsigned short unac_data236[] = { 0xFFFF, 0x2CD1, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CD3, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CD5, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CD7, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CD9, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CDB, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CDD, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CDF, 0xFFFF, 0xFFFF }; unsigned short unac_data237[] = { 0xFFFF, 0x2CE1, 0xFFFF, 0xFFFF, 0xFFFF, 0x2CE3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data238[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x2D61, 0x2D61 }; unsigned short unac_data239[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x6BCD, 0x6BCD }; unsigned short unac_data240[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9F9F, 0x9F9F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data241[] = { 0x4E00, 0x4E00, 0x4E28, 0x4E28, 0x4E36, 0x4E36, 0x4E3F, 0x4E3F, 0x4E59, 0x4E59, 0x4E85, 0x4E85, 0x4E8C, 0x4E8C, 0x4EA0, 0x4EA0, 0x4EBA, 0x4EBA, 0x513F, 0x513F, 0x5165, 0x5165, 0x516B, 0x516B, 0x5182, 0x5182, 0x5196, 0x5196, 0x51AB, 0x51AB, 0x51E0, 0x51E0 }; unsigned short unac_data242[] = { 0x51F5, 0x51F5, 0x5200, 0x5200, 0x529B, 0x529B, 0x52F9, 0x52F9, 0x5315, 0x5315, 0x531A, 0x531A, 0x5338, 0x5338, 0x5341, 0x5341, 0x535C, 0x535C, 0x5369, 0x5369, 0x5382, 0x5382, 0x53B6, 0x53B6, 0x53C8, 0x53C8, 0x53E3, 0x53E3, 0x56D7, 0x56D7, 0x571F, 0x571F }; unsigned short unac_data243[] = { 0x58EB, 0x58EB, 0x5902, 0x5902, 0x590A, 0x590A, 0x5915, 0x5915, 0x5927, 0x5927, 0x5973, 0x5973, 0x5B50, 0x5B50, 0x5B80, 0x5B80, 0x5BF8, 0x5BF8, 0x5C0F, 0x5C0F, 0x5C22, 0x5C22, 0x5C38, 0x5C38, 0x5C6E, 0x5C6E, 0x5C71, 0x5C71, 0x5DDB, 0x5DDB, 0x5DE5, 0x5DE5 }; unsigned short unac_data244[] = { 0x5DF1, 0x5DF1, 0x5DFE, 0x5DFE, 0x5E72, 0x5E72, 0x5E7A, 0x5E7A, 0x5E7F, 0x5E7F, 0x5EF4, 0x5EF4, 0x5EFE, 0x5EFE, 0x5F0B, 0x5F0B, 0x5F13, 0x5F13, 0x5F50, 0x5F50, 0x5F61, 0x5F61, 0x5F73, 0x5F73, 0x5FC3, 0x5FC3, 0x6208, 0x6208, 0x6236, 0x6236, 0x624B, 0x624B }; unsigned short unac_data245[] = { 0x652F, 0x652F, 0x6534, 0x6534, 0x6587, 0x6587, 0x6597, 0x6597, 0x65A4, 0x65A4, 0x65B9, 0x65B9, 0x65E0, 0x65E0, 0x65E5, 0x65E5, 0x66F0, 0x66F0, 0x6708, 0x6708, 0x6728, 0x6728, 0x6B20, 0x6B20, 0x6B62, 0x6B62, 0x6B79, 0x6B79, 0x6BB3, 0x6BB3, 0x6BCB, 0x6BCB }; unsigned short unac_data246[] = { 0x6BD4, 0x6BD4, 0x6BDB, 0x6BDB, 0x6C0F, 0x6C0F, 0x6C14, 0x6C14, 0x6C34, 0x6C34, 0x706B, 0x706B, 0x722A, 0x722A, 0x7236, 0x7236, 0x723B, 0x723B, 0x723F, 0x723F, 0x7247, 0x7247, 0x7259, 0x7259, 0x725B, 0x725B, 0x72AC, 0x72AC, 0x7384, 0x7384, 0x7389, 0x7389 }; unsigned short unac_data247[] = { 0x74DC, 0x74DC, 0x74E6, 0x74E6, 0x7518, 0x7518, 0x751F, 0x751F, 0x7528, 0x7528, 0x7530, 0x7530, 0x758B, 0x758B, 0x7592, 0x7592, 0x7676, 0x7676, 0x767D, 0x767D, 0x76AE, 0x76AE, 0x76BF, 0x76BF, 0x76EE, 0x76EE, 0x77DB, 0x77DB, 0x77E2, 0x77E2, 0x77F3, 0x77F3 }; unsigned short unac_data248[] = { 0x793A, 0x793A, 0x79B8, 0x79B8, 0x79BE, 0x79BE, 0x7A74, 0x7A74, 0x7ACB, 0x7ACB, 0x7AF9, 0x7AF9, 0x7C73, 0x7C73, 0x7CF8, 0x7CF8, 0x7F36, 0x7F36, 0x7F51, 0x7F51, 0x7F8A, 0x7F8A, 0x7FBD, 0x7FBD, 0x8001, 0x8001, 0x800C, 0x800C, 0x8012, 0x8012, 0x8033, 0x8033 }; unsigned short unac_data249[] = { 0x807F, 0x807F, 0x8089, 0x8089, 0x81E3, 0x81E3, 0x81EA, 0x81EA, 0x81F3, 0x81F3, 0x81FC, 0x81FC, 0x820C, 0x820C, 0x821B, 0x821B, 0x821F, 0x821F, 0x826E, 0x826E, 0x8272, 0x8272, 0x8278, 0x8278, 0x864D, 0x864D, 0x866B, 0x866B, 0x8840, 0x8840, 0x884C, 0x884C }; unsigned short unac_data250[] = { 0x8863, 0x8863, 0x897E, 0x897E, 0x898B, 0x898B, 0x89D2, 0x89D2, 0x8A00, 0x8A00, 0x8C37, 0x8C37, 0x8C46, 0x8C46, 0x8C55, 0x8C55, 0x8C78, 0x8C78, 0x8C9D, 0x8C9D, 0x8D64, 0x8D64, 0x8D70, 0x8D70, 0x8DB3, 0x8DB3, 0x8EAB, 0x8EAB, 0x8ECA, 0x8ECA, 0x8F9B, 0x8F9B }; unsigned short unac_data251[] = { 0x8FB0, 0x8FB0, 0x8FB5, 0x8FB5, 0x9091, 0x9091, 0x9149, 0x9149, 0x91C6, 0x91C6, 0x91CC, 0x91CC, 0x91D1, 0x91D1, 0x9577, 0x9577, 0x9580, 0x9580, 0x961C, 0x961C, 0x96B6, 0x96B6, 0x96B9, 0x96B9, 0x96E8, 0x96E8, 0x9751, 0x9751, 0x975E, 0x975E, 0x9762, 0x9762 }; unsigned short unac_data252[] = { 0x9769, 0x9769, 0x97CB, 0x97CB, 0x97ED, 0x97ED, 0x97F3, 0x97F3, 0x9801, 0x9801, 0x98A8, 0x98A8, 0x98DB, 0x98DB, 0x98DF, 0x98DF, 0x9996, 0x9996, 0x9999, 0x9999, 0x99AC, 0x99AC, 0x9AA8, 0x9AA8, 0x9AD8, 0x9AD8, 0x9ADF, 0x9ADF, 0x9B25, 0x9B25, 0x9B2F, 0x9B2F }; unsigned short unac_data253[] = { 0x9B32, 0x9B32, 0x9B3C, 0x9B3C, 0x9B5A, 0x9B5A, 0x9CE5, 0x9CE5, 0x9E75, 0x9E75, 0x9E7F, 0x9E7F, 0x9EA5, 0x9EA5, 0x9EBB, 0x9EBB, 0x9EC3, 0x9EC3, 0x9ECD, 0x9ECD, 0x9ED1, 0x9ED1, 0x9EF9, 0x9EF9, 0x9EFD, 0x9EFD, 0x9F0E, 0x9F0E, 0x9F13, 0x9F13, 0x9F20, 0x9F20 }; unsigned short unac_data254[] = { 0x9F3B, 0x9F3B, 0x9F4A, 0x9F4A, 0x9F52, 0x9F52, 0x9F8D, 0x9F8D, 0x9F9C, 0x9F9C, 0x9FA0, 0x9FA0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data255[] = { 0x0020, 0x0020, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data256[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data257[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x3012, 0x3012, 0xFFFF, 0xFFFF, 0x5341, 0x5341, 0x5344, 0x5344, 0x5345, 0x5345, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data258[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data259[] = { 0xFFFF, 0xFFFF, 0x1100, 0x1100, 0x1101, 0x1101, 0x11AA, 0x11AA, 0x1102, 0x1102, 0x11AC, 0x11AC, 0x11AD, 0x11AD, 0x1103, 0x1103, 0x1104, 0x1104, 0x1105, 0x1105, 0x11B0, 0x11B0, 0x11B1, 0x11B1, 0x11B2, 0x11B2, 0x11B3, 0x11B3, 0x11B4, 0x11B4, 0x11B5, 0x11B5 }; unsigned short unac_data260[] = { 0x111A, 0x111A, 0x1106, 0x1106, 0x1107, 0x1107, 0x1108, 0x1108, 0x1121, 0x1121, 0x1109, 0x1109, 0x110A, 0x110A, 0x110B, 0x110B, 0x110C, 0x110C, 0x110D, 0x110D, 0x110E, 0x110E, 0x110F, 0x110F, 0x1110, 0x1110, 0x1111, 0x1111, 0x1112, 0x1112, 0x1161, 0x1161 }; unsigned short unac_data261[] = { 0x1162, 0x1162, 0x1163, 0x1163, 0x1164, 0x1164, 0x1165, 0x1165, 0x1166, 0x1166, 0x1167, 0x1167, 0x1168, 0x1168, 0x1169, 0x1169, 0x116A, 0x116A, 0x116B, 0x116B, 0x116C, 0x116C, 0x116D, 0x116D, 0x116E, 0x116E, 0x116F, 0x116F, 0x1170, 0x1170, 0x1171, 0x1171 }; unsigned short unac_data262[] = { 0x1172, 0x1172, 0x1173, 0x1173, 0x1174, 0x1174, 0x1175, 0x1175, 0x1160, 0x1160, 0x1114, 0x1114, 0x1115, 0x1115, 0x11C7, 0x11C7, 0x11C8, 0x11C8, 0x11CC, 0x11CC, 0x11CE, 0x11CE, 0x11D3, 0x11D3, 0x11D7, 0x11D7, 0x11D9, 0x11D9, 0x111C, 0x111C, 0x11DD, 0x11DD }; unsigned short unac_data263[] = { 0x11DF, 0x11DF, 0x111D, 0x111D, 0x111E, 0x111E, 0x1120, 0x1120, 0x1122, 0x1122, 0x1123, 0x1123, 0x1127, 0x1127, 0x1129, 0x1129, 0x112B, 0x112B, 0x112C, 0x112C, 0x112D, 0x112D, 0x112E, 0x112E, 0x112F, 0x112F, 0x1132, 0x1132, 0x1136, 0x1136, 0x1140, 0x1140 }; unsigned short unac_data264[] = { 0x1147, 0x1147, 0x114C, 0x114C, 0x11F1, 0x11F1, 0x11F2, 0x11F2, 0x1157, 0x1157, 0x1158, 0x1158, 0x1159, 0x1159, 0x1184, 0x1184, 0x1185, 0x1185, 0x1188, 0x1188, 0x1191, 0x1191, 0x1192, 0x1192, 0x1194, 0x1194, 0x119E, 0x119E, 0x11A1, 0x11A1, 0xFFFF, 0xFFFF }; unsigned short unac_data265[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x4E00, 0x4E00, 0x4E8C, 0x4E8C, 0x4E09, 0x4E09, 0x56DB, 0x56DB, 0x4E0A, 0x4E0A, 0x4E2D, 0x4E2D, 0x4E0B, 0x4E0B, 0x7532, 0x7532, 0x4E59, 0x4E59, 0x4E19, 0x4E19, 0x4E01, 0x4E01, 0x5929, 0x5929, 0x5730, 0x5730, 0x4EBA, 0x4EBA }; unsigned short unac_data266[] = { 0x0028, 0x1100, 0x0029, 0x0028, 0x1100, 0x0029, 0x0028, 0x1102, 0x0029, 0x0028, 0x1102, 0x0029, 0x0028, 0x1103, 0x0029, 0x0028, 0x1103, 0x0029, 0x0028, 0x1105, 0x0029, 0x0028, 0x1105, 0x0029, 0x0028, 0x1106, 0x0029, 0x0028, 0x1106, 0x0029, 0x0028, 0x1107, 0x0029, 0x0028, 0x1107, 0x0029, 0x0028, 0x1109, 0x0029, 0x0028, 0x1109, 0x0029, 0x0028, 0x110B, 0x0029, 0x0028, 0x110B, 0x0029, 0x0028, 0x110C, 0x0029, 0x0028, 0x110C, 0x0029, 0x0028, 0x110E, 0x0029, 0x0028, 0x110E, 0x0029, 0x0028, 0x110F, 0x0029, 0x0028, 0x110F, 0x0029, 0x0028, 0x1110, 0x0029, 0x0028, 0x1110, 0x0029, 0x0028, 0x1111, 0x0029, 0x0028, 0x1111, 0x0029, 0x0028, 0x1112, 0x0029, 0x0028, 0x1112, 0x0029, 0x0028, 0x1100, 0x1161, 0x0029, 0x0028, 0x1100, 0x1161, 0x0029, 0x0028, 0x1102, 0x1161, 0x0029, 0x0028, 0x1102, 0x1161, 0x0029 }; unsigned short unac_data267[] = { 0x0028, 0x1103, 0x1161, 0x0029, 0x0028, 0x1103, 0x1161, 0x0029, 0x0028, 0x1105, 0x1161, 0x0029, 0x0028, 0x1105, 0x1161, 0x0029, 0x0028, 0x1106, 0x1161, 0x0029, 0x0028, 0x1106, 0x1161, 0x0029, 0x0028, 0x1107, 0x1161, 0x0029, 0x0028, 0x1107, 0x1161, 0x0029, 0x0028, 0x1109, 0x1161, 0x0029, 0x0028, 0x1109, 0x1161, 0x0029, 0x0028, 0x110B, 0x1161, 0x0029, 0x0028, 0x110B, 0x1161, 0x0029, 0x0028, 0x110C, 0x1161, 0x0029, 0x0028, 0x110C, 0x1161, 0x0029, 0x0028, 0x110E, 0x1161, 0x0029, 0x0028, 0x110E, 0x1161, 0x0029, 0x0028, 0x110F, 0x1161, 0x0029, 0x0028, 0x110F, 0x1161, 0x0029, 0x0028, 0x1110, 0x1161, 0x0029, 0x0028, 0x1110, 0x1161, 0x0029, 0x0028, 0x1111, 0x1161, 0x0029, 0x0028, 0x1111, 0x1161, 0x0029, 0x0028, 0x1112, 0x1161, 0x0029, 0x0028, 0x1112, 0x1161, 0x0029, 0x0028, 0x110C, 0x116E, 0x0029, 0x0028, 0x110C, 0x116E, 0x0029, 0x0028, 0x110B, 0x1169, 0x110C, 0x1165, 0x11AB, 0x0029, 0x0028, 0x110B, 0x1169, 0x110C, 0x1165, 0x11AB, 0x0029, 0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029, 0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029, 0xFFFF, 0xFFFF }; unsigned short unac_data268[] = { 0x0028, 0x4E00, 0x0029, 0x0028, 0x4E00, 0x0029, 0x0028, 0x4E8C, 0x0029, 0x0028, 0x4E8C, 0x0029, 0x0028, 0x4E09, 0x0029, 0x0028, 0x4E09, 0x0029, 0x0028, 0x56DB, 0x0029, 0x0028, 0x56DB, 0x0029, 0x0028, 0x4E94, 0x0029, 0x0028, 0x4E94, 0x0029, 0x0028, 0x516D, 0x0029, 0x0028, 0x516D, 0x0029, 0x0028, 0x4E03, 0x0029, 0x0028, 0x4E03, 0x0029, 0x0028, 0x516B, 0x0029, 0x0028, 0x516B, 0x0029, 0x0028, 0x4E5D, 0x0029, 0x0028, 0x4E5D, 0x0029, 0x0028, 0x5341, 0x0029, 0x0028, 0x5341, 0x0029, 0x0028, 0x6708, 0x0029, 0x0028, 0x6708, 0x0029, 0x0028, 0x706B, 0x0029, 0x0028, 0x706B, 0x0029, 0x0028, 0x6C34, 0x0029, 0x0028, 0x6C34, 0x0029, 0x0028, 0x6728, 0x0029, 0x0028, 0x6728, 0x0029, 0x0028, 0x91D1, 0x0029, 0x0028, 0x91D1, 0x0029, 0x0028, 0x571F, 0x0029, 0x0028, 0x571F, 0x0029 }; unsigned short unac_data269[] = { 0x0028, 0x65E5, 0x0029, 0x0028, 0x65E5, 0x0029, 0x0028, 0x682A, 0x0029, 0x0028, 0x682A, 0x0029, 0x0028, 0x6709, 0x0029, 0x0028, 0x6709, 0x0029, 0x0028, 0x793E, 0x0029, 0x0028, 0x793E, 0x0029, 0x0028, 0x540D, 0x0029, 0x0028, 0x540D, 0x0029, 0x0028, 0x7279, 0x0029, 0x0028, 0x7279, 0x0029, 0x0028, 0x8CA1, 0x0029, 0x0028, 0x8CA1, 0x0029, 0x0028, 0x795D, 0x0029, 0x0028, 0x795D, 0x0029, 0x0028, 0x52B4, 0x0029, 0x0028, 0x52B4, 0x0029, 0x0028, 0x4EE3, 0x0029, 0x0028, 0x4EE3, 0x0029, 0x0028, 0x547C, 0x0029, 0x0028, 0x547C, 0x0029, 0x0028, 0x5B66, 0x0029, 0x0028, 0x5B66, 0x0029, 0x0028, 0x76E3, 0x0029, 0x0028, 0x76E3, 0x0029, 0x0028, 0x4F01, 0x0029, 0x0028, 0x4F01, 0x0029, 0x0028, 0x8CC7, 0x0029, 0x0028, 0x8CC7, 0x0029, 0x0028, 0x5354, 0x0029, 0x0028, 0x5354, 0x0029 }; unsigned short unac_data270[] = { 0x0028, 0x796D, 0x0029, 0x0028, 0x796D, 0x0029, 0x0028, 0x4F11, 0x0029, 0x0028, 0x4F11, 0x0029, 0x0028, 0x81EA, 0x0029, 0x0028, 0x81EA, 0x0029, 0x0028, 0x81F3, 0x0029, 0x0028, 0x81F3, 0x0029, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data271[] = { 0x0050, 0x0054, 0x0045, 0x0070, 0x0074, 0x0065, 0x0032, 0x0031, 0x0032, 0x0031, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0033, 0x0032, 0x0033, 0x0032, 0x0034, 0x0032, 0x0034, 0x0032, 0x0035, 0x0032, 0x0035, 0x0032, 0x0036, 0x0032, 0x0036, 0x0032, 0x0037, 0x0032, 0x0037, 0x0032, 0x0038, 0x0032, 0x0038, 0x0032, 0x0039, 0x0032, 0x0039, 0x0033, 0x0030, 0x0033, 0x0030, 0x0033, 0x0031, 0x0033, 0x0031, 0x0033, 0x0032, 0x0033, 0x0032, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0034, 0x0033, 0x0034, 0x0033, 0x0035, 0x0033, 0x0035 }; unsigned short unac_data272[] = { 0x1100, 0x1100, 0x1102, 0x1102, 0x1103, 0x1103, 0x1105, 0x1105, 0x1106, 0x1106, 0x1107, 0x1107, 0x1109, 0x1109, 0x110B, 0x110B, 0x110C, 0x110C, 0x110E, 0x110E, 0x110F, 0x110F, 0x1110, 0x1110, 0x1111, 0x1111, 0x1112, 0x1112, 0x1100, 0x1161, 0x1100, 0x1161, 0x1102, 0x1161, 0x1102, 0x1161 }; unsigned short unac_data273[] = { 0x1103, 0x1161, 0x1103, 0x1161, 0x1105, 0x1161, 0x1105, 0x1161, 0x1106, 0x1161, 0x1106, 0x1161, 0x1107, 0x1161, 0x1107, 0x1161, 0x1109, 0x1161, 0x1109, 0x1161, 0x110B, 0x1161, 0x110B, 0x1161, 0x110C, 0x1161, 0x110C, 0x1161, 0x110E, 0x1161, 0x110E, 0x1161, 0x110F, 0x1161, 0x110F, 0x1161, 0x1110, 0x1161, 0x1110, 0x1161, 0x1111, 0x1161, 0x1111, 0x1161, 0x1112, 0x1161, 0x1112, 0x1161, 0x110E, 0x1161, 0x11B7, 0x1100, 0x1169, 0x110E, 0x1161, 0x11B7, 0x1100, 0x1169, 0x110C, 0x116E, 0x110B, 0x1174, 0x110C, 0x116E, 0x110B, 0x1174, 0x110B, 0x116E, 0x110B, 0x116E, 0xFFFF, 0xFFFF }; unsigned short unac_data274[] = { 0x4E00, 0x4E00, 0x4E8C, 0x4E8C, 0x4E09, 0x4E09, 0x56DB, 0x56DB, 0x4E94, 0x4E94, 0x516D, 0x516D, 0x4E03, 0x4E03, 0x516B, 0x516B, 0x4E5D, 0x4E5D, 0x5341, 0x5341, 0x6708, 0x6708, 0x706B, 0x706B, 0x6C34, 0x6C34, 0x6728, 0x6728, 0x91D1, 0x91D1, 0x571F, 0x571F }; unsigned short unac_data275[] = { 0x65E5, 0x65E5, 0x682A, 0x682A, 0x6709, 0x6709, 0x793E, 0x793E, 0x540D, 0x540D, 0x7279, 0x7279, 0x8CA1, 0x8CA1, 0x795D, 0x795D, 0x52B4, 0x52B4, 0x79D8, 0x79D8, 0x7537, 0x7537, 0x5973, 0x5973, 0x9069, 0x9069, 0x512A, 0x512A, 0x5370, 0x5370, 0x6CE8, 0x6CE8 }; unsigned short unac_data276[] = { 0x9805, 0x9805, 0x4F11, 0x4F11, 0x5199, 0x5199, 0x6B63, 0x6B63, 0x4E0A, 0x4E0A, 0x4E2D, 0x4E2D, 0x4E0B, 0x4E0B, 0x5DE6, 0x5DE6, 0x53F3, 0x53F3, 0x533B, 0x533B, 0x5B97, 0x5B97, 0x5B66, 0x5B66, 0x76E3, 0x76E3, 0x4F01, 0x4F01, 0x8CC7, 0x8CC7, 0x5354, 0x5354 }; unsigned short unac_data277[] = { 0x591C, 0x591C, 0x0033, 0x0036, 0x0033, 0x0036, 0x0033, 0x0037, 0x0033, 0x0037, 0x0033, 0x0038, 0x0033, 0x0038, 0x0033, 0x0039, 0x0033, 0x0039, 0x0034, 0x0030, 0x0034, 0x0030, 0x0034, 0x0031, 0x0034, 0x0031, 0x0034, 0x0032, 0x0034, 0x0032, 0x0034, 0x0033, 0x0034, 0x0033, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0035, 0x0034, 0x0035, 0x0034, 0x0036, 0x0034, 0x0036, 0x0034, 0x0037, 0x0034, 0x0037, 0x0034, 0x0038, 0x0034, 0x0038, 0x0034, 0x0039, 0x0034, 0x0039, 0x0035, 0x0030, 0x0035, 0x0030 }; unsigned short unac_data278[] = { 0x0031, 0x6708, 0x0031, 0x6708, 0x0032, 0x6708, 0x0032, 0x6708, 0x0033, 0x6708, 0x0033, 0x6708, 0x0034, 0x6708, 0x0034, 0x6708, 0x0035, 0x6708, 0x0035, 0x6708, 0x0036, 0x6708, 0x0036, 0x6708, 0x0037, 0x6708, 0x0037, 0x6708, 0x0038, 0x6708, 0x0038, 0x6708, 0x0039, 0x6708, 0x0039, 0x6708, 0x0031, 0x0030, 0x6708, 0x0031, 0x0030, 0x6708, 0x0031, 0x0031, 0x6708, 0x0031, 0x0031, 0x6708, 0x0031, 0x0032, 0x6708, 0x0031, 0x0032, 0x6708, 0x0048, 0x0067, 0x0068, 0x0067, 0x0065, 0x0072, 0x0067, 0x0065, 0x0072, 0x0067, 0x0065, 0x0056, 0x0065, 0x0076, 0x004C, 0x0054, 0x0044, 0x006C, 0x0074, 0x0064 }; unsigned short unac_data279[] = { 0x30A2, 0x30A2, 0x30A4, 0x30A4, 0x30A6, 0x30A6, 0x30A8, 0x30A8, 0x30AA, 0x30AA, 0x30AB, 0x30AB, 0x30AD, 0x30AD, 0x30AF, 0x30AF, 0x30B1, 0x30B1, 0x30B3, 0x30B3, 0x30B5, 0x30B5, 0x30B7, 0x30B7, 0x30B9, 0x30B9, 0x30BB, 0x30BB, 0x30BD, 0x30BD, 0x30BF, 0x30BF }; unsigned short unac_data280[] = { 0x30C1, 0x30C1, 0x30C4, 0x30C4, 0x30C6, 0x30C6, 0x30C8, 0x30C8, 0x30CA, 0x30CA, 0x30CB, 0x30CB, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30CE, 0x30CE, 0x30CF, 0x30CF, 0x30D2, 0x30D2, 0x30D5, 0x30D5, 0x30D8, 0x30D8, 0x30DB, 0x30DB, 0x30DE, 0x30DE, 0x30DF, 0x30DF }; unsigned short unac_data281[] = { 0x30E0, 0x30E0, 0x30E1, 0x30E1, 0x30E2, 0x30E2, 0x30E4, 0x30E4, 0x30E6, 0x30E6, 0x30E8, 0x30E8, 0x30E9, 0x30E9, 0x30EA, 0x30EA, 0x30EB, 0x30EB, 0x30EC, 0x30EC, 0x30ED, 0x30ED, 0x30EF, 0x30EF, 0x30F0, 0x30F0, 0x30F1, 0x30F1, 0x30F2, 0x30F2, 0xFFFF, 0xFFFF }; unsigned short unac_data282[] = { 0x30A2, 0x30D1, 0x30FC, 0x30C8, 0x30A2, 0x30D1, 0x30FC, 0x30C8, 0x30A2, 0x30EB, 0x30D5, 0x30A1, 0x30A2, 0x30EB, 0x30D5, 0x30A1, 0x30A2, 0x30F3, 0x30DA, 0x30A2, 0x30A2, 0x30F3, 0x30DA, 0x30A2, 0x30A2, 0x30FC, 0x30EB, 0x30A2, 0x30FC, 0x30EB, 0x30A4, 0x30CB, 0x30F3, 0x30B0, 0x30A4, 0x30CB, 0x30F3, 0x30B0, 0x30A4, 0x30F3, 0x30C1, 0x30A4, 0x30F3, 0x30C1, 0x30A6, 0x30A9, 0x30F3, 0x30A6, 0x30A9, 0x30F3, 0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9, 0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9, 0x30A8, 0x30FC, 0x30AB, 0x30FC, 0x30A8, 0x30FC, 0x30AB, 0x30FC, 0x30AA, 0x30F3, 0x30B9, 0x30AA, 0x30F3, 0x30B9, 0x30AA, 0x30FC, 0x30E0, 0x30AA, 0x30FC, 0x30E0, 0x30AB, 0x30A4, 0x30EA, 0x30AB, 0x30A4, 0x30EA, 0x30AB, 0x30E9, 0x30C3, 0x30C8, 0x30AB, 0x30E9, 0x30C3, 0x30C8, 0x30AB, 0x30ED, 0x30EA, 0x30FC, 0x30AB, 0x30ED, 0x30EA, 0x30FC, 0x30AC, 0x30ED, 0x30F3, 0x30AC, 0x30ED, 0x30F3, 0x30AC, 0x30F3, 0x30DE, 0x30AC, 0x30F3, 0x30DE }; unsigned short unac_data283[] = { 0x30AE, 0x30AC, 0x30AE, 0x30AC, 0x30AE, 0x30CB, 0x30FC, 0x30AE, 0x30CB, 0x30FC, 0x30AD, 0x30E5, 0x30EA, 0x30FC, 0x30AD, 0x30E5, 0x30EA, 0x30FC, 0x30AE, 0x30EB, 0x30C0, 0x30FC, 0x30AE, 0x30EB, 0x30C0, 0x30FC, 0x30AD, 0x30ED, 0x30AD, 0x30ED, 0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0, 0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0, 0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8, 0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8, 0x30B0, 0x30E9, 0x30E0, 0x30B0, 0x30E9, 0x30E0, 0x30B0, 0x30E9, 0x30E0, 0x30C8, 0x30F3, 0x30B0, 0x30E9, 0x30E0, 0x30C8, 0x30F3, 0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED, 0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED, 0x30AF, 0x30ED, 0x30FC, 0x30CD, 0x30AF, 0x30ED, 0x30FC, 0x30CD, 0x30B1, 0x30FC, 0x30B9, 0x30B1, 0x30FC, 0x30B9, 0x30B3, 0x30EB, 0x30CA, 0x30B3, 0x30EB, 0x30CA, 0x30B3, 0x30FC, 0x30DD, 0x30B3, 0x30FC, 0x30DD, 0x30B5, 0x30A4, 0x30AF, 0x30EB, 0x30B5, 0x30A4, 0x30AF, 0x30EB }; unsigned short unac_data284[] = { 0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0, 0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0, 0x30B7, 0x30EA, 0x30F3, 0x30B0, 0x30B7, 0x30EA, 0x30F3, 0x30B0, 0x30BB, 0x30F3, 0x30C1, 0x30BB, 0x30F3, 0x30C1, 0x30BB, 0x30F3, 0x30C8, 0x30BB, 0x30F3, 0x30C8, 0x30C0, 0x30FC, 0x30B9, 0x30C0, 0x30FC, 0x30B9, 0x30C7, 0x30B7, 0x30C7, 0x30B7, 0x30C9, 0x30EB, 0x30C9, 0x30EB, 0x30C8, 0x30F3, 0x30C8, 0x30F3, 0x30CA, 0x30CE, 0x30CA, 0x30CE, 0x30CE, 0x30C3, 0x30C8, 0x30CE, 0x30C3, 0x30C8, 0x30CF, 0x30A4, 0x30C4, 0x30CF, 0x30A4, 0x30C4, 0x30D1, 0x30FC, 0x30BB, 0x30F3, 0x30C8, 0x30D1, 0x30FC, 0x30BB, 0x30F3, 0x30C8, 0x30D1, 0x30FC, 0x30C4, 0x30D1, 0x30FC, 0x30C4, 0x30D0, 0x30FC, 0x30EC, 0x30EB, 0x30D0, 0x30FC, 0x30EC, 0x30EB, 0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB, 0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB, 0x30D4, 0x30AF, 0x30EB, 0x30D4, 0x30AF, 0x30EB }; unsigned short unac_data285[] = { 0x30D4, 0x30B3, 0x30D4, 0x30B3, 0x30D3, 0x30EB, 0x30D3, 0x30EB, 0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C9, 0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C9, 0x30D5, 0x30A3, 0x30FC, 0x30C8, 0x30D5, 0x30A3, 0x30FC, 0x30C8, 0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB, 0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB, 0x30D5, 0x30E9, 0x30F3, 0x30D5, 0x30E9, 0x30F3, 0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB, 0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB, 0x30DA, 0x30BD, 0x30DA, 0x30BD, 0x30DA, 0x30CB, 0x30D2, 0x30DA, 0x30CB, 0x30D2, 0x30D8, 0x30EB, 0x30C4, 0x30D8, 0x30EB, 0x30C4, 0x30DA, 0x30F3, 0x30B9, 0x30DA, 0x30F3, 0x30B9, 0x30DA, 0x30FC, 0x30B8, 0x30DA, 0x30FC, 0x30B8, 0x30D9, 0x30FC, 0x30BF, 0x30D9, 0x30FC, 0x30BF, 0x30DD, 0x30A4, 0x30F3, 0x30C8, 0x30DD, 0x30A4, 0x30F3, 0x30C8, 0x30DC, 0x30EB, 0x30C8, 0x30DC, 0x30EB, 0x30C8, 0x30DB, 0x30F3, 0x30DB, 0x30F3 }; unsigned short unac_data286[] = { 0x30DD, 0x30F3, 0x30C9, 0x30DD, 0x30F3, 0x30C9, 0x30DB, 0x30FC, 0x30EB, 0x30DB, 0x30FC, 0x30EB, 0x30DB, 0x30FC, 0x30F3, 0x30DB, 0x30FC, 0x30F3, 0x30DE, 0x30A4, 0x30AF, 0x30ED, 0x30DE, 0x30A4, 0x30AF, 0x30ED, 0x30DE, 0x30A4, 0x30EB, 0x30DE, 0x30A4, 0x30EB, 0x30DE, 0x30C3, 0x30CF, 0x30DE, 0x30C3, 0x30CF, 0x30DE, 0x30EB, 0x30AF, 0x30DE, 0x30EB, 0x30AF, 0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3, 0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3, 0x30DF, 0x30AF, 0x30ED, 0x30F3, 0x30DF, 0x30AF, 0x30ED, 0x30F3, 0x30DF, 0x30EA, 0x30DF, 0x30EA, 0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB, 0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB, 0x30E1, 0x30AC, 0x30E1, 0x30AC, 0x30E1, 0x30AC, 0x30C8, 0x30F3, 0x30E1, 0x30AC, 0x30C8, 0x30F3, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x30E4, 0x30FC, 0x30C9, 0x30E4, 0x30FC, 0x30C9, 0x30E4, 0x30FC, 0x30EB, 0x30E4, 0x30FC, 0x30EB }; unsigned short unac_data287[] = { 0x30E6, 0x30A2, 0x30F3, 0x30E6, 0x30A2, 0x30F3, 0x30EA, 0x30C3, 0x30C8, 0x30EB, 0x30EA, 0x30C3, 0x30C8, 0x30EB, 0x30EA, 0x30E9, 0x30EA, 0x30E9, 0x30EB, 0x30D4, 0x30FC, 0x30EB, 0x30D4, 0x30FC, 0x30EB, 0x30FC, 0x30D6, 0x30EB, 0x30EB, 0x30FC, 0x30D6, 0x30EB, 0x30EC, 0x30E0, 0x30EC, 0x30E0, 0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3, 0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3, 0x30EF, 0x30C3, 0x30C8, 0x30EF, 0x30C3, 0x30C8, 0x0030, 0x70B9, 0x0030, 0x70B9, 0x0031, 0x70B9, 0x0031, 0x70B9, 0x0032, 0x70B9, 0x0032, 0x70B9, 0x0033, 0x70B9, 0x0033, 0x70B9, 0x0034, 0x70B9, 0x0034, 0x70B9, 0x0035, 0x70B9, 0x0035, 0x70B9, 0x0036, 0x70B9, 0x0036, 0x70B9, 0x0037, 0x70B9, 0x0037, 0x70B9 }; unsigned short unac_data288[] = { 0x0038, 0x70B9, 0x0038, 0x70B9, 0x0039, 0x70B9, 0x0039, 0x70B9, 0x0031, 0x0030, 0x70B9, 0x0031, 0x0030, 0x70B9, 0x0031, 0x0031, 0x70B9, 0x0031, 0x0031, 0x70B9, 0x0031, 0x0032, 0x70B9, 0x0031, 0x0032, 0x70B9, 0x0031, 0x0033, 0x70B9, 0x0031, 0x0033, 0x70B9, 0x0031, 0x0034, 0x70B9, 0x0031, 0x0034, 0x70B9, 0x0031, 0x0035, 0x70B9, 0x0031, 0x0035, 0x70B9, 0x0031, 0x0036, 0x70B9, 0x0031, 0x0036, 0x70B9, 0x0031, 0x0037, 0x70B9, 0x0031, 0x0037, 0x70B9, 0x0031, 0x0038, 0x70B9, 0x0031, 0x0038, 0x70B9, 0x0031, 0x0039, 0x70B9, 0x0031, 0x0039, 0x70B9, 0x0032, 0x0030, 0x70B9, 0x0032, 0x0030, 0x70B9, 0x0032, 0x0031, 0x70B9, 0x0032, 0x0031, 0x70B9, 0x0032, 0x0032, 0x70B9, 0x0032, 0x0032, 0x70B9, 0x0032, 0x0033, 0x70B9, 0x0032, 0x0033, 0x70B9 }; unsigned short unac_data289[] = { 0x0032, 0x0034, 0x70B9, 0x0032, 0x0034, 0x70B9, 0x0068, 0x0050, 0x0061, 0x0068, 0x0070, 0x0061, 0x0064, 0x0061, 0x0064, 0x0061, 0x0041, 0x0055, 0x0061, 0x0075, 0x0062, 0x0061, 0x0072, 0x0062, 0x0061, 0x0072, 0x006F, 0x0056, 0x006F, 0x0076, 0x0070, 0x0063, 0x0070, 0x0063, 0x0064, 0x006D, 0x0064, 0x006D, 0x0064, 0x006D, 0x0032, 0x0064, 0x006D, 0x0032, 0x0064, 0x006D, 0x0033, 0x0064, 0x006D, 0x0033, 0x0049, 0x0055, 0x0069, 0x0075, 0x5E73, 0x6210, 0x5E73, 0x6210, 0x662D, 0x548C, 0x662D, 0x548C, 0x5927, 0x6B63, 0x5927, 0x6B63, 0x660E, 0x6CBB, 0x660E, 0x6CBB, 0x682A, 0x5F0F, 0x4F1A, 0x793E, 0x682A, 0x5F0F, 0x4F1A, 0x793E }; unsigned short unac_data290[] = { 0x0070, 0x0041, 0x0070, 0x0061, 0x006E, 0x0041, 0x006E, 0x0061, 0x03BC, 0x0041, 0x03BC, 0x0061, 0x006D, 0x0041, 0x006D, 0x0061, 0x006B, 0x0041, 0x006B, 0x0061, 0x004B, 0x0042, 0x006B, 0x0062, 0x004D, 0x0042, 0x006D, 0x0062, 0x0047, 0x0042, 0x0067, 0x0062, 0x0063, 0x0061, 0x006C, 0x0063, 0x0061, 0x006C, 0x006B, 0x0063, 0x0061, 0x006C, 0x006B, 0x0063, 0x0061, 0x006C, 0x0070, 0x0046, 0x0070, 0x0066, 0x006E, 0x0046, 0x006E, 0x0066, 0x03BC, 0x0046, 0x03BC, 0x0066, 0x03BC, 0x0067, 0x03BC, 0x0067, 0x006D, 0x0067, 0x006D, 0x0067, 0x006B, 0x0067, 0x006B, 0x0067 }; unsigned short unac_data291[] = { 0x0048, 0x007A, 0x0068, 0x007A, 0x006B, 0x0048, 0x007A, 0x006B, 0x0068, 0x007A, 0x004D, 0x0048, 0x007A, 0x006D, 0x0068, 0x007A, 0x0047, 0x0048, 0x007A, 0x0067, 0x0068, 0x007A, 0x0054, 0x0048, 0x007A, 0x0074, 0x0068, 0x007A, 0x03BC, 0x006C, 0x03BC, 0x006C, 0x006D, 0x006C, 0x006D, 0x006C, 0x0064, 0x006C, 0x0064, 0x006C, 0x006B, 0x006C, 0x006B, 0x006C, 0x0066, 0x006D, 0x0066, 0x006D, 0x006E, 0x006D, 0x006E, 0x006D, 0x03BC, 0x006D, 0x03BC, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x0063, 0x006D, 0x0063, 0x006D, 0x006B, 0x006D, 0x006B, 0x006D, 0x006D, 0x006D, 0x0032, 0x006D, 0x006D, 0x0032 }; unsigned short unac_data292[] = { 0x0063, 0x006D, 0x0032, 0x0063, 0x006D, 0x0032, 0x006D, 0x0032, 0x006D, 0x0032, 0x006B, 0x006D, 0x0032, 0x006B, 0x006D, 0x0032, 0x006D, 0x006D, 0x0033, 0x006D, 0x006D, 0x0033, 0x0063, 0x006D, 0x0033, 0x0063, 0x006D, 0x0033, 0x006D, 0x0033, 0x006D, 0x0033, 0x006B, 0x006D, 0x0033, 0x006B, 0x006D, 0x0033, 0x006D, 0x2215, 0x0073, 0x006D, 0x2215, 0x0073, 0x006D, 0x2215, 0x0073, 0x0032, 0x006D, 0x2215, 0x0073, 0x0032, 0x0050, 0x0061, 0x0070, 0x0061, 0x006B, 0x0050, 0x0061, 0x006B, 0x0070, 0x0061, 0x004D, 0x0050, 0x0061, 0x006D, 0x0070, 0x0061, 0x0047, 0x0050, 0x0061, 0x0067, 0x0070, 0x0061, 0x0072, 0x0061, 0x0064, 0x0072, 0x0061, 0x0064, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0032, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0032 }; unsigned short unac_data293[] = { 0x0070, 0x0073, 0x0070, 0x0073, 0x006E, 0x0073, 0x006E, 0x0073, 0x03BC, 0x0073, 0x03BC, 0x0073, 0x006D, 0x0073, 0x006D, 0x0073, 0x0070, 0x0056, 0x0070, 0x0076, 0x006E, 0x0056, 0x006E, 0x0076, 0x03BC, 0x0056, 0x03BC, 0x0076, 0x006D, 0x0056, 0x006D, 0x0076, 0x006B, 0x0056, 0x006B, 0x0076, 0x004D, 0x0056, 0x006D, 0x0076, 0x0070, 0x0057, 0x0070, 0x0077, 0x006E, 0x0057, 0x006E, 0x0077, 0x03BC, 0x0057, 0x03BC, 0x0077, 0x006D, 0x0057, 0x006D, 0x0077, 0x006B, 0x0057, 0x006B, 0x0077, 0x004D, 0x0057, 0x006D, 0x0077 }; unsigned short unac_data294[] = { 0x006B, 0x03A9, 0x006B, 0x03C9, 0x004D, 0x03A9, 0x006D, 0x03C9, 0x0061, 0x002E, 0x006D, 0x002E, 0x0061, 0x002E, 0x006D, 0x002E, 0x0042, 0x0071, 0x0062, 0x0071, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0064, 0x0063, 0x0064, 0x0043, 0x2215, 0x006B, 0x0067, 0x0063, 0x2215, 0x006B, 0x0067, 0x0043, 0x006F, 0x002E, 0x0063, 0x006F, 0x002E, 0x0064, 0x0042, 0x0064, 0x0062, 0x0047, 0x0079, 0x0067, 0x0079, 0x0068, 0x0061, 0x0068, 0x0061, 0x0048, 0x0050, 0x0068, 0x0070, 0x0069, 0x006E, 0x0069, 0x006E, 0x004B, 0x004B, 0x006B, 0x006B, 0x004B, 0x004D, 0x006B, 0x006D, 0x006B, 0x0074, 0x006B, 0x0074 }; unsigned short unac_data295[] = { 0x006C, 0x006D, 0x006C, 0x006D, 0x006C, 0x006E, 0x006C, 0x006E, 0x006C, 0x006F, 0x0067, 0x006C, 0x006F, 0x0067, 0x006C, 0x0078, 0x006C, 0x0078, 0x006D, 0x0062, 0x006D, 0x0062, 0x006D, 0x0069, 0x006C, 0x006D, 0x0069, 0x006C, 0x006D, 0x006F, 0x006C, 0x006D, 0x006F, 0x006C, 0x0050, 0x0048, 0x0070, 0x0068, 0x0070, 0x002E, 0x006D, 0x002E, 0x0070, 0x002E, 0x006D, 0x002E, 0x0050, 0x0050, 0x004D, 0x0070, 0x0070, 0x006D, 0x0050, 0x0052, 0x0070, 0x0072, 0x0073, 0x0072, 0x0073, 0x0072, 0x0053, 0x0076, 0x0073, 0x0076, 0x0057, 0x0062, 0x0077, 0x0062, 0x0056, 0x2215, 0x006D, 0x0076, 0x2215, 0x006D, 0x0041, 0x2215, 0x006D, 0x0061, 0x2215, 0x006D }; unsigned short unac_data296[] = { 0x0031, 0x65E5, 0x0031, 0x65E5, 0x0032, 0x65E5, 0x0032, 0x65E5, 0x0033, 0x65E5, 0x0033, 0x65E5, 0x0034, 0x65E5, 0x0034, 0x65E5, 0x0035, 0x65E5, 0x0035, 0x65E5, 0x0036, 0x65E5, 0x0036, 0x65E5, 0x0037, 0x65E5, 0x0037, 0x65E5, 0x0038, 0x65E5, 0x0038, 0x65E5, 0x0039, 0x65E5, 0x0039, 0x65E5, 0x0031, 0x0030, 0x65E5, 0x0031, 0x0030, 0x65E5, 0x0031, 0x0031, 0x65E5, 0x0031, 0x0031, 0x65E5, 0x0031, 0x0032, 0x65E5, 0x0031, 0x0032, 0x65E5, 0x0031, 0x0033, 0x65E5, 0x0031, 0x0033, 0x65E5, 0x0031, 0x0034, 0x65E5, 0x0031, 0x0034, 0x65E5, 0x0031, 0x0035, 0x65E5, 0x0031, 0x0035, 0x65E5, 0x0031, 0x0036, 0x65E5, 0x0031, 0x0036, 0x65E5 }; unsigned short unac_data297[] = { 0x0031, 0x0037, 0x65E5, 0x0031, 0x0037, 0x65E5, 0x0031, 0x0038, 0x65E5, 0x0031, 0x0038, 0x65E5, 0x0031, 0x0039, 0x65E5, 0x0031, 0x0039, 0x65E5, 0x0032, 0x0030, 0x65E5, 0x0032, 0x0030, 0x65E5, 0x0032, 0x0031, 0x65E5, 0x0032, 0x0031, 0x65E5, 0x0032, 0x0032, 0x65E5, 0x0032, 0x0032, 0x65E5, 0x0032, 0x0033, 0x65E5, 0x0032, 0x0033, 0x65E5, 0x0032, 0x0034, 0x65E5, 0x0032, 0x0034, 0x65E5, 0x0032, 0x0035, 0x65E5, 0x0032, 0x0035, 0x65E5, 0x0032, 0x0036, 0x65E5, 0x0032, 0x0036, 0x65E5, 0x0032, 0x0037, 0x65E5, 0x0032, 0x0037, 0x65E5, 0x0032, 0x0038, 0x65E5, 0x0032, 0x0038, 0x65E5, 0x0032, 0x0039, 0x65E5, 0x0032, 0x0039, 0x65E5, 0x0033, 0x0030, 0x65E5, 0x0033, 0x0030, 0x65E5, 0x0033, 0x0031, 0x65E5, 0x0033, 0x0031, 0x65E5, 0x0067, 0x0061, 0x006C, 0x0067, 0x0061, 0x006C }; unsigned short unac_data298[] = { 0xFFFF, 0xA641, 0xFFFF, 0xFFFF, 0xFFFF, 0xA643, 0xFFFF, 0xFFFF, 0xFFFF, 0xA645, 0xFFFF, 0xFFFF, 0xFFFF, 0xA647, 0xFFFF, 0xFFFF, 0xFFFF, 0xA649, 0xFFFF, 0xFFFF, 0xFFFF, 0xA64B, 0xFFFF, 0xFFFF, 0xFFFF, 0xA64D, 0xFFFF, 0xFFFF, 0xFFFF, 0xA64F, 0xFFFF, 0xFFFF }; unsigned short unac_data299[] = { 0xFFFF, 0xA651, 0xFFFF, 0xFFFF, 0xFFFF, 0xA653, 0xFFFF, 0xFFFF, 0xFFFF, 0xA655, 0xFFFF, 0xFFFF, 0xFFFF, 0xA657, 0xFFFF, 0xFFFF, 0xFFFF, 0xA659, 0xFFFF, 0xFFFF, 0xFFFF, 0xA65B, 0xFFFF, 0xFFFF, 0xFFFF, 0xA65D, 0xFFFF, 0xFFFF, 0xFFFF, 0xA65F, 0xFFFF, 0xFFFF }; unsigned short unac_data300[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA663, 0xFFFF, 0xFFFF, 0xFFFF, 0xA665, 0xFFFF, 0xFFFF, 0xFFFF, 0xA667, 0xFFFF, 0xFFFF, 0xFFFF, 0xA669, 0xFFFF, 0xFFFF, 0xFFFF, 0xA66B, 0xFFFF, 0xFFFF, 0xFFFF, 0xA66D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000 }; unsigned short unac_data301[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data302[] = { 0xFFFF, 0xA681, 0xFFFF, 0xFFFF, 0xFFFF, 0xA683, 0xFFFF, 0xFFFF, 0xFFFF, 0xA685, 0xFFFF, 0xFFFF, 0xFFFF, 0xA687, 0xFFFF, 0xFFFF, 0xFFFF, 0xA689, 0xFFFF, 0xFFFF, 0xFFFF, 0xA68B, 0xFFFF, 0xFFFF, 0xFFFF, 0xA68D, 0xFFFF, 0xFFFF, 0xFFFF, 0xA68F, 0xFFFF, 0xFFFF }; unsigned short unac_data303[] = { 0xFFFF, 0xA691, 0xFFFF, 0xFFFF, 0xFFFF, 0xA693, 0xFFFF, 0xFFFF, 0xFFFF, 0xA695, 0xFFFF, 0xFFFF, 0xFFFF, 0xA697, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data304[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA723, 0xFFFF, 0xFFFF, 0xFFFF, 0xA725, 0xFFFF, 0xFFFF, 0xFFFF, 0xA727, 0xFFFF, 0xFFFF, 0xFFFF, 0xA729, 0xFFFF, 0xFFFF, 0xFFFF, 0xA72B, 0xFFFF, 0xFFFF, 0xFFFF, 0xA72D, 0xFFFF, 0xFFFF, 0xFFFF, 0xA72F, 0xFFFF, 0xFFFF }; unsigned short unac_data305[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA733, 0xFFFF, 0xFFFF, 0xFFFF, 0xA735, 0xFFFF, 0xFFFF, 0xFFFF, 0xA737, 0xFFFF, 0xFFFF, 0xFFFF, 0xA739, 0xFFFF, 0xFFFF, 0xFFFF, 0xA73B, 0xFFFF, 0xFFFF, 0xFFFF, 0xA73D, 0xFFFF, 0xFFFF, 0xFFFF, 0xA73F, 0xFFFF, 0xFFFF }; unsigned short unac_data306[] = { 0xFFFF, 0xA741, 0xFFFF, 0xFFFF, 0xFFFF, 0xA743, 0xFFFF, 0xFFFF, 0xFFFF, 0xA745, 0xFFFF, 0xFFFF, 0xFFFF, 0xA747, 0xFFFF, 0xFFFF, 0xFFFF, 0xA749, 0xFFFF, 0xFFFF, 0xFFFF, 0xA74B, 0xFFFF, 0xFFFF, 0xFFFF, 0xA74D, 0xFFFF, 0xFFFF, 0xFFFF, 0xA74F, 0xFFFF, 0xFFFF }; unsigned short unac_data307[] = { 0xFFFF, 0xA751, 0xFFFF, 0xFFFF, 0xFFFF, 0xA753, 0xFFFF, 0xFFFF, 0xFFFF, 0xA755, 0xFFFF, 0xFFFF, 0xFFFF, 0xA757, 0xFFFF, 0xFFFF, 0xFFFF, 0xA759, 0xFFFF, 0xFFFF, 0xFFFF, 0xA75B, 0xFFFF, 0xFFFF, 0xFFFF, 0xA75D, 0xFFFF, 0xFFFF, 0xFFFF, 0xA75F, 0xFFFF, 0xFFFF }; unsigned short unac_data308[] = { 0xFFFF, 0xA761, 0xFFFF, 0xFFFF, 0xFFFF, 0xA763, 0xFFFF, 0xFFFF, 0xFFFF, 0xA765, 0xFFFF, 0xFFFF, 0xFFFF, 0xA767, 0xFFFF, 0xFFFF, 0xFFFF, 0xA769, 0xFFFF, 0xFFFF, 0xFFFF, 0xA76B, 0xFFFF, 0xFFFF, 0xFFFF, 0xA76D, 0xFFFF, 0xFFFF, 0xFFFF, 0xA76F, 0xFFFF, 0xFFFF }; unsigned short unac_data309[] = { 0xA76F, 0xA76F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA77A, 0xFFFF, 0xFFFF, 0xFFFF, 0xA77C, 0xFFFF, 0xFFFF, 0xFFFF, 0x1D79, 0xFFFF, 0xA77F, 0xFFFF, 0xFFFF }; unsigned short unac_data310[] = { 0xFFFF, 0xA781, 0xFFFF, 0xFFFF, 0xFFFF, 0xA783, 0xFFFF, 0xFFFF, 0xFFFF, 0xA785, 0xFFFF, 0xFFFF, 0xFFFF, 0xA787, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA78C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data311[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data312[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data313[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data314[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data315[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data316[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; unsigned short unac_data317[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data318[] = { 0x8C48, 0x8C48, 0x66F4, 0x66F4, 0x8ECA, 0x8ECA, 0x8CC8, 0x8CC8, 0x6ED1, 0x6ED1, 0x4E32, 0x4E32, 0x53E5, 0x53E5, 0x9F9C, 0x9F9C, 0x9F9C, 0x9F9C, 0x5951, 0x5951, 0x91D1, 0x91D1, 0x5587, 0x5587, 0x5948, 0x5948, 0x61F6, 0x61F6, 0x7669, 0x7669, 0x7F85, 0x7F85 }; unsigned short unac_data319[] = { 0x863F, 0x863F, 0x87BA, 0x87BA, 0x88F8, 0x88F8, 0x908F, 0x908F, 0x6A02, 0x6A02, 0x6D1B, 0x6D1B, 0x70D9, 0x70D9, 0x73DE, 0x73DE, 0x843D, 0x843D, 0x916A, 0x916A, 0x99F1, 0x99F1, 0x4E82, 0x4E82, 0x5375, 0x5375, 0x6B04, 0x6B04, 0x721B, 0x721B, 0x862D, 0x862D }; unsigned short unac_data320[] = { 0x9E1E, 0x9E1E, 0x5D50, 0x5D50, 0x6FEB, 0x6FEB, 0x85CD, 0x85CD, 0x8964, 0x8964, 0x62C9, 0x62C9, 0x81D8, 0x81D8, 0x881F, 0x881F, 0x5ECA, 0x5ECA, 0x6717, 0x6717, 0x6D6A, 0x6D6A, 0x72FC, 0x72FC, 0x90CE, 0x90CE, 0x4F86, 0x4F86, 0x51B7, 0x51B7, 0x52DE, 0x52DE }; unsigned short unac_data321[] = { 0x64C4, 0x64C4, 0x6AD3, 0x6AD3, 0x7210, 0x7210, 0x76E7, 0x76E7, 0x8001, 0x8001, 0x8606, 0x8606, 0x865C, 0x865C, 0x8DEF, 0x8DEF, 0x9732, 0x9732, 0x9B6F, 0x9B6F, 0x9DFA, 0x9DFA, 0x788C, 0x788C, 0x797F, 0x797F, 0x7DA0, 0x7DA0, 0x83C9, 0x83C9, 0x9304, 0x9304 }; unsigned short unac_data322[] = { 0x9E7F, 0x9E7F, 0x8AD6, 0x8AD6, 0x58DF, 0x58DF, 0x5F04, 0x5F04, 0x7C60, 0x7C60, 0x807E, 0x807E, 0x7262, 0x7262, 0x78CA, 0x78CA, 0x8CC2, 0x8CC2, 0x96F7, 0x96F7, 0x58D8, 0x58D8, 0x5C62, 0x5C62, 0x6A13, 0x6A13, 0x6DDA, 0x6DDA, 0x6F0F, 0x6F0F, 0x7D2F, 0x7D2F }; unsigned short unac_data323[] = { 0x7E37, 0x7E37, 0x964B, 0x964B, 0x52D2, 0x52D2, 0x808B, 0x808B, 0x51DC, 0x51DC, 0x51CC, 0x51CC, 0x7A1C, 0x7A1C, 0x7DBE, 0x7DBE, 0x83F1, 0x83F1, 0x9675, 0x9675, 0x8B80, 0x8B80, 0x62CF, 0x62CF, 0x6A02, 0x6A02, 0x8AFE, 0x8AFE, 0x4E39, 0x4E39, 0x5BE7, 0x5BE7 }; unsigned short unac_data324[] = { 0x6012, 0x6012, 0x7387, 0x7387, 0x7570, 0x7570, 0x5317, 0x5317, 0x78FB, 0x78FB, 0x4FBF, 0x4FBF, 0x5FA9, 0x5FA9, 0x4E0D, 0x4E0D, 0x6CCC, 0x6CCC, 0x6578, 0x6578, 0x7D22, 0x7D22, 0x53C3, 0x53C3, 0x585E, 0x585E, 0x7701, 0x7701, 0x8449, 0x8449, 0x8AAA, 0x8AAA }; unsigned short unac_data325[] = { 0x6BBA, 0x6BBA, 0x8FB0, 0x8FB0, 0x6C88, 0x6C88, 0x62FE, 0x62FE, 0x82E5, 0x82E5, 0x63A0, 0x63A0, 0x7565, 0x7565, 0x4EAE, 0x4EAE, 0x5169, 0x5169, 0x51C9, 0x51C9, 0x6881, 0x6881, 0x7CE7, 0x7CE7, 0x826F, 0x826F, 0x8AD2, 0x8AD2, 0x91CF, 0x91CF, 0x52F5, 0x52F5 }; unsigned short unac_data326[] = { 0x5442, 0x5442, 0x5973, 0x5973, 0x5EEC, 0x5EEC, 0x65C5, 0x65C5, 0x6FFE, 0x6FFE, 0x792A, 0x792A, 0x95AD, 0x95AD, 0x9A6A, 0x9A6A, 0x9E97, 0x9E97, 0x9ECE, 0x9ECE, 0x529B, 0x529B, 0x66C6, 0x66C6, 0x6B77, 0x6B77, 0x8F62, 0x8F62, 0x5E74, 0x5E74, 0x6190, 0x6190 }; unsigned short unac_data327[] = { 0x6200, 0x6200, 0x649A, 0x649A, 0x6F23, 0x6F23, 0x7149, 0x7149, 0x7489, 0x7489, 0x79CA, 0x79CA, 0x7DF4, 0x7DF4, 0x806F, 0x806F, 0x8F26, 0x8F26, 0x84EE, 0x84EE, 0x9023, 0x9023, 0x934A, 0x934A, 0x5217, 0x5217, 0x52A3, 0x52A3, 0x54BD, 0x54BD, 0x70C8, 0x70C8 }; unsigned short unac_data328[] = { 0x88C2, 0x88C2, 0x8AAA, 0x8AAA, 0x5EC9, 0x5EC9, 0x5FF5, 0x5FF5, 0x637B, 0x637B, 0x6BAE, 0x6BAE, 0x7C3E, 0x7C3E, 0x7375, 0x7375, 0x4EE4, 0x4EE4, 0x56F9, 0x56F9, 0x5BE7, 0x5BE7, 0x5DBA, 0x5DBA, 0x601C, 0x601C, 0x73B2, 0x73B2, 0x7469, 0x7469, 0x7F9A, 0x7F9A }; unsigned short unac_data329[] = { 0x8046, 0x8046, 0x9234, 0x9234, 0x96F6, 0x96F6, 0x9748, 0x9748, 0x9818, 0x9818, 0x4F8B, 0x4F8B, 0x79AE, 0x79AE, 0x91B4, 0x91B4, 0x96B8, 0x96B8, 0x60E1, 0x60E1, 0x4E86, 0x4E86, 0x50DA, 0x50DA, 0x5BEE, 0x5BEE, 0x5C3F, 0x5C3F, 0x6599, 0x6599, 0x6A02, 0x6A02 }; unsigned short unac_data330[] = { 0x71CE, 0x71CE, 0x7642, 0x7642, 0x84FC, 0x84FC, 0x907C, 0x907C, 0x9F8D, 0x9F8D, 0x6688, 0x6688, 0x962E, 0x962E, 0x5289, 0x5289, 0x677B, 0x677B, 0x67F3, 0x67F3, 0x6D41, 0x6D41, 0x6E9C, 0x6E9C, 0x7409, 0x7409, 0x7559, 0x7559, 0x786B, 0x786B, 0x7D10, 0x7D10 }; unsigned short unac_data331[] = { 0x985E, 0x985E, 0x516D, 0x516D, 0x622E, 0x622E, 0x9678, 0x9678, 0x502B, 0x502B, 0x5D19, 0x5D19, 0x6DEA, 0x6DEA, 0x8F2A, 0x8F2A, 0x5F8B, 0x5F8B, 0x6144, 0x6144, 0x6817, 0x6817, 0x7387, 0x7387, 0x9686, 0x9686, 0x5229, 0x5229, 0x540F, 0x540F, 0x5C65, 0x5C65 }; unsigned short unac_data332[] = { 0x6613, 0x6613, 0x674E, 0x674E, 0x68A8, 0x68A8, 0x6CE5, 0x6CE5, 0x7406, 0x7406, 0x75E2, 0x75E2, 0x7F79, 0x7F79, 0x88CF, 0x88CF, 0x88E1, 0x88E1, 0x91CC, 0x91CC, 0x96E2, 0x96E2, 0x533F, 0x533F, 0x6EBA, 0x6EBA, 0x541D, 0x541D, 0x71D0, 0x71D0, 0x7498, 0x7498 }; unsigned short unac_data333[] = { 0x85FA, 0x85FA, 0x96A3, 0x96A3, 0x9C57, 0x9C57, 0x9E9F, 0x9E9F, 0x6797, 0x6797, 0x6DCB, 0x6DCB, 0x81E8, 0x81E8, 0x7ACB, 0x7ACB, 0x7B20, 0x7B20, 0x7C92, 0x7C92, 0x72C0, 0x72C0, 0x7099, 0x7099, 0x8B58, 0x8B58, 0x4EC0, 0x4EC0, 0x8336, 0x8336, 0x523A, 0x523A }; unsigned short unac_data334[] = { 0x5207, 0x5207, 0x5EA6, 0x5EA6, 0x62D3, 0x62D3, 0x7CD6, 0x7CD6, 0x5B85, 0x5B85, 0x6D1E, 0x6D1E, 0x66B4, 0x66B4, 0x8F3B, 0x8F3B, 0x884C, 0x884C, 0x964D, 0x964D, 0x898B, 0x898B, 0x5ED3, 0x5ED3, 0x5140, 0x5140, 0x55C0, 0x55C0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data335[] = { 0x585A, 0x585A, 0xFFFF, 0xFFFF, 0x6674, 0x6674, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x51DE, 0x51DE, 0x732A, 0x732A, 0x76CA, 0x76CA, 0x793C, 0x793C, 0x795E, 0x795E, 0x7965, 0x7965, 0x798F, 0x798F, 0x9756, 0x9756, 0x7CBE, 0x7CBE, 0x7FBD, 0x7FBD, 0xFFFF, 0xFFFF }; unsigned short unac_data336[] = { 0x8612, 0x8612, 0xFFFF, 0xFFFF, 0x8AF8, 0x8AF8, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9038, 0x9038, 0x90FD, 0x90FD, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x98EF, 0x98EF, 0x98FC, 0x98FC, 0x9928, 0x9928, 0x9DB4, 0x9DB4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data337[] = { 0x4FAE, 0x4FAE, 0x50E7, 0x50E7, 0x514D, 0x514D, 0x52C9, 0x52C9, 0x52E4, 0x52E4, 0x5351, 0x5351, 0x559D, 0x559D, 0x5606, 0x5606, 0x5668, 0x5668, 0x5840, 0x5840, 0x58A8, 0x58A8, 0x5C64, 0x5C64, 0x5C6E, 0x5C6E, 0x6094, 0x6094, 0x6168, 0x6168, 0x618E, 0x618E }; unsigned short unac_data338[] = { 0x61F2, 0x61F2, 0x654F, 0x654F, 0x65E2, 0x65E2, 0x6691, 0x6691, 0x6885, 0x6885, 0x6D77, 0x6D77, 0x6E1A, 0x6E1A, 0x6F22, 0x6F22, 0x716E, 0x716E, 0x722B, 0x722B, 0x7422, 0x7422, 0x7891, 0x7891, 0x793E, 0x793E, 0x7949, 0x7949, 0x7948, 0x7948, 0x7950, 0x7950 }; unsigned short unac_data339[] = { 0x7956, 0x7956, 0x795D, 0x795D, 0x798D, 0x798D, 0x798E, 0x798E, 0x7A40, 0x7A40, 0x7A81, 0x7A81, 0x7BC0, 0x7BC0, 0x7DF4, 0x7DF4, 0x7E09, 0x7E09, 0x7E41, 0x7E41, 0x7F72, 0x7F72, 0x8005, 0x8005, 0x81ED, 0x81ED, 0x8279, 0x8279, 0x8279, 0x8279, 0x8457, 0x8457 }; unsigned short unac_data340[] = { 0x8910, 0x8910, 0x8996, 0x8996, 0x8B01, 0x8B01, 0x8B39, 0x8B39, 0x8CD3, 0x8CD3, 0x8D08, 0x8D08, 0x8FB6, 0x8FB6, 0x9038, 0x9038, 0x96E3, 0x96E3, 0x97FF, 0x97FF, 0x983B, 0x983B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data341[] = { 0x4E26, 0x4E26, 0x51B5, 0x51B5, 0x5168, 0x5168, 0x4F80, 0x4F80, 0x5145, 0x5145, 0x5180, 0x5180, 0x52C7, 0x52C7, 0x52FA, 0x52FA, 0x559D, 0x559D, 0x5555, 0x5555, 0x5599, 0x5599, 0x55E2, 0x55E2, 0x585A, 0x585A, 0x58B3, 0x58B3, 0x5944, 0x5944, 0x5954, 0x5954 }; unsigned short unac_data342[] = { 0x5A62, 0x5A62, 0x5B28, 0x5B28, 0x5ED2, 0x5ED2, 0x5ED9, 0x5ED9, 0x5F69, 0x5F69, 0x5FAD, 0x5FAD, 0x60D8, 0x60D8, 0x614E, 0x614E, 0x6108, 0x6108, 0x618E, 0x618E, 0x6160, 0x6160, 0x61F2, 0x61F2, 0x6234, 0x6234, 0x63C4, 0x63C4, 0x641C, 0x641C, 0x6452, 0x6452 }; unsigned short unac_data343[] = { 0x6556, 0x6556, 0x6674, 0x6674, 0x6717, 0x6717, 0x671B, 0x671B, 0x6756, 0x6756, 0x6B79, 0x6B79, 0x6BBA, 0x6BBA, 0x6D41, 0x6D41, 0x6EDB, 0x6EDB, 0x6ECB, 0x6ECB, 0x6F22, 0x6F22, 0x701E, 0x701E, 0x716E, 0x716E, 0x77A7, 0x77A7, 0x7235, 0x7235, 0x72AF, 0x72AF }; unsigned short unac_data344[] = { 0x732A, 0x732A, 0x7471, 0x7471, 0x7506, 0x7506, 0x753B, 0x753B, 0x761D, 0x761D, 0x761F, 0x761F, 0x76CA, 0x76CA, 0x76DB, 0x76DB, 0x76F4, 0x76F4, 0x774A, 0x774A, 0x7740, 0x7740, 0x78CC, 0x78CC, 0x7AB1, 0x7AB1, 0x7BC0, 0x7BC0, 0x7C7B, 0x7C7B, 0x7D5B, 0x7D5B }; unsigned short unac_data345[] = { 0x7DF4, 0x7DF4, 0x7F3E, 0x7F3E, 0x8005, 0x8005, 0x8352, 0x8352, 0x83EF, 0x83EF, 0x8779, 0x8779, 0x8941, 0x8941, 0x8986, 0x8986, 0x8996, 0x8996, 0x8ABF, 0x8ABF, 0x8AF8, 0x8AF8, 0x8ACB, 0x8ACB, 0x8B01, 0x8B01, 0x8AFE, 0x8AFE, 0x8AED, 0x8AED, 0x8B39, 0x8B39 }; unsigned short unac_data346[] = { 0x8B8A, 0x8B8A, 0x8D08, 0x8D08, 0x8F38, 0x8F38, 0x9072, 0x9072, 0x9199, 0x9199, 0x9276, 0x9276, 0x967C, 0x967C, 0x96E3, 0x96E3, 0x9756, 0x9756, 0x97DB, 0x97DB, 0x97FF, 0x97FF, 0x980B, 0x980B, 0x983B, 0x983B, 0x9B12, 0x9B12, 0x9F9C, 0x9F9C, 0xFFFF, 0xFFFF }; unsigned short unac_data347[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x3B9D, 0x3B9D, 0x4018, 0x4018, 0x4039, 0x4039, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9F43, 0x9F43, 0x9F8E, 0x9F8E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data348[] = { 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0069, 0x0066, 0x0069, 0x0066, 0x006C, 0x0066, 0x006C, 0x0066, 0x0066, 0x0069, 0x0066, 0x0066, 0x0069, 0x0066, 0x0066, 0x006C, 0x0066, 0x0066, 0x006C, 0x0074, 0x0073, 0x0074, 0x0073, 0x0073, 0x0074, 0x0073, 0x0074, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data349[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0574, 0x0576, 0x0574, 0x0576, 0x0574, 0x0565, 0x0574, 0x0565, 0x0574, 0x056B, 0x0574, 0x056B, 0x057E, 0x0576, 0x057E, 0x0576, 0x0574, 0x056D, 0x0574, 0x056D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x05D9, 0x05D9, 0x0000, 0x0000, 0x05F2, 0x05F2 }; unsigned short unac_data350[] = { 0x05E2, 0x05E2, 0x05D0, 0x05D0, 0x05D3, 0x05D3, 0x05D4, 0x05D4, 0x05DB, 0x05DB, 0x05DC, 0x05DC, 0x05DD, 0x05DD, 0x05E8, 0x05E8, 0x05EA, 0x05EA, 0x002B, 0x002B, 0x05E9, 0x05E9, 0x05E9, 0x05E9, 0x05E9, 0x05E9, 0x05E9, 0x05E9, 0x05D0, 0x05D0, 0x05D0, 0x05D0 }; unsigned short unac_data351[] = { 0x05D0, 0x05D0, 0x05D1, 0x05D1, 0x05D2, 0x05D2, 0x05D3, 0x05D3, 0x05D4, 0x05D4, 0x05D5, 0x05D5, 0x05D6, 0x05D6, 0xFFFF, 0xFFFF, 0x05D8, 0x05D8, 0x05D9, 0x05D9, 0x05DA, 0x05DA, 0x05DB, 0x05DB, 0x05DC, 0x05DC, 0xFFFF, 0xFFFF, 0x05DE, 0x05DE, 0xFFFF, 0xFFFF }; unsigned short unac_data352[] = { 0x05E0, 0x05E0, 0x05E1, 0x05E1, 0xFFFF, 0xFFFF, 0x05E3, 0x05E3, 0x05E4, 0x05E4, 0xFFFF, 0xFFFF, 0x05E6, 0x05E6, 0x05E7, 0x05E7, 0x05E8, 0x05E8, 0x05E9, 0x05E9, 0x05EA, 0x05EA, 0x05D5, 0x05D5, 0x05D1, 0x05D1, 0x05DB, 0x05DB, 0x05E4, 0x05E4, 0x05D0, 0x05DC, 0x05D0, 0x05DC }; unsigned short unac_data353[] = { 0x0671, 0x0671, 0x0671, 0x0671, 0x067B, 0x067B, 0x067B, 0x067B, 0x067B, 0x067B, 0x067B, 0x067B, 0x067E, 0x067E, 0x067E, 0x067E, 0x067E, 0x067E, 0x067E, 0x067E, 0x0680, 0x0680, 0x0680, 0x0680, 0x0680, 0x0680, 0x0680, 0x0680, 0x067A, 0x067A, 0x067A, 0x067A }; unsigned short unac_data354[] = { 0x067A, 0x067A, 0x067A, 0x067A, 0x067F, 0x067F, 0x067F, 0x067F, 0x067F, 0x067F, 0x067F, 0x067F, 0x0679, 0x0679, 0x0679, 0x0679, 0x0679, 0x0679, 0x0679, 0x0679, 0x06A4, 0x06A4, 0x06A4, 0x06A4, 0x06A4, 0x06A4, 0x06A4, 0x06A4, 0x06A6, 0x06A6, 0x06A6, 0x06A6 }; unsigned short unac_data355[] = { 0x06A6, 0x06A6, 0x06A6, 0x06A6, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0683, 0x0683, 0x0683, 0x0683, 0x0683, 0x0683, 0x0683, 0x0683, 0x0686, 0x0686, 0x0686, 0x0686, 0x0686, 0x0686, 0x0686, 0x0686, 0x0687, 0x0687, 0x0687, 0x0687 }; unsigned short unac_data356[] = { 0x0687, 0x0687, 0x0687, 0x0687, 0x068D, 0x068D, 0x068D, 0x068D, 0x068C, 0x068C, 0x068C, 0x068C, 0x068E, 0x068E, 0x068E, 0x068E, 0x0688, 0x0688, 0x0688, 0x0688, 0x0698, 0x0698, 0x0698, 0x0698, 0x0691, 0x0691, 0x0691, 0x0691, 0x06A9, 0x06A9, 0x06A9, 0x06A9 }; unsigned short unac_data357[] = { 0x06A9, 0x06A9, 0x06A9, 0x06A9, 0x06AF, 0x06AF, 0x06AF, 0x06AF, 0x06AF, 0x06AF, 0x06AF, 0x06AF, 0x06B3, 0x06B3, 0x06B3, 0x06B3, 0x06B3, 0x06B3, 0x06B3, 0x06B3, 0x06B1, 0x06B1, 0x06B1, 0x06B1, 0x06B1, 0x06B1, 0x06B1, 0x06B1, 0x06BA, 0x06BA, 0x06BA, 0x06BA }; unsigned short unac_data358[] = { 0x06BB, 0x06BB, 0x06BB, 0x06BB, 0x06BB, 0x06BB, 0x06BB, 0x06BB, 0x06D5, 0x06D5, 0x06D5, 0x06D5, 0x06C1, 0x06C1, 0x06C1, 0x06C1, 0x06C1, 0x06C1, 0x06C1, 0x06C1, 0x06BE, 0x06BE, 0x06BE, 0x06BE, 0x06BE, 0x06BE, 0x06BE, 0x06BE, 0x06D2, 0x06D2, 0x06D2, 0x06D2 }; unsigned short unac_data359[] = { 0x06D2, 0x06D2, 0x06D2, 0x06D2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data360[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x06AD, 0x06AD, 0x06AD, 0x06AD, 0x06AD, 0x06AD, 0x06AD, 0x06AD, 0x06C7, 0x06C7, 0x06C7, 0x06C7, 0x06C6, 0x06C6, 0x06C6, 0x06C6, 0x06C8, 0x06C8, 0x06C8, 0x06C8, 0x06C7, 0x0674, 0x06C7, 0x0674, 0x06CB, 0x06CB, 0x06CB, 0x06CB }; unsigned short unac_data361[] = { 0x06C5, 0x06C5, 0x06C5, 0x06C5, 0x06C9, 0x06C9, 0x06C9, 0x06C9, 0x06D0, 0x06D0, 0x06D0, 0x06D0, 0x06D0, 0x06D0, 0x06D0, 0x06D0, 0x0649, 0x0649, 0x0649, 0x0649, 0x0627, 0x064A, 0x0627, 0x064A, 0x0627, 0x064A, 0x0627, 0x064A, 0x06D5, 0x064A, 0x06D5, 0x064A, 0x06D5, 0x064A, 0x06D5, 0x064A, 0x0648, 0x064A, 0x0648, 0x064A, 0x0648, 0x064A, 0x0648, 0x064A }; unsigned short unac_data362[] = { 0x06C7, 0x064A, 0x06C7, 0x064A, 0x06C7, 0x064A, 0x06C7, 0x064A, 0x06C6, 0x064A, 0x06C6, 0x064A, 0x06C6, 0x064A, 0x06C6, 0x064A, 0x06C8, 0x064A, 0x06C8, 0x064A, 0x06C8, 0x064A, 0x06C8, 0x064A, 0x06D0, 0x064A, 0x06D0, 0x064A, 0x06D0, 0x064A, 0x06D0, 0x064A, 0x06D0, 0x064A, 0x06D0, 0x064A, 0x0649, 0x064A, 0x0649, 0x064A, 0x0649, 0x064A, 0x0649, 0x064A, 0x0649, 0x064A, 0x0649, 0x064A, 0x06CC, 0x06CC, 0x06CC, 0x06CC, 0x06CC, 0x06CC, 0x06CC, 0x06CC }; unsigned short unac_data363[] = { 0x062C, 0x064A, 0x062C, 0x064A, 0x062D, 0x064A, 0x062D, 0x064A, 0x0645, 0x064A, 0x0645, 0x064A, 0x0649, 0x064A, 0x0649, 0x064A, 0x064A, 0x064A, 0x064A, 0x064A, 0x0628, 0x062C, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0645, 0x0628, 0x0649, 0x0628, 0x0649, 0x0628, 0x064A, 0x0628, 0x064A, 0x062A, 0x062C, 0x062A, 0x062C, 0x062A, 0x062D, 0x062A, 0x062D, 0x062A, 0x062E, 0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0645, 0x062A, 0x0649, 0x062A, 0x0649 }; unsigned short unac_data364[] = { 0x062A, 0x064A, 0x062A, 0x064A, 0x062B, 0x062C, 0x062B, 0x062C, 0x062B, 0x0645, 0x062B, 0x0645, 0x062B, 0x0649, 0x062B, 0x0649, 0x062B, 0x064A, 0x062B, 0x064A, 0x062C, 0x062D, 0x062C, 0x062D, 0x062C, 0x0645, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x062C, 0x062D, 0x0645, 0x062D, 0x0645, 0x062E, 0x062C, 0x062E, 0x062C, 0x062E, 0x062D, 0x062E, 0x062D, 0x062E, 0x0645, 0x062E, 0x0645, 0x0633, 0x062C, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x062E, 0x0633, 0x0645, 0x0633, 0x0645 }; unsigned short unac_data365[] = { 0x0635, 0x062D, 0x0635, 0x062D, 0x0635, 0x0645, 0x0635, 0x0645, 0x0636, 0x062C, 0x0636, 0x062C, 0x0636, 0x062D, 0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x062E, 0x0636, 0x0645, 0x0636, 0x0645, 0x0637, 0x062D, 0x0637, 0x062D, 0x0637, 0x0645, 0x0637, 0x0645, 0x0638, 0x0645, 0x0638, 0x0645, 0x0639, 0x062C, 0x0639, 0x062C, 0x0639, 0x0645, 0x0639, 0x0645, 0x063A, 0x062C, 0x063A, 0x062C, 0x063A, 0x0645, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062D, 0x0641, 0x062E, 0x0641, 0x062E }; unsigned short unac_data366[] = { 0x0641, 0x0645, 0x0641, 0x0645, 0x0641, 0x0649, 0x0641, 0x0649, 0x0641, 0x064A, 0x0641, 0x064A, 0x0642, 0x062D, 0x0642, 0x062D, 0x0642, 0x0645, 0x0642, 0x0645, 0x0642, 0x0649, 0x0642, 0x0649, 0x0642, 0x064A, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, 0x0627, 0x0643, 0x062C, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062D, 0x0643, 0x062E, 0x0643, 0x062E, 0x0643, 0x0644, 0x0643, 0x0644, 0x0643, 0x0645, 0x0643, 0x0645, 0x0643, 0x0649, 0x0643, 0x0649, 0x0643, 0x064A, 0x0643, 0x064A, 0x0644, 0x062C, 0x0644, 0x062C }; unsigned short unac_data367[] = { 0x0644, 0x062D, 0x0644, 0x062D, 0x0644, 0x062E, 0x0644, 0x062E, 0x0644, 0x0645, 0x0644, 0x0645, 0x0644, 0x0649, 0x0644, 0x0649, 0x0644, 0x064A, 0x0644, 0x064A, 0x0645, 0x062C, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x062E, 0x0645, 0x0645, 0x0645, 0x0645, 0x0645, 0x0649, 0x0645, 0x0649, 0x0645, 0x064A, 0x0645, 0x064A, 0x0646, 0x062C, 0x0646, 0x062C, 0x0646, 0x062D, 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0645, 0x0646, 0x0649, 0x0646, 0x0649 }; unsigned short unac_data368[] = { 0x0646, 0x064A, 0x0646, 0x064A, 0x0647, 0x062C, 0x0647, 0x062C, 0x0647, 0x0645, 0x0647, 0x0645, 0x0647, 0x0649, 0x0647, 0x0649, 0x0647, 0x064A, 0x0647, 0x064A, 0x064A, 0x062C, 0x064A, 0x062C, 0x064A, 0x062D, 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0645, 0x064A, 0x0649, 0x064A, 0x0649, 0x064A, 0x064A, 0x064A, 0x064A, 0x0630, 0x0630, 0x0631, 0x0631, 0x0649, 0x0649, 0x0020, 0x0020, 0x0020, 0x0020 }; unsigned short unac_data369[] = { 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0631, 0x064A, 0x0631, 0x064A, 0x0632, 0x064A, 0x0632, 0x064A, 0x0645, 0x064A, 0x0645, 0x064A, 0x0646, 0x064A, 0x0646, 0x064A, 0x0649, 0x064A, 0x0649, 0x064A, 0x064A, 0x064A, 0x064A, 0x064A, 0x0628, 0x0631, 0x0628, 0x0631, 0x0628, 0x0632, 0x0628, 0x0632, 0x0628, 0x0645, 0x0628, 0x0645, 0x0628, 0x0646, 0x0628, 0x0646, 0x0628, 0x0649, 0x0628, 0x0649, 0x0628, 0x064A, 0x0628, 0x064A }; unsigned short unac_data370[] = { 0x062A, 0x0631, 0x062A, 0x0631, 0x062A, 0x0632, 0x062A, 0x0632, 0x062A, 0x0645, 0x062A, 0x0645, 0x062A, 0x0646, 0x062A, 0x0646, 0x062A, 0x0649, 0x062A, 0x0649, 0x062A, 0x064A, 0x062A, 0x064A, 0x062B, 0x0631, 0x062B, 0x0631, 0x062B, 0x0632, 0x062B, 0x0632, 0x062B, 0x0645, 0x062B, 0x0645, 0x062B, 0x0646, 0x062B, 0x0646, 0x062B, 0x0649, 0x062B, 0x0649, 0x062B, 0x064A, 0x062B, 0x064A, 0x0641, 0x0649, 0x0641, 0x0649, 0x0641, 0x064A, 0x0641, 0x064A, 0x0642, 0x0649, 0x0642, 0x0649, 0x0642, 0x064A, 0x0642, 0x064A }; unsigned short unac_data371[] = { 0x0643, 0x0627, 0x0643, 0x0627, 0x0643, 0x0644, 0x0643, 0x0644, 0x0643, 0x0645, 0x0643, 0x0645, 0x0643, 0x0649, 0x0643, 0x0649, 0x0643, 0x064A, 0x0643, 0x064A, 0x0644, 0x0645, 0x0644, 0x0645, 0x0644, 0x0649, 0x0644, 0x0649, 0x0644, 0x064A, 0x0644, 0x064A, 0x0645, 0x0627, 0x0645, 0x0627, 0x0645, 0x0645, 0x0645, 0x0645, 0x0646, 0x0631, 0x0646, 0x0631, 0x0646, 0x0632, 0x0646, 0x0632, 0x0646, 0x0645, 0x0646, 0x0645, 0x0646, 0x0646, 0x0646, 0x0646, 0x0646, 0x0649, 0x0646, 0x0649, 0x0646, 0x064A, 0x0646, 0x064A }; unsigned short unac_data372[] = { 0x0649, 0x0649, 0x064A, 0x0631, 0x064A, 0x0631, 0x064A, 0x0632, 0x064A, 0x0632, 0x064A, 0x0645, 0x064A, 0x0645, 0x064A, 0x0646, 0x064A, 0x0646, 0x064A, 0x0649, 0x064A, 0x0649, 0x064A, 0x064A, 0x064A, 0x064A, 0x062C, 0x064A, 0x062C, 0x064A, 0x062D, 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0645, 0x064A, 0x0647, 0x064A, 0x0647, 0x064A, 0x0628, 0x062C, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0645 }; unsigned short unac_data373[] = { 0x0628, 0x0647, 0x0628, 0x0647, 0x062A, 0x062C, 0x062A, 0x062C, 0x062A, 0x062D, 0x062A, 0x062D, 0x062A, 0x062E, 0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0645, 0x062A, 0x0647, 0x062A, 0x0647, 0x062B, 0x0645, 0x062B, 0x0645, 0x062C, 0x062D, 0x062C, 0x062D, 0x062C, 0x0645, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x062C, 0x062D, 0x0645, 0x062D, 0x0645, 0x062E, 0x062C, 0x062E, 0x062C, 0x062E, 0x0645, 0x062E, 0x0645, 0x0633, 0x062C, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x062E }; unsigned short unac_data374[] = { 0x0633, 0x0645, 0x0633, 0x0645, 0x0635, 0x062D, 0x0635, 0x062D, 0x0635, 0x062E, 0x0635, 0x062E, 0x0635, 0x0645, 0x0635, 0x0645, 0x0636, 0x062C, 0x0636, 0x062C, 0x0636, 0x062D, 0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x062E, 0x0636, 0x0645, 0x0636, 0x0645, 0x0637, 0x062D, 0x0637, 0x062D, 0x0638, 0x0645, 0x0638, 0x0645, 0x0639, 0x062C, 0x0639, 0x062C, 0x0639, 0x0645, 0x0639, 0x0645, 0x063A, 0x062C, 0x063A, 0x062C, 0x063A, 0x0645, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062D }; unsigned short unac_data375[] = { 0x0641, 0x062E, 0x0641, 0x062E, 0x0641, 0x0645, 0x0641, 0x0645, 0x0642, 0x062D, 0x0642, 0x062D, 0x0642, 0x0645, 0x0642, 0x0645, 0x0643, 0x062C, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062D, 0x0643, 0x062E, 0x0643, 0x062E, 0x0643, 0x0644, 0x0643, 0x0644, 0x0643, 0x0645, 0x0643, 0x0645, 0x0644, 0x062C, 0x0644, 0x062C, 0x0644, 0x062D, 0x0644, 0x062D, 0x0644, 0x062E, 0x0644, 0x062E, 0x0644, 0x0645, 0x0644, 0x0645, 0x0644, 0x0647, 0x0644, 0x0647, 0x0645, 0x062C, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062D }; unsigned short unac_data376[] = { 0x0645, 0x062E, 0x0645, 0x062E, 0x0645, 0x0645, 0x0645, 0x0645, 0x0646, 0x062C, 0x0646, 0x062C, 0x0646, 0x062D, 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0645, 0x0646, 0x0647, 0x0646, 0x0647, 0x0647, 0x062C, 0x0647, 0x062C, 0x0647, 0x0645, 0x0647, 0x0645, 0x0647, 0x0647, 0x064A, 0x062C, 0x064A, 0x062C, 0x064A, 0x062D, 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0645, 0x064A, 0x0647, 0x064A, 0x0647, 0x0645, 0x064A, 0x0645, 0x064A }; unsigned short unac_data377[] = { 0x0647, 0x064A, 0x0647, 0x064A, 0x0628, 0x0645, 0x0628, 0x0645, 0x0628, 0x0647, 0x0628, 0x0647, 0x062A, 0x0645, 0x062A, 0x0645, 0x062A, 0x0647, 0x062A, 0x0647, 0x062B, 0x0645, 0x062B, 0x0645, 0x062B, 0x0647, 0x062B, 0x0647, 0x0633, 0x0645, 0x0633, 0x0645, 0x0633, 0x0647, 0x0633, 0x0647, 0x0634, 0x0645, 0x0634, 0x0645, 0x0634, 0x0647, 0x0634, 0x0647, 0x0643, 0x0644, 0x0643, 0x0644, 0x0643, 0x0645, 0x0643, 0x0645, 0x0644, 0x0645, 0x0644, 0x0645, 0x0646, 0x0645, 0x0646, 0x0645, 0x0646, 0x0647, 0x0646, 0x0647 }; unsigned short unac_data378[] = { 0x064A, 0x0645, 0x064A, 0x0645, 0x064A, 0x0647, 0x064A, 0x0647, 0x0640, 0x0640, 0x0640, 0x0640, 0x0640, 0x0640, 0x0637, 0x0649, 0x0637, 0x0649, 0x0637, 0x064A, 0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x0649, 0x0639, 0x064A, 0x0639, 0x064A, 0x063A, 0x0649, 0x063A, 0x0649, 0x063A, 0x064A, 0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x0649, 0x0633, 0x064A, 0x0633, 0x064A, 0x0634, 0x0649, 0x0634, 0x0649, 0x0634, 0x064A, 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x0649 }; unsigned short unac_data379[] = { 0x062D, 0x064A, 0x062D, 0x064A, 0x062C, 0x0649, 0x062C, 0x0649, 0x062C, 0x064A, 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x0649, 0x062E, 0x064A, 0x062E, 0x064A, 0x0635, 0x0649, 0x0635, 0x0649, 0x0635, 0x064A, 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x0649, 0x0636, 0x064A, 0x0636, 0x064A, 0x0634, 0x062C, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0645, 0x0634, 0x0631, 0x0634, 0x0631, 0x0633, 0x0631, 0x0633, 0x0631, 0x0635, 0x0631, 0x0635, 0x0631 }; unsigned short unac_data380[] = { 0x0636, 0x0631, 0x0636, 0x0631, 0x0637, 0x0649, 0x0637, 0x0649, 0x0637, 0x064A, 0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x0649, 0x0639, 0x064A, 0x0639, 0x064A, 0x063A, 0x0649, 0x063A, 0x0649, 0x063A, 0x064A, 0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x0649, 0x0633, 0x064A, 0x0633, 0x064A, 0x0634, 0x0649, 0x0634, 0x0649, 0x0634, 0x064A, 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x0649, 0x062D, 0x064A, 0x062D, 0x064A, 0x062C, 0x0649, 0x062C, 0x0649, 0x062C, 0x064A, 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x0649 }; unsigned short unac_data381[] = { 0x062E, 0x064A, 0x062E, 0x064A, 0x0635, 0x0649, 0x0635, 0x0649, 0x0635, 0x064A, 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x0649, 0x0636, 0x064A, 0x0636, 0x064A, 0x0634, 0x062C, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0645, 0x0634, 0x0631, 0x0634, 0x0631, 0x0633, 0x0631, 0x0633, 0x0631, 0x0635, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0636, 0x0631, 0x0634, 0x062C, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x062E }; unsigned short unac_data382[] = { 0x0634, 0x0645, 0x0634, 0x0645, 0x0633, 0x0647, 0x0633, 0x0647, 0x0634, 0x0647, 0x0634, 0x0647, 0x0637, 0x0645, 0x0637, 0x0645, 0x0633, 0x062C, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x062E, 0x0634, 0x062C, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x062E, 0x0637, 0x0645, 0x0637, 0x0645, 0x0638, 0x0645, 0x0638, 0x0645, 0x0627, 0x0627, 0x0627, 0x0627, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data383[] = { 0x062A, 0x062C, 0x0645, 0x062A, 0x062C, 0x0645, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x0645, 0x062A, 0x062D, 0x0645, 0x062A, 0x062E, 0x0645, 0x062A, 0x062E, 0x0645, 0x062A, 0x0645, 0x062C, 0x062A, 0x0645, 0x062C, 0x062A, 0x0645, 0x062D, 0x062A, 0x0645, 0x062D, 0x062A, 0x0645, 0x062E, 0x062A, 0x0645, 0x062E, 0x062C, 0x0645, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x0645, 0x062D, 0x062D, 0x0645, 0x064A, 0x062D, 0x0645, 0x064A, 0x062D, 0x0645, 0x0649, 0x062D, 0x0645, 0x0649, 0x0633, 0x062D, 0x062C, 0x0633, 0x062D, 0x062C, 0x0633, 0x062C, 0x062D, 0x0633, 0x062C, 0x062D, 0x0633, 0x062C, 0x0649, 0x0633, 0x062C, 0x0649, 0x0633, 0x0645, 0x062D, 0x0633, 0x0645, 0x062D }; unsigned short unac_data384[] = { 0x0633, 0x0645, 0x062D, 0x0633, 0x0645, 0x062D, 0x0633, 0x0645, 0x062C, 0x0633, 0x0645, 0x062C, 0x0633, 0x0645, 0x0645, 0x0633, 0x0645, 0x0645, 0x0633, 0x0645, 0x0645, 0x0633, 0x0645, 0x0645, 0x0635, 0x062D, 0x062D, 0x0635, 0x062D, 0x062D, 0x0635, 0x062D, 0x062D, 0x0635, 0x062D, 0x062D, 0x0635, 0x0645, 0x0645, 0x0635, 0x0645, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062C, 0x064A, 0x0634, 0x062C, 0x064A, 0x0634, 0x0645, 0x062E, 0x0634, 0x0645, 0x062E, 0x0634, 0x0645, 0x062E, 0x0634, 0x0645, 0x062E, 0x0634, 0x0645, 0x0645, 0x0634, 0x0645, 0x0645, 0x0634, 0x0645, 0x0645, 0x0634, 0x0645, 0x0645, 0x0636, 0x062D, 0x0649, 0x0636, 0x062D, 0x0649, 0x0636, 0x062E, 0x0645, 0x0636, 0x062E, 0x0645 }; unsigned short unac_data385[] = { 0x0636, 0x062E, 0x0645, 0x0636, 0x062E, 0x0645, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x0645, 0x0637, 0x0645, 0x0645, 0x0637, 0x0645, 0x064A, 0x0637, 0x0645, 0x064A, 0x0639, 0x062C, 0x0645, 0x0639, 0x062C, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0649, 0x0639, 0x0645, 0x0649, 0x063A, 0x0645, 0x0645, 0x063A, 0x0645, 0x0645, 0x063A, 0x0645, 0x064A, 0x063A, 0x0645, 0x064A, 0x063A, 0x0645, 0x0649, 0x063A, 0x0645, 0x0649, 0x0641, 0x062E, 0x0645, 0x0641, 0x062E, 0x0645, 0x0641, 0x062E, 0x0645, 0x0641, 0x062E, 0x0645, 0x0642, 0x0645, 0x062D, 0x0642, 0x0645, 0x062D, 0x0642, 0x0645, 0x0645, 0x0642, 0x0645, 0x0645 }; unsigned short unac_data386[] = { 0x0644, 0x062D, 0x0645, 0x0644, 0x062D, 0x0645, 0x0644, 0x062D, 0x064A, 0x0644, 0x062D, 0x064A, 0x0644, 0x062D, 0x0649, 0x0644, 0x062D, 0x0649, 0x0644, 0x062C, 0x062C, 0x0644, 0x062C, 0x062C, 0x0644, 0x062C, 0x062C, 0x0644, 0x062C, 0x062C, 0x0644, 0x062E, 0x0645, 0x0644, 0x062E, 0x0645, 0x0644, 0x062E, 0x0645, 0x0644, 0x062E, 0x0645, 0x0644, 0x0645, 0x062D, 0x0644, 0x0645, 0x062D, 0x0644, 0x0645, 0x062D, 0x0644, 0x0645, 0x062D, 0x0645, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x0645, 0x062D, 0x0645, 0x0645, 0x062D, 0x0645, 0x0645, 0x062D, 0x064A, 0x0645, 0x062D, 0x064A, 0x0645, 0x062C, 0x062D, 0x0645, 0x062C, 0x062D, 0x0645, 0x062C, 0x0645, 0x0645, 0x062C, 0x0645, 0x0645, 0x062E, 0x062C, 0x0645, 0x062E, 0x062C, 0x0645, 0x062E, 0x0645, 0x0645, 0x062E, 0x0645 }; unsigned short unac_data387[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0645, 0x062C, 0x062E, 0x0645, 0x062C, 0x062E, 0x0647, 0x0645, 0x062C, 0x0647, 0x0645, 0x062C, 0x0647, 0x0645, 0x0645, 0x0647, 0x0645, 0x0645, 0x0646, 0x062D, 0x0645, 0x0646, 0x062D, 0x0645, 0x0646, 0x062D, 0x0649, 0x0646, 0x062D, 0x0649, 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0649, 0x0646, 0x062C, 0x0649, 0x0646, 0x0645, 0x064A, 0x0646, 0x0645, 0x064A, 0x0646, 0x0645, 0x0649, 0x0646, 0x0645, 0x0649, 0x064A, 0x0645, 0x0645, 0x064A, 0x0645, 0x0645, 0x064A, 0x0645, 0x0645, 0x064A, 0x0645, 0x0645, 0x0628, 0x062E, 0x064A, 0x0628, 0x062E, 0x064A, 0x062A, 0x062C, 0x064A, 0x062A, 0x062C, 0x064A }; unsigned short unac_data388[] = { 0x062A, 0x062C, 0x0649, 0x062A, 0x062C, 0x0649, 0x062A, 0x062E, 0x064A, 0x062A, 0x062E, 0x064A, 0x062A, 0x062E, 0x0649, 0x062A, 0x062E, 0x0649, 0x062A, 0x0645, 0x064A, 0x062A, 0x0645, 0x064A, 0x062A, 0x0645, 0x0649, 0x062A, 0x0645, 0x0649, 0x062C, 0x0645, 0x064A, 0x062C, 0x0645, 0x064A, 0x062C, 0x062D, 0x0649, 0x062C, 0x062D, 0x0649, 0x062C, 0x0645, 0x0649, 0x062C, 0x0645, 0x0649, 0x0633, 0x062E, 0x0649, 0x0633, 0x062E, 0x0649, 0x0635, 0x062D, 0x064A, 0x0635, 0x062D, 0x064A, 0x0634, 0x062D, 0x064A, 0x0634, 0x062D, 0x064A, 0x0636, 0x062D, 0x064A, 0x0636, 0x062D, 0x064A, 0x0644, 0x062C, 0x064A, 0x0644, 0x062C, 0x064A, 0x0644, 0x0645, 0x064A, 0x0644, 0x0645, 0x064A, 0x064A, 0x062D, 0x064A, 0x064A, 0x062D, 0x064A, 0x064A, 0x062C, 0x064A, 0x064A, 0x062C, 0x064A }; unsigned short unac_data389[] = { 0x064A, 0x0645, 0x064A, 0x064A, 0x0645, 0x064A, 0x0645, 0x0645, 0x064A, 0x0645, 0x0645, 0x064A, 0x0642, 0x0645, 0x064A, 0x0642, 0x0645, 0x064A, 0x0646, 0x062D, 0x064A, 0x0646, 0x062D, 0x064A, 0x0642, 0x0645, 0x062D, 0x0642, 0x0645, 0x062D, 0x0644, 0x062D, 0x0645, 0x0644, 0x062D, 0x0645, 0x0639, 0x0645, 0x064A, 0x0639, 0x0645, 0x064A, 0x0643, 0x0645, 0x064A, 0x0643, 0x0645, 0x064A, 0x0646, 0x062C, 0x062D, 0x0646, 0x062C, 0x062D, 0x0645, 0x062E, 0x064A, 0x0645, 0x062E, 0x064A, 0x0644, 0x062C, 0x0645, 0x0644, 0x062C, 0x0645, 0x0643, 0x0645, 0x0645, 0x0643, 0x0645, 0x0645, 0x0644, 0x062C, 0x0645, 0x0644, 0x062C, 0x0645, 0x0646, 0x062C, 0x062D, 0x0646, 0x062C, 0x062D, 0x062C, 0x062D, 0x064A, 0x062C, 0x062D, 0x064A, 0x062D, 0x062C, 0x064A, 0x062D, 0x062C, 0x064A }; unsigned short unac_data390[] = { 0x0645, 0x062C, 0x064A, 0x0645, 0x062C, 0x064A, 0x0641, 0x0645, 0x064A, 0x0641, 0x0645, 0x064A, 0x0628, 0x062D, 0x064A, 0x0628, 0x062D, 0x064A, 0x0643, 0x0645, 0x0645, 0x0643, 0x0645, 0x0645, 0x0639, 0x062C, 0x0645, 0x0639, 0x062C, 0x0645, 0x0635, 0x0645, 0x0645, 0x0635, 0x0645, 0x0645, 0x0633, 0x062E, 0x064A, 0x0633, 0x062E, 0x064A, 0x0646, 0x062C, 0x064A, 0x0646, 0x062C, 0x064A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data391[] = { 0x0635, 0x0644, 0x06D2, 0x0635, 0x0644, 0x06D2, 0x0642, 0x0644, 0x06D2, 0x0642, 0x0644, 0x06D2, 0x0627, 0x0644, 0x0644, 0x0647, 0x0627, 0x0644, 0x0644, 0x0647, 0x0627, 0x0643, 0x0628, 0x0631, 0x0627, 0x0643, 0x0628, 0x0631, 0x0645, 0x062D, 0x0645, 0x062F, 0x0645, 0x062D, 0x0645, 0x062F, 0x0635, 0x0644, 0x0639, 0x0645, 0x0635, 0x0644, 0x0639, 0x0645, 0x0631, 0x0633, 0x0648, 0x0644, 0x0631, 0x0633, 0x0648, 0x0644, 0x0639, 0x0644, 0x064A, 0x0647, 0x0639, 0x0644, 0x064A, 0x0647, 0x0648, 0x0633, 0x0644, 0x0645, 0x0648, 0x0633, 0x0644, 0x0645, 0x0635, 0x0644, 0x0649, 0x0635, 0x0644, 0x0649, 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647, 0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647, 0x0631, 0x06CC, 0x0627, 0x0644, 0x0631, 0x06CC, 0x0627, 0x0644, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data392[] = { 0x002C, 0x002C, 0x3001, 0x3001, 0x3002, 0x3002, 0x003A, 0x003A, 0x003B, 0x003B, 0x0021, 0x0021, 0x003F, 0x003F, 0x3016, 0x3016, 0x3017, 0x3017, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data393[] = { 0x002E, 0x002E, 0x002E, 0x002E, 0x2014, 0x2014, 0x2013, 0x2013, 0x005F, 0x005F, 0x005F, 0x005F, 0x0028, 0x0028, 0x0029, 0x0029, 0x007B, 0x007B, 0x007D, 0x007D, 0x3014, 0x3014, 0x3015, 0x3015, 0x3010, 0x3010, 0x3011, 0x3011, 0x300A, 0x300A, 0x300B, 0x300B, 0x3008, 0x3008 }; unsigned short unac_data394[] = { 0x3009, 0x3009, 0x300C, 0x300C, 0x300D, 0x300D, 0x300E, 0x300E, 0x300F, 0x300F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x005B, 0x005B, 0x005D, 0x005D, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x005F, 0x005F, 0x005F, 0x005F, 0x005F, 0x005F }; unsigned short unac_data395[] = { 0x002C, 0x002C, 0x3001, 0x3001, 0x002E, 0x002E, 0xFFFF, 0xFFFF, 0x003B, 0x003B, 0x003A, 0x003A, 0x003F, 0x003F, 0x0021, 0x0021, 0x2014, 0x2014, 0x0028, 0x0028, 0x0029, 0x0029, 0x007B, 0x007B, 0x007D, 0x007D, 0x3014, 0x3014, 0x3015, 0x3015, 0x0023, 0x0023 }; unsigned short unac_data396[] = { 0x0026, 0x0026, 0x002A, 0x002A, 0x002B, 0x002B, 0x002D, 0x002D, 0x003C, 0x003C, 0x003E, 0x003E, 0x003D, 0x003D, 0xFFFF, 0xFFFF, 0x005C, 0x005C, 0x0024, 0x0024, 0x0025, 0x0025, 0x0040, 0x0040, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data397[] = { 0x0020, 0x0020, 0x0640, 0x0640, 0x0020, 0x0020, 0xFFFF, 0xFFFF, 0x0020, 0x0020, 0xFFFF, 0xFFFF, 0x0020, 0x0020, 0x0640, 0x0640, 0x0020, 0x0020, 0x0640, 0x0640, 0x0020, 0x0020, 0x0640, 0x0640, 0x0020, 0x0020, 0x0640, 0x0640, 0x0020, 0x0020, 0x0640, 0x0640 }; unsigned short unac_data398[] = { 0x0621, 0x0621, 0x0627, 0x0627, 0x0627, 0x0627, 0x0627, 0x0627, 0x0627, 0x0627, 0x0648, 0x0648, 0x0648, 0x0648, 0x0627, 0x0627, 0x0627, 0x0627, 0x064A, 0x064A, 0x064A, 0x064A, 0x064A, 0x064A, 0x064A, 0x064A, 0x0627, 0x0627, 0x0627, 0x0627, 0x0628, 0x0628 }; unsigned short unac_data399[] = { 0x0628, 0x0628, 0x0628, 0x0628, 0x0628, 0x0628, 0x0629, 0x0629, 0x0629, 0x0629, 0x062A, 0x062A, 0x062A, 0x062A, 0x062A, 0x062A, 0x062A, 0x062A, 0x062B, 0x062B, 0x062B, 0x062B, 0x062B, 0x062B, 0x062B, 0x062B, 0x062C, 0x062C, 0x062C, 0x062C, 0x062C, 0x062C }; unsigned short unac_data400[] = { 0x062C, 0x062C, 0x062D, 0x062D, 0x062D, 0x062D, 0x062D, 0x062D, 0x062D, 0x062D, 0x062E, 0x062E, 0x062E, 0x062E, 0x062E, 0x062E, 0x062E, 0x062E, 0x062F, 0x062F, 0x062F, 0x062F, 0x0630, 0x0630, 0x0630, 0x0630, 0x0631, 0x0631, 0x0631, 0x0631, 0x0632, 0x0632 }; unsigned short unac_data401[] = { 0x0632, 0x0632, 0x0633, 0x0633, 0x0633, 0x0633, 0x0633, 0x0633, 0x0633, 0x0633, 0x0634, 0x0634, 0x0634, 0x0634, 0x0634, 0x0634, 0x0634, 0x0634, 0x0635, 0x0635, 0x0635, 0x0635, 0x0635, 0x0635, 0x0635, 0x0635, 0x0636, 0x0636, 0x0636, 0x0636, 0x0636, 0x0636 }; unsigned short unac_data402[] = { 0x0636, 0x0636, 0x0637, 0x0637, 0x0637, 0x0637, 0x0637, 0x0637, 0x0637, 0x0637, 0x0638, 0x0638, 0x0638, 0x0638, 0x0638, 0x0638, 0x0638, 0x0638, 0x0639, 0x0639, 0x0639, 0x0639, 0x0639, 0x0639, 0x0639, 0x0639, 0x063A, 0x063A, 0x063A, 0x063A, 0x063A, 0x063A }; unsigned short unac_data403[] = { 0x063A, 0x063A, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0642, 0x0642, 0x0642, 0x0642, 0x0642, 0x0642, 0x0642, 0x0642, 0x0643, 0x0643, 0x0643, 0x0643, 0x0643, 0x0643, 0x0643, 0x0643, 0x0644, 0x0644, 0x0644, 0x0644, 0x0644, 0x0644 }; unsigned short unac_data404[] = { 0x0644, 0x0644, 0x0645, 0x0645, 0x0645, 0x0645, 0x0645, 0x0645, 0x0645, 0x0645, 0x0646, 0x0646, 0x0646, 0x0646, 0x0646, 0x0646, 0x0646, 0x0646, 0x0647, 0x0647, 0x0647, 0x0647, 0x0647, 0x0647, 0x0647, 0x0647, 0x0648, 0x0648, 0x0648, 0x0648, 0x0649, 0x0649 }; unsigned short unac_data405[] = { 0x0649, 0x0649, 0x064A, 0x064A, 0x064A, 0x064A, 0x064A, 0x064A, 0x064A, 0x064A, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0x0644, 0x0627, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data406[] = { 0xFFFF, 0xFFFF, 0x0021, 0x0021, 0x0022, 0x0022, 0x0023, 0x0023, 0x0024, 0x0024, 0x0025, 0x0025, 0x0026, 0x0026, 0x0027, 0x0027, 0x0028, 0x0028, 0x0029, 0x0029, 0x002A, 0x002A, 0x002B, 0x002B, 0x002C, 0x002C, 0x002D, 0x002D, 0x002E, 0x002E, 0x002F, 0x002F }; unsigned short unac_data407[] = { 0x0030, 0x0030, 0x0031, 0x0031, 0x0032, 0x0032, 0x0033, 0x0033, 0x0034, 0x0034, 0x0035, 0x0035, 0x0036, 0x0036, 0x0037, 0x0037, 0x0038, 0x0038, 0x0039, 0x0039, 0x003A, 0x003A, 0x003B, 0x003B, 0x003C, 0x003C, 0x003D, 0x003D, 0x003E, 0x003E, 0x003F, 0x003F }; unsigned short unac_data408[] = { 0x0040, 0x0040, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044, 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048, 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C, 0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F }; unsigned short unac_data409[] = { 0x0050, 0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054, 0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058, 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x005B, 0x005C, 0x005C, 0x005D, 0x005D, 0x005E, 0x005E, 0x005F, 0x005F }; unsigned short unac_data410[] = { 0x0060, 0x0060, 0x0061, 0x0061, 0x0062, 0x0062, 0x0063, 0x0063, 0x0064, 0x0064, 0x0065, 0x0065, 0x0066, 0x0066, 0x0067, 0x0067, 0x0068, 0x0068, 0x0069, 0x0069, 0x006A, 0x006A, 0x006B, 0x006B, 0x006C, 0x006C, 0x006D, 0x006D, 0x006E, 0x006E, 0x006F, 0x006F }; unsigned short unac_data411[] = { 0x0070, 0x0070, 0x0071, 0x0071, 0x0072, 0x0072, 0x0073, 0x0073, 0x0074, 0x0074, 0x0075, 0x0075, 0x0076, 0x0076, 0x0077, 0x0077, 0x0078, 0x0078, 0x0079, 0x0079, 0x007A, 0x007A, 0x007B, 0x007B, 0x007C, 0x007C, 0x007D, 0x007D, 0x007E, 0x007E, 0x2985, 0x2985 }; unsigned short unac_data412[] = { 0x2986, 0x2986, 0x3002, 0x3002, 0x300C, 0x300C, 0x300D, 0x300D, 0x3001, 0x3001, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data413[] = { 0x1160, 0x1160, 0x1100, 0x1100, 0x1101, 0x1101, 0x11AA, 0x11AA, 0x1102, 0x1102, 0x11AC, 0x11AC, 0x11AD, 0x11AD, 0x1103, 0x1103, 0x1104, 0x1104, 0x1105, 0x1105, 0x11B0, 0x11B0, 0x11B1, 0x11B1, 0x11B2, 0x11B2, 0x11B3, 0x11B3, 0x11B4, 0x11B4, 0x11B5, 0x11B5 }; unsigned short unac_data414[] = { 0x111A, 0x111A, 0x1106, 0x1106, 0x1107, 0x1107, 0x1108, 0x1108, 0x1121, 0x1121, 0x1109, 0x1109, 0x110A, 0x110A, 0x110B, 0x110B, 0x110C, 0x110C, 0x110D, 0x110D, 0x110E, 0x110E, 0x110F, 0x110F, 0x1110, 0x1110, 0x1111, 0x1111, 0x1112, 0x1112, 0xFFFF, 0xFFFF }; unsigned short unac_data415[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1161, 0x1161, 0x1162, 0x1162, 0x1163, 0x1163, 0x1164, 0x1164, 0x1165, 0x1165, 0x1166, 0x1166, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1167, 0x1167, 0x1168, 0x1168, 0x1169, 0x1169, 0x116A, 0x116A, 0x116B, 0x116B, 0x116C, 0x116C }; unsigned short unac_data416[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x116D, 0x116D, 0x116E, 0x116E, 0x116F, 0x116F, 0x1170, 0x1170, 0x1171, 0x1171, 0x1172, 0x1172, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1173, 0x1173, 0x1174, 0x1174, 0x1175, 0x1175, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; unsigned short unac_data417[] = { 0x00A2, 0x00A2, 0x00A3, 0x00A3, 0x00AC, 0x00AC, 0x0020, 0x0020, 0x00A6, 0x00A6, 0x00A5, 0x00A5, 0x20A9, 0x20A9, 0xFFFF, 0xFFFF, 0x2502, 0x2502, 0x2190, 0x2190, 0x2191, 0x2191, 0x2192, 0x2192, 0x2193, 0x2193, 0x25A0, 0x25A0, 0x25CB, 0x25CB, 0xFFFF, 0xFFFF }; unsigned short* unac_data_table[UNAC_BLOCK_COUNT] = { unac_data0, unac_data1, unac_data2, unac_data3, unac_data4, unac_data5, unac_data6, unac_data7, unac_data8, unac_data9, unac_data10, unac_data11, unac_data12, unac_data13, unac_data14, unac_data15, unac_data16, unac_data17, unac_data18, unac_data19, unac_data20, unac_data21, unac_data22, unac_data23, unac_data24, unac_data25, unac_data26, unac_data27, unac_data28, unac_data29, unac_data30, unac_data31, unac_data32, unac_data33, unac_data34, unac_data35, unac_data36, unac_data37, unac_data38, unac_data39, unac_data40, unac_data41, unac_data42, unac_data43, unac_data44, unac_data45, unac_data46, unac_data47, unac_data48, unac_data49, unac_data50, unac_data51, unac_data52, unac_data53, unac_data54, unac_data55, unac_data56, unac_data57, unac_data58, unac_data59, unac_data60, unac_data61, unac_data62, unac_data63, unac_data64, unac_data65, unac_data66, unac_data67, unac_data68, unac_data69, unac_data70, unac_data71, unac_data72, unac_data73, unac_data74, unac_data75, unac_data76, unac_data77, unac_data78, unac_data79, unac_data80, unac_data81, unac_data82, unac_data83, unac_data84, unac_data85, unac_data86, unac_data87, unac_data88, unac_data89, unac_data90, unac_data91, unac_data92, unac_data93, unac_data94, unac_data95, unac_data96, unac_data97, unac_data98, unac_data99, unac_data100, unac_data101, unac_data102, unac_data103, unac_data104, unac_data105, unac_data106, unac_data107, unac_data108, unac_data109, unac_data110, unac_data111, unac_data112, unac_data113, unac_data114, unac_data115, unac_data116, unac_data117, unac_data118, unac_data119, unac_data120, unac_data121, unac_data122, unac_data123, unac_data124, unac_data125, unac_data126, unac_data127, unac_data128, unac_data129, unac_data130, unac_data131, unac_data132, unac_data133, unac_data134, unac_data135, unac_data136, unac_data137, unac_data138, unac_data139, unac_data140, unac_data141, unac_data142, unac_data143, unac_data144, unac_data145, unac_data146, unac_data147, unac_data148, unac_data149, unac_data150, unac_data151, unac_data152, unac_data153, unac_data154, unac_data155, unac_data156, unac_data157, unac_data158, unac_data159, unac_data160, unac_data161, unac_data162, unac_data163, unac_data164, unac_data165, unac_data166, unac_data167, unac_data168, unac_data169, unac_data170, unac_data171, unac_data172, unac_data173, unac_data174, unac_data175, unac_data176, unac_data177, unac_data178, unac_data179, unac_data180, unac_data181, unac_data182, unac_data183, unac_data184, unac_data185, unac_data186, unac_data187, unac_data188, unac_data189, unac_data190, unac_data191, unac_data192, unac_data193, unac_data194, unac_data195, unac_data196, unac_data197, unac_data198, unac_data199, unac_data200, unac_data201, unac_data202, unac_data203, unac_data204, unac_data205, unac_data206, unac_data207, unac_data208, unac_data209, unac_data210, unac_data211, unac_data212, unac_data213, unac_data214, unac_data215, unac_data216, unac_data217, unac_data218, unac_data219, unac_data220, unac_data221, unac_data222, unac_data223, unac_data224, unac_data225, unac_data226, unac_data227, unac_data228, unac_data229, unac_data230, unac_data231, unac_data232, unac_data233, unac_data234, unac_data235, unac_data236, unac_data237, unac_data238, unac_data239, unac_data240, unac_data241, unac_data242, unac_data243, unac_data244, unac_data245, unac_data246, unac_data247, unac_data248, unac_data249, unac_data250, unac_data251, unac_data252, unac_data253, unac_data254, unac_data255, unac_data256, unac_data257, unac_data258, unac_data259, unac_data260, unac_data261, unac_data262, unac_data263, unac_data264, unac_data265, unac_data266, unac_data267, unac_data268, unac_data269, unac_data270, unac_data271, unac_data272, unac_data273, unac_data274, unac_data275, unac_data276, unac_data277, unac_data278, unac_data279, unac_data280, unac_data281, unac_data282, unac_data283, unac_data284, unac_data285, unac_data286, unac_data287, unac_data288, unac_data289, unac_data290, unac_data291, unac_data292, unac_data293, unac_data294, unac_data295, unac_data296, unac_data297, unac_data298, unac_data299, unac_data300, unac_data301, unac_data302, unac_data303, unac_data304, unac_data305, unac_data306, unac_data307, unac_data308, unac_data309, unac_data310, unac_data311, unac_data312, unac_data313, unac_data314, unac_data315, unac_data316, unac_data317, unac_data318, unac_data319, unac_data320, unac_data321, unac_data322, unac_data323, unac_data324, unac_data325, unac_data326, unac_data327, unac_data328, unac_data329, unac_data330, unac_data331, unac_data332, unac_data333, unac_data334, unac_data335, unac_data336, unac_data337, unac_data338, unac_data339, unac_data340, unac_data341, unac_data342, unac_data343, unac_data344, unac_data345, unac_data346, unac_data347, unac_data348, unac_data349, unac_data350, unac_data351, unac_data352, unac_data353, unac_data354, unac_data355, unac_data356, unac_data357, unac_data358, unac_data359, unac_data360, unac_data361, unac_data362, unac_data363, unac_data364, unac_data365, unac_data366, unac_data367, unac_data368, unac_data369, unac_data370, unac_data371, unac_data372, unac_data373, unac_data374, unac_data375, unac_data376, unac_data377, unac_data378, unac_data379, unac_data380, unac_data381, unac_data382, unac_data383, unac_data384, unac_data385, unac_data386, unac_data387, unac_data388, unac_data389, unac_data390, unac_data391, unac_data392, unac_data393, unac_data394, unac_data395, unac_data396, unac_data397, unac_data398, unac_data399, unac_data400, unac_data401, unac_data402, unac_data403, unac_data404, unac_data405, unac_data406, unac_data407, unac_data408, unac_data409, unac_data410, unac_data411, unac_data412, unac_data413, unac_data414, unac_data415, unac_data416, unac_data417 }; /* Generated by builder. Do not modify. End tables */ /* * Debug level. See unac.h for a detailed discussion of the * values. */ static int debug_level = UNAC_DEBUG_LOW; #ifdef UNAC_DEBUG_AVAILABLE /* * Default debug function, printing on stderr. */ static void debug_doprint_default(const char* message, void* data) { fprintf(stderr, "%s", message); } /* * Default doprint handler is debug_doprint. */ static unac_debug_print_t debug_doprint = debug_doprint_default; /* * Default app data is null. */ static void* debug_appdata = (void*)0; /* * Generate a debug message (arguments ala printf) and * send it to the doprint handler. */ #define DEBUG debug_print("%s:%d: ", __FILE__, __LINE__), debug_print #define DEBUG_APPEND debug_print static void debug_print(const char* message, ...) { #define UNAC_MAXIMUM_MESSAGE_SIZE 512 /* * UNAC_MAXIMUM_MESSAGE_SIZE is supposedly enough but I * do trust some vsnprintf implementations to be bugous. */ char unac_message_buffer[UNAC_MAXIMUM_MESSAGE_SIZE+1] = { '\0' }; va_list args; va_start(args, message); if(vsnprintf(unac_message_buffer, UNAC_MAXIMUM_MESSAGE_SIZE, message, args) < 0) { char tmp[UNAC_MAXIMUM_MESSAGE_SIZE]; sprintf(tmp, "[message larger than %d, truncated]", UNAC_MAXIMUM_MESSAGE_SIZE); debug_doprint(tmp, debug_appdata); } va_end(args); unac_message_buffer[UNAC_MAXIMUM_MESSAGE_SIZE] = '\0'; debug_doprint(unac_message_buffer, debug_appdata); } void unac_debug_callback(int level, unac_debug_print_t function, void* data) { debug_level = level; if(function) debug_doprint = function; debug_appdata = data; } #else /* UNAC_DEBUG_AVAILABLE */ #define DEBUG #define DEBUG_APPEND #endif /* UNAC_DEBUG_AVAILABLE */ int unacmaybefold_string_utf16(const char* in, size_t in_length, char** outp, size_t* out_lengthp, int dofold) { char* out; int out_size; int out_length; unsigned int i; out_size = in_length > 0 ? in_length : 1024; out = *outp; out = (char*)realloc(out, out_size + 1); if(out == 0) { if(debug_level >= UNAC_DEBUG_LOW) DEBUG("realloc %d bytes failed\n", out_size+1); /* *outp is still valid. Let the caller free it */ return -1; } out_length = 0; for(i = 0; i < in_length; i += 2) { unsigned short c; unsigned short* p; int l; int k; c = (in[i] << 8) | (in[i + 1] & 0xff); /* * Lookup the tables for decomposition information */ #ifdef RECOLL_DATADIR size_t idx; if (except_chars.size() != 0 && (idx=is_except_char(c)) != (size_t)-1) { p = (unsigned short *)(except_trans[idx].c_str() + 2); l = (except_trans[idx].size() - 2) / 2; /* unsigned char *cp = (unsigned char *)p; fprintf(stderr, "l %d cp[0] %x cp[1] %x\n", l, (unsigned int)cp[0], (unsigned int)cp[1]);*/ } else { #endif /* RECOLL_DATADIR */ if (dofold) { unacfold_char_utf16(c, p, l); } else { unac_char_utf16(c, p, l); } #ifdef RECOLL_DATADIR } #endif /* RECOLL_DATADIR */ /* * Explain what's done in great detail */ if(debug_level == UNAC_DEBUG_HIGH) { unsigned short index = unac_indexes[(c) >> UNAC_BLOCK_SHIFT]; unsigned char position = (c) & UNAC_BLOCK_MASK; DEBUG("unac_data%d[%d] & unac_positions[%d][%d]: ", index, unac_positions[index][position], index, position+1); DEBUG_APPEND("0x%04x => ", (c)); if(l == 0) { DEBUG_APPEND("untouched\n"); } else { int i; for(i = 0; i < l; i++) DEBUG_APPEND("0x%04x ", p[i]); DEBUG_APPEND("\n"); } } /* * Make sure there is enough space to hold the decomposition * Note: a previous realloc may have succeeded, which means that *outp * is not valid any more. We have to do the freeing and zero out *outp */ if(out_length + ((l + 1) * 2) > out_size) { char *saved; out_size += ((l + 1) * 2) + 1024; saved = out; out = (char *)realloc(out, out_size); if(out == 0) { if(debug_level >= UNAC_DEBUG_LOW) DEBUG("realloc %d bytes failed\n", out_size); free(saved); *outp = 0; return -1; } } if(l > 0) { /* l == 1 && *p == 0 is the special case generated for mark characters (which may be found if the input is already in decomposed form. Output nothing */ if (l != 1 || *p != 0) { /* * If there is a decomposition, insert it in the output * string. */ for(k = 0; k < l; k++) { out[out_length++] = (p[k] >> 8) & 0xff; out[out_length++] = (p[k] & 0xff); } } } else { /* * If there is no decomposition leave it unchanged */ out[out_length++] = in[i]; out[out_length++] = in[i + 1]; } } *outp = out; *out_lengthp = out_length; (*outp)[*out_lengthp] = '\0'; return 0; } int unac_string_utf16(const char* in, size_t in_length, char** outp, size_t* out_lengthp) { return unacmaybefold_string_utf16(in, in_length, outp, out_lengthp, 0); } int unacfold_string_utf16(const char* in, size_t in_length, char** outp, size_t* out_lengthp) { return unacmaybefold_string_utf16(in, in_length, outp, out_lengthp, 1); } static int convert(const char* from, const char* to, const char* in, size_t in_length, char** outp, size_t* out_lengthp); static const char *utf16be = "UTF-16BE"; static iconv_t u8tou16_cd = (iconv_t)-1; static iconv_t u16tou8_cd = (iconv_t)-1; static pthread_mutex_t o_unac_mutex; static int unac_mutex_is_init; // Call this or take your chances with the auto init. void unac_init_mt() { pthread_mutex_init(&o_unac_mutex, 0); unac_mutex_is_init = 1; } /* * Convert buffer containing string encoded in charset into * a string in charset and return it in buffer . The * points to a malloced string large enough to hold the conversion result. * It is the responsibility of the caller to free this array. * The out string is always null terminated. */ static int convert(const char* from, const char* to, const char* in, size_t in_length, char** outp, size_t* out_lengthp) { int ret = -1; iconv_t cd; char* out; size_t out_remain; size_t out_size; char* out_base; int from_utf16, from_utf8, to_utf16, to_utf8, u8tou16, u16tou8; const char space[] = { 0x00, 0x20 }; /* Note: better call explicit unac_init_mt() before starting threads than rely on this. */ if (unac_mutex_is_init == 0) { pthread_mutex_init(&o_unac_mutex, 0); unac_mutex_is_init = 1; } pthread_mutex_lock(&o_unac_mutex); if (!strcmp(utf16be, from)) { from_utf8 = 0; from_utf16 = 1; } else if (!strcasecmp("UTF-8", from)) { from_utf8 = 1; from_utf16 = 0; } else { from_utf8 = from_utf16 = 0; } if (!strcmp(utf16be, to)) { to_utf8 = 0; to_utf16 = 1; } else if (!strcasecmp("UTF-8", to)) { to_utf8 = 1; to_utf16 = 0; } else { to_utf8 = to_utf16 = 0; } u16tou8 = from_utf16 && to_utf8; u8tou16 = from_utf8 && to_utf16; out_size = in_length > 0 ? in_length : 1024; out = *outp; out = (char *)realloc(out, out_size + 1); if(out == 0) { /* *outp still valid, no freeing */ if(debug_level >= UNAC_DEBUG_LOW) DEBUG("realloc %d bytes failed\n", out_size+1); goto out; } out_remain = out_size; out_base = out; if (u8tou16) { if (u8tou16_cd == (iconv_t)-1) { if((u8tou16_cd = iconv_open(to, from)) == (iconv_t)-1) { goto out; } } else { iconv(u8tou16_cd, 0, 0, 0, 0); } cd = u8tou16_cd; } else if (u16tou8) { if (u16tou8_cd == (iconv_t)-1) { if((u16tou8_cd = iconv_open(to, from)) == (iconv_t)-1) { goto out; } } else { iconv(u16tou8_cd, 0, 0, 0, 0); } cd = u16tou8_cd; } else { if((cd = iconv_open(to, from)) == (iconv_t)-1) { goto out; } } do { if(iconv(cd, (ICONV_CONST char **) &in, &in_length, &out, &out_remain) == (size_t)-1) { switch(errno) { case EILSEQ: /* * If an illegal sequence is found in the context of unac_string * it means the unaccented version of a character contains * a sequence that cannot be mapped back to the original charset. * For instance, the 1/4 character in ISO-8859-1 is decomposed * in three characters including the FRACTION SLASH (2044) which * have no equivalent in the ISO-8859-1 map. One can argue that * the conversions tables should map it to the regular / character * or that a entry should be associated with it. * * To cope with this situation, convert silently transform all * illegal sequences (EILSEQ) into a SPACE character 0x0020. * * In the general conversion case this behaviour is not desirable. * However, it is not the responsibility of this program to cope * with inconsistencies of the Unicode description and a bug report * should be submited to Unicode so that they can fix the problem. * */ if(from_utf16) { const char* tmp = space; size_t tmp_length = 2; if(iconv(cd, (ICONV_CONST char **) &tmp, &tmp_length, &out, &out_remain) == (size_t)-1) { if(errno == E2BIG) /* fall thru to the E2BIG case below */; else goto out; } else { /* The offending character was replaced by a SPACE, skip it. */ in += 2; in_length -= 2; /* And continue conversion. */ break; } } else { goto out; } case E2BIG: { /* * The output does not fit in the current out buffer, enlarge it. */ int length = out - out_base; out_size *= 2; { char *saved = out_base; /* +1 for null */ out_base = (char *)realloc(out_base, out_size + 1); if (out_base == 0) { /* *outp potentially not valid any more. Free here, * and zero out */ if(debug_level >= UNAC_DEBUG_LOW) DEBUG("realloc %d bytes failed\n", out_size+1); free(saved); *outp = 0; goto out; } } out = out_base + length; out_remain = out_size - length; } break; default: goto out; break; } } } while(in_length > 0); if (!u8tou16 && !u16tou8) iconv_close(cd); *outp = out_base; *out_lengthp = out - out_base; (*outp)[*out_lengthp] = '\0'; ret = 0; out: pthread_mutex_unlock(&o_unac_mutex); return ret; } int unacmaybefold_string(const char* charset, const char* in, size_t in_length, char** outp, size_t* out_lengthp, int dofold) { /* * When converting an empty string, skip everything but alloc the * buffer if NULL pointer. */ if (in_length <= 0) { if(!*outp) { if ((*outp = (char*)malloc(32)) == 0) return -1; } (*outp)[0] = '\0'; *out_lengthp = 0; } else { char* utf16 = 0; size_t utf16_length = 0; char* utf16_unaccented = 0; size_t utf16_unaccented_length = 0; if(convert(charset, utf16be, in, in_length, &utf16, &utf16_length) < 0) { return -1; } unacmaybefold_string_utf16(utf16, utf16_length, &utf16_unaccented, &utf16_unaccented_length, dofold); free(utf16); if(convert(utf16be, charset, utf16_unaccented, utf16_unaccented_length, outp, out_lengthp) < 0) { return -1; } free(utf16_unaccented); } return 0; } int unac_string(const char* charset, const char* in, size_t in_length, char** outp, size_t* out_lengthp) { return unacmaybefold_string(charset, in, in_length, outp, out_lengthp, 0); } int unacfold_string(const char* charset, const char* in, size_t in_length, char** outp, size_t* out_lengthp) { return unacmaybefold_string(charset, in, in_length, outp, out_lengthp, 1); } const char* unac_version(void) { return UNAC_VERSION; } #ifdef RECOLL_DATADIR void unac_set_except_translations(const char *spectrans) { except_chars.clear(); except_trans.clear(); if (!spectrans || !spectrans[0]) return; // The translation tables out of Unicode are in machine byte order (we // just let the compiler read the values). // For the translation part, we need to choose our encoding in accordance ) // (16BE or 16LE depending on processor) // On the contrary, the source char is always to be compared to // the input text, which is encoded in UTF-16BE ... What a mess. static const char *machinecoding = 0; bool littleendian = true; if (machinecoding == 0) { const char* charshort = "\001\002"; short *ip = (short *)charshort; if (*ip == 0x0102) { littleendian = false; machinecoding = "UTF-16BE"; } else { littleendian = true; machinecoding = "UTF-16LE"; } } vector vtrans; stringToStrings(spectrans, vtrans); for (vector::iterator it = vtrans.begin(); it != vtrans.end(); it++) { /* Convert the whole thing to utf-16be/le according to endianness */ char *out = 0; size_t outsize; if (convert("UTF-8", machinecoding, it->c_str(), it->size(), &out, &outsize) != 0 || outsize < 2) continue; /* The source char must be utf-16be as this is what we convert the input text to for internal processing */ unsigned short ch; if (littleendian) ch = (out[1] << 8) | (out[0] & 0xff); else ch = (out[0] << 8) | (out[1] & 0xff); /* fprintf(stderr, "outsize %d Ch is 0x%hx\n", int(outsize), ch);*/ except_chars.push_back(ch); // We keep ch as the first 2 bytes in the translation so that // both vectors sort identically except_trans.push_back(string((const char *)out, outsize)); free(out); } std::sort(except_chars.begin(), except_chars.end()); std::sort(except_trans.begin(), except_trans.end()); } #endif /* RECOLL_DATADIR */ recoll-1.17.3/unac/unac.h000644 001750 000000 00000054516 11740755063 015534 0ustar00dockeswheel000000 000000 /* * Copyright (C) 2000, 2001, 2002 Loic Dachary * * 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. */ /* * Provides functions to strip accents from a string in all the * charset supported by iconv(3). * * See the unac(3) manual page for more information. * */ #ifndef _unac_h #define _unac_h #ifdef __cplusplus extern "C" { #endif /* Generated by builder. Do not modify. Start defines */ #define UNAC_BLOCK_SHIFT 4 #define UNAC_BLOCK_MASK ((1 << UNAC_BLOCK_SHIFT) - 1) #define UNAC_BLOCK_SIZE (1 << UNAC_BLOCK_SHIFT) #define UNAC_BLOCK_COUNT 418 #define UNAC_INDEXES_SIZE (0x10000 >> UNAC_BLOCK_SHIFT) /* Generated by builder. Do not modify. End defines */ /* * Return the unaccented equivalent of the UTF-16 character * in the pointer

. The length of the unsigned short array pointed * by

is returned in the argument. * The C++ prototype of this macro would be: * * void unac_char(const unsigned short c, unsigned short*& p, int& l) * * See unac(3) in IMPLEMENTATION NOTES for more information about the * tables (unac_data_table, unac_positions) layout. */ #define unac_char_utf16(c,p,l) \ { \ unsigned short index = unac_indexes[(c) >> UNAC_BLOCK_SHIFT]; \ unsigned char position = 2*((c) & UNAC_BLOCK_MASK); \ (p) = &(unac_data_table[index][unac_positions[index][position]]); \ (l) = unac_positions[index][position + 1] - unac_positions[index][position]; \ if((l) == 1 && *(p) == 0xFFFF) { \ (p) = 0; \ (l) = 0; \ } \ } /* * Save as unac_ but case-folded */ #define unacfold_char_utf16(c,p,l) \ { \ unsigned short index = unac_indexes[(c) >> UNAC_BLOCK_SHIFT]; \ unsigned char position = 2*((c) & UNAC_BLOCK_MASK)+1; \ (p) = &(unac_data_table[index][unac_positions[index][position]]); \ (l) = unac_positions[index][position + 1] - unac_positions[index][position]; \ if((l) == 1 && *(p) == 0xFFFF) { \ (p) = 0; \ (l) = 0; \ } \ } /* * Return the unaccented equivalent of the UTF-16 string of * length in the pointer . The length of the UTF-16 * string returned in is stored in . If the pointer * *out is null, a new string is allocated using malloc(3). If the * pointer *out is not null, the available length must also be given * in the *out_length argument. The pointer passed to *out must have * been allocated by malloc(3) and may be reallocated by realloc(3) if * needs be. It is the responsibility of the caller to free the * pointer returned in *out. The return value is 0 on success and -1 * on error, in which case the errno variable is set to the * corresponding error code. */ int unac_string_utf16(const char* in, size_t in_length, char** out, size_t* out_length); int unacfold_string_utf16(const char* in, size_t in_length, char** out, size_t* out_length); /* * The semantic of this function is stricly equal to the function * unac_string_utf16. The argument applies to the content of the * input string. It is converted to UTF-16 using iconv(3) before calling * the unac_string function and the result is converted from UTF-16 to * the specified before returning it in the pointer. * For efficiency purpose it is recommended that the caller uses * unac_string and iconv(3) to save buffer allocations overhead. * The return value is 0 on success and -1 on error, in which case * the errno variable is set to the corresponding error code. */ int unac_string(const char* charset, const char* in, size_t in_length, char** out, size_t* out_length); int unacfold_string(const char* charset, const char* in, size_t in_length, char** out, size_t* out_length); /* To be called before starting threads in mt programs */ void unac_init_mt(); #ifdef RECOLL_DATADIR #include /** * Set exceptions for unaccenting, for characters which should not be * handled according to what the Unicode tables say. For example "a * with circle above" should not be stripped to a in swedish, etc. * * @param spectrans defines the translations as a blank separated list of * UTF-8 strings. Inside each string, the first character is the exception * the rest is the translation (which may be empty). You can use double * quotes for translations which should include white space. The double-quote * can't be an exception character, deal with it... */ void unac_set_except_translations(const char *spectrans); #endif /* RECOLL_DATADIR */ /* * Return unac version number. */ const char* unac_version(void); #define UNAC_DEBUG_NONE 0x00 #define UNAC_DEBUG_LOW 0x01 #define UNAC_DEBUG_HIGH 0x02 #ifdef HAVE_VSNPRINTF #define UNAC_DEBUG_AVAILABLE 1 /* * Set the unac debug level. is one of: * UNAC_DEBUG_NONE for no debug messages at all * UNAC_DEBUG_LOW for minimal information * UNAC_DEBUG_HIGH for extremely verbose information, * only usable when translating a few short strings. * * unac_debug with anything but UNAC_DEBUG_NONE is not * thread safe. */ #define unac_debug(l) unac_debug_callback((l), 0, (void*)0); /* * Set the debug level and define a printing function callback. * The debug level is the same as in unac_debug. The * is in charge of dealing with the debug messages, * presumably to print them to the user. The is an opaque * pointer that is passed along to , should it * need to manage a persistent context. * * The prototype of allows two arguments. The first * is the debug message (const char*), the second is the opaque * pointer given as argument to unac_debug_callback. * * If is NULL, messages are printed on the standard * error output using fprintf(stderr...). * * unac_debug_callback with anything but UNAC_DEBUG_NONE is not * thread safe. * */ typedef void (*unac_debug_print_t)(const char* message, void* data); void unac_debug_callback(int level, unac_debug_print_t function, void* data); #endif /* HAVE_VSNPRINTF */ /* Generated by builder. Do not modify. Start declarations */ extern unsigned short unac_indexes[UNAC_INDEXES_SIZE]; extern unsigned char unac_positions[UNAC_BLOCK_COUNT][2*UNAC_BLOCK_SIZE + 1]; extern unsigned short* unac_data_table[UNAC_BLOCK_COUNT]; extern unsigned short unac_data0[]; extern unsigned short unac_data1[]; extern unsigned short unac_data2[]; extern unsigned short unac_data3[]; extern unsigned short unac_data4[]; extern unsigned short unac_data5[]; extern unsigned short unac_data6[]; extern unsigned short unac_data7[]; extern unsigned short unac_data8[]; extern unsigned short unac_data9[]; extern unsigned short unac_data10[]; extern unsigned short unac_data11[]; extern unsigned short unac_data12[]; extern unsigned short unac_data13[]; extern unsigned short unac_data14[]; extern unsigned short unac_data15[]; extern unsigned short unac_data16[]; extern unsigned short unac_data17[]; extern unsigned short unac_data18[]; extern unsigned short unac_data19[]; extern unsigned short unac_data20[]; extern unsigned short unac_data21[]; extern unsigned short unac_data22[]; extern unsigned short unac_data23[]; extern unsigned short unac_data24[]; extern unsigned short unac_data25[]; extern unsigned short unac_data26[]; extern unsigned short unac_data27[]; extern unsigned short unac_data28[]; extern unsigned short unac_data29[]; extern unsigned short unac_data30[]; extern unsigned short unac_data31[]; extern unsigned short unac_data32[]; extern unsigned short unac_data33[]; extern unsigned short unac_data34[]; extern unsigned short unac_data35[]; extern unsigned short unac_data36[]; extern unsigned short unac_data37[]; extern unsigned short unac_data38[]; extern unsigned short unac_data39[]; extern unsigned short unac_data40[]; extern unsigned short unac_data41[]; extern unsigned short unac_data42[]; extern unsigned short unac_data43[]; extern unsigned short unac_data44[]; extern unsigned short unac_data45[]; extern unsigned short unac_data46[]; extern unsigned short unac_data47[]; extern unsigned short unac_data48[]; extern unsigned short unac_data49[]; extern unsigned short unac_data50[]; extern unsigned short unac_data51[]; extern unsigned short unac_data52[]; extern unsigned short unac_data53[]; extern unsigned short unac_data54[]; extern unsigned short unac_data55[]; extern unsigned short unac_data56[]; extern unsigned short unac_data57[]; extern unsigned short unac_data58[]; extern unsigned short unac_data59[]; extern unsigned short unac_data60[]; extern unsigned short unac_data61[]; extern unsigned short unac_data62[]; extern unsigned short unac_data63[]; extern unsigned short unac_data64[]; extern unsigned short unac_data65[]; extern unsigned short unac_data66[]; extern unsigned short unac_data67[]; extern unsigned short unac_data68[]; extern unsigned short unac_data69[]; extern unsigned short unac_data70[]; extern unsigned short unac_data71[]; extern unsigned short unac_data72[]; extern unsigned short unac_data73[]; extern unsigned short unac_data74[]; extern unsigned short unac_data75[]; extern unsigned short unac_data76[]; extern unsigned short unac_data77[]; extern unsigned short unac_data78[]; extern unsigned short unac_data79[]; extern unsigned short unac_data80[]; extern unsigned short unac_data81[]; extern unsigned short unac_data82[]; extern unsigned short unac_data83[]; extern unsigned short unac_data84[]; extern unsigned short unac_data85[]; extern unsigned short unac_data86[]; extern unsigned short unac_data87[]; extern unsigned short unac_data88[]; extern unsigned short unac_data89[]; extern unsigned short unac_data90[]; extern unsigned short unac_data91[]; extern unsigned short unac_data92[]; extern unsigned short unac_data93[]; extern unsigned short unac_data94[]; extern unsigned short unac_data95[]; extern unsigned short unac_data96[]; extern unsigned short unac_data97[]; extern unsigned short unac_data98[]; extern unsigned short unac_data99[]; extern unsigned short unac_data100[]; extern unsigned short unac_data101[]; extern unsigned short unac_data102[]; extern unsigned short unac_data103[]; extern unsigned short unac_data104[]; extern unsigned short unac_data105[]; extern unsigned short unac_data106[]; extern unsigned short unac_data107[]; extern unsigned short unac_data108[]; extern unsigned short unac_data109[]; extern unsigned short unac_data110[]; extern unsigned short unac_data111[]; extern unsigned short unac_data112[]; extern unsigned short unac_data113[]; extern unsigned short unac_data114[]; extern unsigned short unac_data115[]; extern unsigned short unac_data116[]; extern unsigned short unac_data117[]; extern unsigned short unac_data118[]; extern unsigned short unac_data119[]; extern unsigned short unac_data120[]; extern unsigned short unac_data121[]; extern unsigned short unac_data122[]; extern unsigned short unac_data123[]; extern unsigned short unac_data124[]; extern unsigned short unac_data125[]; extern unsigned short unac_data126[]; extern unsigned short unac_data127[]; extern unsigned short unac_data128[]; extern unsigned short unac_data129[]; extern unsigned short unac_data130[]; extern unsigned short unac_data131[]; extern unsigned short unac_data132[]; extern unsigned short unac_data133[]; extern unsigned short unac_data134[]; extern unsigned short unac_data135[]; extern unsigned short unac_data136[]; extern unsigned short unac_data137[]; extern unsigned short unac_data138[]; extern unsigned short unac_data139[]; extern unsigned short unac_data140[]; extern unsigned short unac_data141[]; extern unsigned short unac_data142[]; extern unsigned short unac_data143[]; extern unsigned short unac_data144[]; extern unsigned short unac_data145[]; extern unsigned short unac_data146[]; extern unsigned short unac_data147[]; extern unsigned short unac_data148[]; extern unsigned short unac_data149[]; extern unsigned short unac_data150[]; extern unsigned short unac_data151[]; extern unsigned short unac_data152[]; extern unsigned short unac_data153[]; extern unsigned short unac_data154[]; extern unsigned short unac_data155[]; extern unsigned short unac_data156[]; extern unsigned short unac_data157[]; extern unsigned short unac_data158[]; extern unsigned short unac_data159[]; extern unsigned short unac_data160[]; extern unsigned short unac_data161[]; extern unsigned short unac_data162[]; extern unsigned short unac_data163[]; extern unsigned short unac_data164[]; extern unsigned short unac_data165[]; extern unsigned short unac_data166[]; extern unsigned short unac_data167[]; extern unsigned short unac_data168[]; extern unsigned short unac_data169[]; extern unsigned short unac_data170[]; extern unsigned short unac_data171[]; extern unsigned short unac_data172[]; extern unsigned short unac_data173[]; extern unsigned short unac_data174[]; extern unsigned short unac_data175[]; extern unsigned short unac_data176[]; extern unsigned short unac_data177[]; extern unsigned short unac_data178[]; extern unsigned short unac_data179[]; extern unsigned short unac_data180[]; extern unsigned short unac_data181[]; extern unsigned short unac_data182[]; extern unsigned short unac_data183[]; extern unsigned short unac_data184[]; extern unsigned short unac_data185[]; extern unsigned short unac_data186[]; extern unsigned short unac_data187[]; extern unsigned short unac_data188[]; extern unsigned short unac_data189[]; extern unsigned short unac_data190[]; extern unsigned short unac_data191[]; extern unsigned short unac_data192[]; extern unsigned short unac_data193[]; extern unsigned short unac_data194[]; extern unsigned short unac_data195[]; extern unsigned short unac_data196[]; extern unsigned short unac_data197[]; extern unsigned short unac_data198[]; extern unsigned short unac_data199[]; extern unsigned short unac_data200[]; extern unsigned short unac_data201[]; extern unsigned short unac_data202[]; extern unsigned short unac_data203[]; extern unsigned short unac_data204[]; extern unsigned short unac_data205[]; extern unsigned short unac_data206[]; extern unsigned short unac_data207[]; extern unsigned short unac_data208[]; extern unsigned short unac_data209[]; extern unsigned short unac_data210[]; extern unsigned short unac_data211[]; extern unsigned short unac_data212[]; extern unsigned short unac_data213[]; extern unsigned short unac_data214[]; extern unsigned short unac_data215[]; extern unsigned short unac_data216[]; extern unsigned short unac_data217[]; extern unsigned short unac_data218[]; extern unsigned short unac_data219[]; extern unsigned short unac_data220[]; extern unsigned short unac_data221[]; extern unsigned short unac_data222[]; extern unsigned short unac_data223[]; extern unsigned short unac_data224[]; extern unsigned short unac_data225[]; extern unsigned short unac_data226[]; extern unsigned short unac_data227[]; extern unsigned short unac_data228[]; extern unsigned short unac_data229[]; extern unsigned short unac_data230[]; extern unsigned short unac_data231[]; extern unsigned short unac_data232[]; extern unsigned short unac_data233[]; extern unsigned short unac_data234[]; extern unsigned short unac_data235[]; extern unsigned short unac_data236[]; extern unsigned short unac_data237[]; extern unsigned short unac_data238[]; extern unsigned short unac_data239[]; extern unsigned short unac_data240[]; extern unsigned short unac_data241[]; extern unsigned short unac_data242[]; extern unsigned short unac_data243[]; extern unsigned short unac_data244[]; extern unsigned short unac_data245[]; extern unsigned short unac_data246[]; extern unsigned short unac_data247[]; extern unsigned short unac_data248[]; extern unsigned short unac_data249[]; extern unsigned short unac_data250[]; extern unsigned short unac_data251[]; extern unsigned short unac_data252[]; extern unsigned short unac_data253[]; extern unsigned short unac_data254[]; extern unsigned short unac_data255[]; extern unsigned short unac_data256[]; extern unsigned short unac_data257[]; extern unsigned short unac_data258[]; extern unsigned short unac_data259[]; extern unsigned short unac_data260[]; extern unsigned short unac_data261[]; extern unsigned short unac_data262[]; extern unsigned short unac_data263[]; extern unsigned short unac_data264[]; extern unsigned short unac_data265[]; extern unsigned short unac_data266[]; extern unsigned short unac_data267[]; extern unsigned short unac_data268[]; extern unsigned short unac_data269[]; extern unsigned short unac_data270[]; extern unsigned short unac_data271[]; extern unsigned short unac_data272[]; extern unsigned short unac_data273[]; extern unsigned short unac_data274[]; extern unsigned short unac_data275[]; extern unsigned short unac_data276[]; extern unsigned short unac_data277[]; extern unsigned short unac_data278[]; extern unsigned short unac_data279[]; extern unsigned short unac_data280[]; extern unsigned short unac_data281[]; extern unsigned short unac_data282[]; extern unsigned short unac_data283[]; extern unsigned short unac_data284[]; extern unsigned short unac_data285[]; extern unsigned short unac_data286[]; extern unsigned short unac_data287[]; extern unsigned short unac_data288[]; extern unsigned short unac_data289[]; extern unsigned short unac_data290[]; extern unsigned short unac_data291[]; extern unsigned short unac_data292[]; extern unsigned short unac_data293[]; extern unsigned short unac_data294[]; extern unsigned short unac_data295[]; extern unsigned short unac_data296[]; extern unsigned short unac_data297[]; extern unsigned short unac_data298[]; extern unsigned short unac_data299[]; extern unsigned short unac_data300[]; extern unsigned short unac_data301[]; extern unsigned short unac_data302[]; extern unsigned short unac_data303[]; extern unsigned short unac_data304[]; extern unsigned short unac_data305[]; extern unsigned short unac_data306[]; extern unsigned short unac_data307[]; extern unsigned short unac_data308[]; extern unsigned short unac_data309[]; extern unsigned short unac_data310[]; extern unsigned short unac_data311[]; extern unsigned short unac_data312[]; extern unsigned short unac_data313[]; extern unsigned short unac_data314[]; extern unsigned short unac_data315[]; extern unsigned short unac_data316[]; extern unsigned short unac_data317[]; extern unsigned short unac_data318[]; extern unsigned short unac_data319[]; extern unsigned short unac_data320[]; extern unsigned short unac_data321[]; extern unsigned short unac_data322[]; extern unsigned short unac_data323[]; extern unsigned short unac_data324[]; extern unsigned short unac_data325[]; extern unsigned short unac_data326[]; extern unsigned short unac_data327[]; extern unsigned short unac_data328[]; extern unsigned short unac_data329[]; extern unsigned short unac_data330[]; extern unsigned short unac_data331[]; extern unsigned short unac_data332[]; extern unsigned short unac_data333[]; extern unsigned short unac_data334[]; extern unsigned short unac_data335[]; extern unsigned short unac_data336[]; extern unsigned short unac_data337[]; extern unsigned short unac_data338[]; extern unsigned short unac_data339[]; extern unsigned short unac_data340[]; extern unsigned short unac_data341[]; extern unsigned short unac_data342[]; extern unsigned short unac_data343[]; extern unsigned short unac_data344[]; extern unsigned short unac_data345[]; extern unsigned short unac_data346[]; extern unsigned short unac_data347[]; extern unsigned short unac_data348[]; extern unsigned short unac_data349[]; extern unsigned short unac_data350[]; extern unsigned short unac_data351[]; extern unsigned short unac_data352[]; extern unsigned short unac_data353[]; extern unsigned short unac_data354[]; extern unsigned short unac_data355[]; extern unsigned short unac_data356[]; extern unsigned short unac_data357[]; extern unsigned short unac_data358[]; extern unsigned short unac_data359[]; extern unsigned short unac_data360[]; extern unsigned short unac_data361[]; extern unsigned short unac_data362[]; extern unsigned short unac_data363[]; extern unsigned short unac_data364[]; extern unsigned short unac_data365[]; extern unsigned short unac_data366[]; extern unsigned short unac_data367[]; extern unsigned short unac_data368[]; extern unsigned short unac_data369[]; extern unsigned short unac_data370[]; extern unsigned short unac_data371[]; extern unsigned short unac_data372[]; extern unsigned short unac_data373[]; extern unsigned short unac_data374[]; extern unsigned short unac_data375[]; extern unsigned short unac_data376[]; extern unsigned short unac_data377[]; extern unsigned short unac_data378[]; extern unsigned short unac_data379[]; extern unsigned short unac_data380[]; extern unsigned short unac_data381[]; extern unsigned short unac_data382[]; extern unsigned short unac_data383[]; extern unsigned short unac_data384[]; extern unsigned short unac_data385[]; extern unsigned short unac_data386[]; extern unsigned short unac_data387[]; extern unsigned short unac_data388[]; extern unsigned short unac_data389[]; extern unsigned short unac_data390[]; extern unsigned short unac_data391[]; extern unsigned short unac_data392[]; extern unsigned short unac_data393[]; extern unsigned short unac_data394[]; extern unsigned short unac_data395[]; extern unsigned short unac_data396[]; extern unsigned short unac_data397[]; extern unsigned short unac_data398[]; extern unsigned short unac_data399[]; extern unsigned short unac_data400[]; extern unsigned short unac_data401[]; extern unsigned short unac_data402[]; extern unsigned short unac_data403[]; extern unsigned short unac_data404[]; extern unsigned short unac_data405[]; extern unsigned short unac_data406[]; extern unsigned short unac_data407[]; extern unsigned short unac_data408[]; extern unsigned short unac_data409[]; extern unsigned short unac_data410[]; extern unsigned short unac_data411[]; extern unsigned short unac_data412[]; extern unsigned short unac_data413[]; extern unsigned short unac_data414[]; extern unsigned short unac_data415[]; extern unsigned short unac_data416[]; extern unsigned short unac_data417[]; /* Generated by builder. Do not modify. End declarations */ #ifdef __cplusplus } #endif #endif /* _unac_h */ recoll-1.17.3/unac/unac_version.h000644 001750 000000 00000000035 11740755063 017264 0ustar00dockeswheel000000 000000 #define UNAC_VERSION "1.0.7" recoll-1.17.3/sampleconf/fields000644 001750 000000 00000011331 11740755063 017013 0ustar00dockeswheel000000 000000 # (C) 2007-2011 J.F.Dockes # License: GPL V2 # # Field names configuration. This defines how one may search ie for: # author:Hemingway # # Important: # - the field names MUST be all lowercase alphabetic ascii here. They can # be anycased in the documents. ##################################################### # This section defines what prefix the terms inside named fields will be # indexed with (in addition to prefix-less indexing for general search) # ALL prefixes MUST be all UPPERCASE. Extension prefixes begin with X # # The choice of field names is rather arbitrary. Use of any of the aliases # defined in the following section will yield exactly the same results, # (both for indexing and search). # # Fields can have two relevance boost factors defined, such as in: # caption = S ; wdfinc=10 # and/or # caption = S ; boost = 10 # The first line would boost the xapian "within document frequency" of # caption terms by a factor of 10 at indexing time. The second one # (NOT CURRENTLY IMPLEMENTED) would automatically boost the weight of a # caption-based field query (ie: caption:mytitle or title:mytitle) at query # time. [prefixes] # Native fields matching omega uses, which we index without an X first # letter. Don't change these. Caption is used for 'title' to keep a last # remnant of omega compatibility inside the data record. # Also reserved/hardcoded: D(ate), M(onth), Y(ear), # F(parentid), Q(uniqueid), T(mime type) caption = S ; wdfinc = 10 author = A keywords = K # Extension examples. These are actually used by default by Recoll, you can # add your own to search for fields produced by the filters and not handled # by default. # Some values are internally reserved by recoll: # XP (for path elements), XXST, XXND # Using XX was not a good idea. # I hereby commit to not using XY for Recoll: # *** USE XY for beginning your local prefixes *** ext = XE filename = XSFN recipient = XTO ############################ # Some fields are stored in the document data record inside the index and # can be returned in result lists. There is no necessity that stored fields # should be indexed (have a prefix in the preceding section) (example: # "url", but this one doesn't need to be listed here, it's stored by hard # code) # # Some fields are stored by default, don't add them here, else they will be # stored twice: caption, keywords, abstract, mimetype, url # Only canonical names should be used here, not aliases. # "author" used to be stored by default, now set here as optional # "rclaptg" is used for viewer specialization (depending on local config) # "rclbes" defines the backend type (ie normal fs, firefox cache). Should # probably be hardcoded, don't remove it [stored] author= rclaptg= rclbes= filename= ########################## # This section defines field names aliases or synonyms. Any right hand side # value will be turned into the lhs canonic name before further treatment # # The left-hand values in the recoll distribution file are well known and # must match names used in the c++ code, or even the index data # record. They can't change! But you can add others. # # Filters should only add canonic names to the meta array when indexing, # not aliases. [aliases] abstract = summary dc:summary description xesam:description author = creator dc:creator xesam:author xesam:creator from caption = title dc:title subject # catg = dc:type contentCategory dbytes = size xesam:size dmtime = date dc:date dc:datemodified datemodified contentmodified \ xesam:contentmodified ext = fileextension xesam:fileextension # Don't add subject to keywords aliases, it's better to keep it for email keywords = keyword xesam:keyword tag tags dc:subject xesam:subject \ dc:description mtype = mime mimetype xesam:mimetype contenttype xesam:contenttype dc:format recipient = to xesam:recipient url = dc:identifier xesam:url ######################### # This section defines a hierarchy for field names. Searching for a lhs # ancestor will be expanded to a search for itself and all rhs descendants # This is not used for now [specialisations] author = from ###################### # Section to define translations from extended file attribute names to # field names. xattr use must be enabled at compile time for this to be # used. Enter translations as "xattrname = fieldname". Case matters. [xattrtofields] ######################## # Sections reserved for specific filters follow # ########################## # Mail filter section. You can specify mail headers to be indexed # in addition to the standard ones: (To:, Cc:, From:, Subject:, Date, # Message-Id), along with the field name to be used. For this to be useful, # the field name should also be listed in the [prefixes] and possibly the # [stored] sections. # # [mail] # x-my-tag = mymailtag recoll-1.17.3/sampleconf/mimeconf000644 001750 000000 00000027000 11740755063 017342 0ustar00dockeswheel000000 000000 # @(#$Id: mimeconf,v 1.48 2008-11-27 13:35:24 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 "internal" filters are hardwired in the c++ code. # The external "exec" filters are typically scripts. By default, they output the # document in simple html format, have a look at the scripts. # A different format (ie text/plain), and a character set can be defined for # each filter, see the exemples below (ie: msword) [index] # MSWORD: the rcldoc script handles a number of marginal case that raw # antiword won't: # - with wvWare: "text stream of this file is too small to handle" # - with unrtf: rtf files disguising as doc files. # The default is now again to use rcldoc. Use raw antiword if speed is more # important for you than catching all data, application/msword = exec rcldoc #application/msword = exec antiword -t -i 1 -m UTF-8;mimetype=text/plain;charset=utf-8 # You can also use wvware directly but it's much slower. # application/msword = exec wvWare --charset=utf-8 --nographics application/ogg = execm rclaudio application/pdf = exec rclpdf application/postscript = exec pstotext;charset=iso-8859-1;mimetype=text/plain application/vnd.ms-excel = exec xls2csv -c " " -d utf-8;charset=utf-8;mimetype=text/plain application/vnd.ms-powerpoint = exec catppt -d utf-8;charset=utf-8;mimetype=text/plain application/vnd.openxmlformats-officedocument.wordprocessingml.document = \ exec rclopxml application/vnd.openxmlformats-officedocument.wordprocessingml.template = \ exec rclopxml application/vnd.openxmlformats-officedocument.presentationml.template = \ exec rclopxml application/vnd.openxmlformats-officedocument.presentationml.presentation = \ exec rclopxml application/vnd.openxmlformats-officedocument.spreadsheetml.sheet = \ exec rclopxml application/vnd.openxmlformats-officedocument.spreadsheetml.template =\ exec rclopxml 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/vnd.wordperfect = exec wpd2html;mimetype=text/html application/x-abiword = exec rclabw application/x-awk = internal text/plain application/x-chm = execm rclchm application/x-dia-diagram = execm rcldia;mimetype=text/html;charset=utf-8 application/x-dvi = exec rcldvi application/x-flac = execm rclaudio application/x-gnuinfo = execm rclinfo application/x-gnumeric = exec rclgnm application/x-kword = exec rclkwd application/x-lyx = exec rcllyx application/x-mimehtml = internal message/rfc822 application/x-okular-notes = exec rclokulnote application/x-perl = internal text/plain application/x-rar = execm rclrar;charset=default application/x-scribus = exec rclscribus application/x-shellscript = internal text/plain application/x-tex = exec rcltex application/x-webarchive = execm rclwar application/zip = execm rclzip;charset=default audio/mpeg = execm rclaudio audio/x-karaoke = execm rclkar image/gif = execm rclimg image/jpeg = execm rclimg image/png = execm rclimg image/tiff = execm rclimg image/vnd.djvu = exec rcldjvu image/svg+xml = exec rclsvg image/x-xcf = execm rclimg message/rfc822 = internal text/calendar = execm rclics;mimetype=text/plain;charset=utf-8 text/html = internal text/plain = internal text/rtf = exec unrtf --nopict --html;mimetype=text/html text/x-c = internal text/x-c++ = internal text/x-c+ = internal text/x-fictionbook = exec rclfb2 text/x-gaim-log = exec rclgaim text/x-html-sidux-man = exec rclsiduxman text/x-html-aptosid-man = exec rclaptosidman text/x-chm-html = internal text/html text/x-ini = internal text/plain text/x-mail = internal text/x-man = exec rclman text/x-perl = internal text/plain text/x-purple-log = exec rclpurple text/x-purple-html-log = internal text/html text/x-python = exec rclpython text/x-shellscript = internal text/plain text/x-tex = exec rcltex # You're probably better off letting xml be indexed as text/plain (which # will happen because of the default text/xxx handling. Handling it as html # will strip all the parameters, where most of the data often resides #text/xml = internal text/html ## ############################################# # Icons to be used in the result list if required by gui config [icons] application/msword = wordprocessing application/ogg = sownd application/pdf = pdf application/postscript = postscript application/vnd.ms-excel = spreadsheet application/vnd.ms-powerpoint = presentation application/vnd.openxmlformats-officedocument.wordprocessingml.document = \ wordprocessing application/vnd.openxmlformats-officedocument.wordprocessingml.template = \ wordprocessing application/vnd.openxmlformats-officedocument.presentationml.template = \ presentation application/vnd.openxmlformats-officedocument.presentationml.presentation = \ presentation application/vnd.openxmlformats-officedocument.spreadsheetml.sheet = \ spreadsheet application/vnd.openxmlformats-officedocument.spreadsheetml.template =\ spreadsheet 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/vnd.wordperfect = wordprocessing application/x-abiword = wordprocessing application/x-dia-diagram = drawing application/x-dvi = document application/x-flac = sownd application/x-fsdirectory = folder application/x-gnumeric = spreadsheet application/x-kword = wordprocessing application/x-lyx = wordprocessing application/x-okular-notes = document application/x-scribus = document application/x-gnuinfo = document application/x-tex = wordprocessing text/x-tex = wordprocessing application/x-awk = source application/x-perl = source application/x-shellscript = source audio/mpeg = sownd audio/x-karaoke = sownd image/bmp = image image/gif = image image/jpeg = image image/png = image image/tiff = image image/vnd.djvu = document image/svg+xml = drawing image/x-xcf = image image/x-xpmi = image message/rfc822 = message text/html = html text/plain = txt text/x-c = source text/x-c++ = source text/x-c+ = source text/x-fictionbook = document text/x-html-aptosid-man = aptosid-book text/x-html-sidux-man = sidux-book text/x-ini = txt text/x-mail = message text/x-man = document application/x-chm = document text/x-purple-log = pidgin text/x-purple-html-log = pidgin text/x-python = text-x-python [categories] # Categories group mime types by "kind". They can be used from the query # language as an "rclcat" clause. This is fully dynamic, you can change the # names and groups as you wish, only the mime types are stored in the index. # # If you add/remove categories, you may also want to change the # "guifilters" section below. text = \ application/msword \ application/pdf \ application/postscript \ application/vnd.openxmlformats-officedocument.wordprocessingml.document \ application/vnd.openxmlformats-officedocument.wordprocessingml.template \ application/vnd.sun.xml.writer \ application/vnd.sun.xml.writer.global \ application/vnd.sun.xml.writer.template \ application/vnd.wordperfect \ application/x-abiword \ application/x-awk \ application/x-chm \ application/x-dvi \ application/x-kword \ application/x-lyx \ application/x-okular-notes \ application/x-perl \ application/x-scribus \ application/x-gnuinfo \ application/x-shellscript \ application/x-tex \ text/x-tex \ image/vnd.djvu \ text/calendar \ text/html \ text/plain \ text/rtf \ text/x-c \ text/x-c++ \ text/x-c+ \ text/x-fictionbook \ text/x-html-aptosid-man \ text/x-html-sidux-man \ text/x-ini \ text/x-man \ text/x-perl \ text/x-python \ text/x-shellscript spreadsheet = \ application/vnd.ms-excel \ application/vnd.openxmlformats-officedocument.spreadsheetml.sheet \ application/vnd.openxmlformats-officedocument.spreadsheetml.template \ application/vnd.sun.xml.calc \ application/vnd.sun.xml.calc.template \ application/x-gnumeric presentation = application/vnd.ms-powerpoint \ application/vnd.openxmlformats-officedocument.presentationml.template \ application/vnd.openxmlformats-officedocument.presentationml.presentation \ application/vnd.sun.xml.impress \ application/vnd.sun.xml.impress.template media = \ application/ogg \ application/x-flac \ audio/mpeg \ audio/x-karaoke \ image/gif \ image/jpeg \ image/png \ image/svg+xml \ image/tiff \ image/x-xcf \ image/bmp \ image/x-xpmi \ video/mp2p \ video/mp2t \ video/mp4 \ video/x-msvideo \ message = message/rfc822 \ text/x-gaim-log \ text/x-mail \ text/x-purple-log \ text/x-purple-html-log \ other = application/vnd.sun.xml.draw \ application/vnd.sun.xml.draw.template \ application/vnd.sun.xml.math \ application/x-dia-diagram \ application/x-fsdirectory \ application/x-mimehtml \ application/x-rar \ application/x-webarchive \ application/zip \ [guifilters] # This defines the top level filters in the GUI (accessed by the the # radiobuttons above the results area, or a toolbar combobox). # Each entry defines a label and a query language fragment that will be # applied to filter the current query if the option is activated. # # This does not really belong in mimeconf, but it does belong in the index # config (not the GUI one), because it's not necessarily the same in all # configs, it has to go somewhere, and it's not worth a separate config # file... # # By default this filters by document category (see above), but any # language fragment should be ok. Be aware though that the "document # history" queries only know about simple "rclcat" filtering. # # If you don't want the filter names to be displayed in alphabetic order, # you can define them with a colon. The part before the colon is not # displayed but used for ordering, ie: a:zzbutshouldbefirst b:aacomeslast # text = rclcat:text spreadsheet = rclcat:spreadsheet presentation = rclcat:presentation media = rclcat:media message = rclcat:message other = rclcat:other recoll-1.17.3/sampleconf/mimemap000644 001750 000000 00000013176 11754151722 017200 0ustar00dockeswheel000000 000000 # @(#$Id: mimemap,v 1.32 2008-09-15 08:03:37 dockes Exp $ (C) 2004 J.F.Dockes # Recoll: associations of file name extensions to mime types .txt = text/plain .text = text/plain .ini = text/x-ini .csv = text/plain # Source files. # Defining them with specific types allows using a specific ext viewer (in # mimeview). You can in general use rcltext to wrap them in html for # indexing the contents (and rough preview). You could also just set them # as text/plain (index as text, use text viewer) .cpp = text/x-c .h = text/x-c .c = text/x-c .cc = text/x-c .cxx = text/x-c .py = text/x-python .awk = application/x-awk .pl = application/x-perl .sh = application/x-shellscript .xml = text/xml .rtf = text/rtf .html = text/html .htm = text/html .shtml = text/html .php = text/html .ics = text/calendar .eml = message/rfc822 .pdf = application/pdf .ps = application/postscript .eps = application/postscript .ai = application/postscript .tex = application/x-tex .dvi = application/x-dvi .djvu = image/vnd.djvu .svg = image/svg+xml .dia = application/x-dia-diagram .gz = application/x-gzip .Z = application/x-gzip .bz2 = application/x-bzip2 .rar = application/x-rar #.Z = application/x-compress .zip = application/zip .doc = application/msword .ppt = application/vnd.ms-powerpoint .xls = application/vnd.ms-excel .chm = application/x-chm # 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 # ms openxml .docm = application/vnd.ms-word.document.macroEnabled.12 .docx = application/vnd.openxmlformats-officedocument.wordprocessingml.document .dotm = application/vnd.ms-word.template.macroEnabled.12 .dotx = application/vnd.openxmlformats-officedocument.wordprocessingml.template .potm = application/vnd.ms-powerpoint.template.macroEnabled.12 .potx = application/vnd.openxmlformats-officedocument.presentationml.template .ppam = application/vnd.ms-powerpoint.addin.macroEnabled.12 .ppsm = application/vnd.ms-powerpoint.slideshow.macroEnabled.12 .ppsx = application/vnd.openxmlformats-officedocument.presentationml.slideshow .pptm = application/vnd.ms-powerpoint.presentation.macroEnabled.12 .pptx = application/vnd.openxmlformats-officedocument.presentationml.presentation .xlam = application/vnd.ms-excel.addin.macroEnabled.12 .xlsb = application/vnd.ms-excel.sheet.binary.macroEnabled.12 .xlsm = application/vnd.ms-excel.sheet.macroEnabled.12 .xlsx = application/vnd.openxmlformats-officedocument.spreadsheetml.sheet .xltm = application/vnd.ms-excel.template.macroEnabled.12 .xltx = application/vnd.openxmlformats-officedocument.spreadsheetml.template .abw = application/x-abiword .lyx = application/x-lyx .sla = application/x-scribus .scd = application/x-scribus .info = application/x-gnuinfo .kwd = application/x-kword .gnumeric = application/x-gnumeric .gnm = application/x-gnumeric .wpd = application/vnd.wordperfect .rtf = text/rtf .mp3 = audio/mpeg .flac = application/x-flac .ogg = application/ogg # Note: file -i says audio/x-midi, but soft karaoke files are special. .kar = audio/x-karaoke .mid = audio/x-karaoke .png = image/png .jpg = image/jpeg .jpeg = image/jpeg .gif = image/gif .tiff = image/tiff .tif = image/tiff .xcf = image/x-xcf .bmp = image/bmp .xpm = image/x-xpmi .fb2 = text/x-fictionbook .war = application/x-webarchive .mht = application/x-mimehtml .mhtml = application/x-mimehtml # A list of suffixes (name endings) that we don't want to touch at all. # Having these explicitely listed speeds things up a bit by avoiding # unneeded decompression or 'file' calls. File names still get indexed if # indexallfilenames is set (so this is different from skippedNames). It's a # bit unconsistent to have it listed among the suffix translations, but no # problem in practice. recoll_noindex = .tar.gz .tgz .tar.bz2 .tbz .log.gz .md5 .map \ .o .lib .dll .a .sys .exe .com \ .dat .bak .rdf .log .db .msf .pid \ ,v ~ # # Special handling of .txt files inside ~/.gaim and ~/.purple directories [~/.gaim] .txt = text/x-gaim-log [~/.purple] .txt = text/x-purple-log .html = text/x-purple-html-log # Special handling of aptosid manual menu system [/usr/share/aptosid-manual] .htm = text/x-html-aptosid-man .html = text/x-html-aptosid-man # Special handling of sidux manual menu system [/usr/share/sidux-manual] .htm = text/x-html-sidux-man .html = text/x-html-sidux-man # Manual files. You may want to adjust the location for your system # We can't use the default text/troff type because this doesn't say # what macro set to use (groff -man) [/usr/share/man] .0p = text/x-man .1 = text/x-man .1m = text/x-man .1p = text/x-man .1ssl = text/x-man .1x = text/x-man .2 = text/x-man .3 = text/x-man .3curses = text/x-man .3form = text/x-man .3gl = text/x-man .3menu = text/x-man .3ncurses = text/x-man .3p = text/x-man .3pm = text/x-man .3ssl = text/x-man .3tiff = text/x-man .3x = text/x-man .4 = text/x-man .5 = text/x-man .5ssl = text/x-man .6 = text/x-man .6x = text/x-man .7 = text/x-man .7ssl = text/x-man .8 = text/x-man .9 = text/x-man .n = text/x-man # Special handling for okular notes [~/.kde4/share/apps/okular/docdata] .xml = application/x-okular-notes [~/.kde/share/apps/okular/docdata] .xml = application/x-okular-notes recoll-1.17.3/sampleconf/mimeview000644 001750 000000 00000006043 11754151725 017373 0ustar00dockeswheel000000 000000 # @(#$Id: mimeview,v 1.16 2008-09-15 08:03:37 dockes Exp $ (C) 2004 J.F.Dockes ## ########################################## # External viewers, launched by the recoll GUI when you click on a result # 'edit' link # 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 # exceptions and the list is normally empty #nouncompforviewmts = [view] # Pseudo entry used if the 'use desktop' preference is set in the GUI application/x-all = xdg-open %f application/x-kword = kword %f application/x-abiword = abiword %f application/pdf = okular %f application/postscript = okular %f application/x-dvi = okular %f application/x-lyx = lyx %f application/x-scribus = scribus %f application/msword = libreoffice %f application/vnd.ms-excel = libreoffice %f application/vnd.ms-powerpoint = libreoffice %f application/vnd.openxmlformats-officedocument.wordprocessingml.document = \ libreoffice %f application/vnd.openxmlformats-officedocument.wordprocessingml.template = \ libreoffice %f application/vnd.openxmlformats-officedocument.presentationml.template = \ libreoffice %f application/vnd.openxmlformats-officedocument.presentationml.presentation = \ libreoffice %f application/vnd.openxmlformats-officedocument.spreadsheetml.sheet = \ libreoffice %f application/vnd.openxmlformats-officedocument.spreadsheetml.template =\ libreoffice %f application/vnd.sun.xml.calc = libreoffice %f application/vnd.sun.xml.calc.template = libreoffice %f application/vnd.sun.xml.draw = libreoffice %f application/vnd.sun.xml.draw.template = libreoffice %f application/vnd.sun.xml.impress = libreoffice %f application/vnd.sun.xml.impress.template = libreoffice %f application/vnd.sun.xml.math = libreoffice %f application/vnd.sun.xml.writer = libreoffice %f application/vnd.sun.xml.writer.global = libreoffice %f application/vnd.sun.xml.writer.template = libreoffice %f application/vnd.wordperfect = libreoffice %f application/x-chm = kchmviewer %f application/x-dia-diagram = dia %f application/x-fsdirectory = dolphin %f application/x-gnuinfo = xterm -e "info -f %f" application/x-gnumeric = gnumeric %f application/x-flac = rhythmbox %f audio/mpeg = rhythmbox %f application/ogg = rhythmbox %f image/jpeg = gwenview %f image/png = gwenview %f image/tiff = gwenview %f image/gif = gwenview %f image/svg+xml = inkview %f image/vnd.djvu = djview %f image/x-xcf = gimp %f image/bmp = gwenview %f image/x-ms-bmp = gwenview %f image/x-xpmi = gwenview %f message/rfc822 = thunderbird -file %f text/x-mail = thunderbird -file %f application/x-tex = emacsclient %f text/x-tex = emacsclient %f # Or firefox -remote "openFile(%u)" text/html = firefox %u text/html|gnuinfo = rclshowinfo %F %(title) text/plain = emacsclient %f text/x-c = emacsclient %f text/x-c+ = emacsclient %f text/x-c++ = emacsclient %f text/x-html-sidux-man = konqueror %f text/x-html-aptosid-man = iceweasel %f text/x-chm-html = openchm %f %i text/x-ini = emacsclient %f text/x-man = xterm -u8 -e "groff -T ascii -man %f | more" text/x-python = idle %f recoll-1.17.3/sampleconf/mimeview.mac000644 001750 000000 00000004764 11740755063 020142 0ustar00dockeswheel000000 000000 # @(#$Id: mimeview,v 1.16 2008-09-15 08:03:37 dockes Exp $ (C) 2004 J.F.Dockes ## ########################################## # External viewers, launched by the recoll GUI when you click on a result # 'Open' link - MAC version # On the MAC, we basically 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 # exceptions and the list is normally empty #nouncompforviewmts = [view] # Pseudo entry used if the 'use desktop' preference is set in the GUI application/x-all = open %f application/x-kword = kword %f application/x-abiword = abiword %f application/pdf = open %f application/postscript = open %f application/x-dvi = open %f application/x-lyx = lyx %f application/x-scribus = scribus %f application/msword = open %f application/vnd.ms-excel = open %f application/vnd.ms-powerpoint = open %f application/vnd.openxmlformats-officedocument.wordprocessingml.document = \ open %f application/vnd.openxmlformats-officedocument.wordprocessingml.template = \ open %f application/vnd.openxmlformats-officedocument.presentationml.template = \ open %f application/vnd.openxmlformats-officedocument.presentationml.presentation = \ open %f application/vnd.openxmlformats-officedocument.spreadsheetml.sheet = \ open %f application/vnd.openxmlformats-officedocument.spreadsheetml.template =\ open %f application/vnd.sun.xml.calc = open %f application/vnd.sun.xml.calc.template = open %f application/vnd.sun.xml.draw = open %f application/vnd.sun.xml.draw.template = open %f application/vnd.sun.xml.impress = open %f application/vnd.sun.xml.impress.template = open %f application/vnd.sun.xml.math = open %f application/vnd.sun.xml.writer = open %f application/vnd.sun.xml.writer.global = open %f application/vnd.sun.xml.writer.template = open %f application/vnd.wordperfect = open %f application/x-chm = kchmviewer %f application/x-fsdirectory = open %f application/x-gnuinfo = xterm -e "info -f %f" application/x-flac = open %f audio/mpeg = open %f application/ogg = open %f image/jpeg = open %f image/png = open %f image/tiff = open %f image/gif = open %f image/svg+xml = open %f image/vnd.djvu = open %f image/x-xcf = open %f image/bmp = open %f image/x-ms-bmp = open %f image/x-xpmi = open %f application/x-tex = open %f text/x-tex = open %f text/html = open %u text/html|gnuinfo = rclshowinfo %F %(title) text/plain = open %f text/x-c = open %f text/x-c+ = open %f text/x-c++ = open %f text/x-python = idle %f recoll-1.17.3/sampleconf/recoll.conf.in000644 001750 000000 00000024672 11754714031 020365 0ustar00dockeswheel000000 000000 # @(#$Id: recoll.conf.in,v 1.22 2008-10-15 08:30:18 dockes Exp $ (C) 2004 J.F.Dockes # # Recoll default configuration file. This typically lives in # @prefix@/share/recoll/examples and provides default values. You can # override selected parameters by adding assigments to # ~/.recoll/recoll.conf (or $RECOLL_CONFDIR/recoll.conf) # # Almost all values in this file can be set from the GUI configuration menus, # which maybe an easier approach than direct editing # # Space-separated list of directories to index. Next line indexes $HOME topdirs = ~ # Wildcard expressions for names of files and directories that we should # ignore. If you need index mozilla/thunderbird mail folders, don't put # ".*" in there (as was the case with an older sample config) # These are simple names, not paths (must contain no / ) skippedNames = #* bin CVS Cache cache* caughtspam tmp .thumbnails .svn \ *~ .beagle .git .hg .bzr loop.ps .xsession-errors \ .recoll* xapiandb recollrc recoll.conf # Wildcard expressions for paths we shouldn't go into. The database and # configuration directories will be added in there, else the default value # is empty # skippedPaths = # Same for real time indexing. The idea here is that there is stuff that # you might want to initially index but not monitor. If daemSkippedPaths is # not set, the daemon uses skippedPaths. #daemSkippedPaths = # Recoll uses FNM_PATHNAME by default when matching skipped paths, which # means that /dir1/dir2/dir3 is not matched by */dir3. Can't change the # default now, but you can set the following variable to 0 to disable the # use of FNM_PATHNAME (see fnmatch(3) man page) # skippedPathsFnmPathname = 1 # Option to follow symbolic links. We normally don't, to avoid duplicated # indexing (in any case, no effort is made to identify or avoid multiple # indexing of linked files) # followLinks = 0 # Debug messages. 2 is errors/warnings only. 3 information like doc # updates, 4 is quite verbose and 6 very verbose loglevel = 3 logfilename = stderr # Specific versions of log file name and level for the indexing daemon. The # default is to use the above values. # daemloglevel = 3 # daemlogfilename = /dev/null # Languages for which to build stemming databases at the end of # indexing. Stemmer names can be found on http://www.xapian.org # The flag to perform stem expansion at query time is now set from the GUI indexstemminglanguages = english # Default character set. Values found inside files, ie content tag in html # documents, will override this. It can be specified per directory (see # below). Used when converting to utf-8 (internal storage format), so it # may be quite important for pure text files. # The default used to be set to iso8859-1, but we now take it from the nls # environment (LC_ALL/LC_CTYPE/LANG). The ultimate hardwired default is # still 8859-1. If for some reason you want a general default which doesnt # match your LANG and is not 8859-1, set it here. # defaultcharset = iso-8859-1 # 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 = åå Ã…Ã¥ ää Ää öö Öö # Where to store the database (directory). This may be an absolute path, # else it is taken as relative to the configuration directory (-c argument # or $RECOLL_CONFDIR). # If nothing is specified, the default is then ~/.recoll/xapiandb/ dbdir = xapiandb # Maximum file system occupation before we stop indexing. The default value # is 0, meaning no checking. The value is a percentage, corresponding to # what the "Capacity" df output column shows. maxfsoccuppc = 0 # Threshold (megabytes of new data) where we flush from memory to disk # index. Setting this (ie to 10) can help control memory usage. # # A value of 0 means no explicit flushing, which lets Xapian perform its # own thing, meaning flushing every XAPIAN_FLUSH_THRESHOLD documents # created, modified or deleted. XAPIAN_FLUSH_THRESHOLD is an environment # variable. As memory usage depends on average document size, not only # document count, this is not very useful. idxflushmb = 10 # Place to search for executable filters. If RECOLL_FILTERSDIR is set in # the environement, we use it instead filtersdir = @prefix@/share/recoll/filters # Place to search for icons. The only reason to change this would be if you # want to change the icons displayed in the result list iconsdir = @prefix@/share/recoll/images # 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 # (multiple chars allowed. 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. ** Changing the list implies a full reindex ** # Example for Swedish: # unac_except_trans = åå Ã…Ã¥ ää Ää öö Öö # Should we use the system's 'file -i' command as a final step in file type # identification ? This may be useful, but will usually cause the # indexation of many bogus 'text' files usesystemfilecommand = 1 # Should we index the file names of files with mime types we don't # know? (we can otherwise just ignore them) indexallfilenames = 1 # A restrictive list of indexed mime types. Normally not set. If it is set, # only the types from the list will have their contents indexed (the names # will be indexed anyway if indexallfilenames is set as by default). Mime # type names should be taken from the mimemap file. # # indexedmimetypes = text/html application/pdf # Size limit for compressed files. We need to decompress these in a # temporary directory for identification, which can be wasteful in some # cases. Limit the waste. Negative means no limit. 0 results in no # processing of any compressed file compressedfilemaxkbs = -1 # Size limit for text files. This is for skipping monster logs textfilemaxmbs = 20 # Page size for text files. If this is set, text/plain files will be # divided into documents of approximately this size. May be useful to # access pieces of big text files which would be problematic to load as one # piece into the preview window. Might be useful for big logs textfilepagekbs = 1000 # Maximum external filter execution time. Default 20mn. This is mainly # to avoid infinite loops in postscript files (loop.ps) filtermaxseconds = 1200 # Length of abstracts we store while indexing. Longer will make for a # bigger db # idxabsmlen = 250 # 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. # The default if this is not set is to use the NLS environment to guess the # value # aspellLanguage = en # Disabling aspell use. The aspell dictionary generation takes some time, # and some combinations of aspell version, language, and local terms, # result in aspell dumping core each time. You can disable the aspell # dictionary generation by setting the following variable: # noaspell = 1 # Timing parameters for the real time mode: # # Seconds between auxiliary databases updates (stemdb, aspell): # monauxinterval = 3600 # # Resting time (seconds) during which we let the queue accumulate, in hope # that events to the same file will merge, before we start indexing: # monixinterval = 30 # # Definitions for files which get a longer delay before reindexing is # allowed. This is for fast-changing files, that should only be reindexed # once in a while. A list of wildcardPattern:seconds pairs. The patterns # are matched with fnmatch(pattern, path, 0) You can quote entries containing # white space with double quotes. The default is empty, here follows an # example: # mondelaypatterns = *.log:20 "*with spaces.*:30" # ionice class for monitor (on platforms where this is supported) # monioniceclass = 3 # ionice class param for monitor (on platforms where this is supported) # monioniceclassdata = # 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. processbeaglequeue = 0 # 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. #beaglequeuedir = ~/.beagle/ToIndex # 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 webcachedir = webcache # 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. webcachemaxmbs = 40 # 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. #mboxcachedir = mboxcache # 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. #mboxcacheminmbs = 5 # You could specify different parameters for a subdirectory like this: #[~/hungariandocs/plain] #defaultcharset = iso-8859-2 # You can set fields on all files of a specific fs area. (rclaptg can be # used for application selection inside mimeview #[/some/app/directory] #localfields = rclaptg = someapp; otherfield = somevalue # Use app tag to enable using gnu info to open info files (as the subnodes # are indexed as html, we'd use firefox on a temp file else. Set this on # some known info storage places [/usr/share/info] localfields = rclaptg=gnuinfo [/usr/local/share/info] localfields = rclaptg=gnuinfo [/usr/local/info] localfields = rclaptg=gnuinfo # Enable thunderbird mbox format quirks where appropriate [~/.thunderbird] mhmboxquirks = tbird # pidgin / purple directories for irc chats have names beginning with # [~/.purple] skippedNames = recoll-1.17.3/sampleconf/recoll.qss000644 001750 000000 00000003535 11740755063 017641 0ustar00dockeswheel000000 000000 /* 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. */ /* This is an embryonic example Qt style sheet for Recoll. It is not really supposed to be less ugly than the default look, it's just provided in hope that someone with better taste will want to step in, or you can use it to indulge your preference for bright red backgrounds... If you do want to use it, and encounter a difficulty due to (lack of) widget object names or whatever, please get in touch, I'll fix what needs to be. Please check http://developer.qt.nokia.com/doc/qt-4.8/stylesheet.html for Qt style sheet information. */ /* Use a light grey background by default (lighter than the usual qt default): */ * { background: #eeeeee; } /* Use a light yellow background for all text display areas: */ QComboBox[editable="true"], QTextEdit, QLineEdit, QTextBrowser, QTableView, QWebView, QPlainTextEdit { background: #ffffee; } /* Keep a white background for the QTextEdit inside the Preview window This is rather arbitrary, just to show how to do it: */ Preview QTextEdit { background: white; font-family: Serif; font-size: 12pt; } recoll-1.17.3/rcldb/Makefile000644 001750 000000 00000001037 11740755063 016223 0ustar00dockeswheel000000 000000 # @(#$Id: Makefile,v 1.1 2007-06-02 08:30:42 dockes Exp $ (C) 2005 J.F.Dockes depth = .. include $(depth)/mk/sysconf # Only test executables get build in here PROGS = stoplist all: $(BIGLIB) $(PROGS) $(BIGLIB): force cd $(depth)/lib;$(MAKE) force: STOPLIST_OBJS= trstoplist.o $(BIGLIB) stoplist : $(STOPLIST_OBJS) $(CXX) $(ALL_CXXFLAGS) -o stoplist $(STOPLIST_OBJS) \ $(LIBICONV) $(LIBSYS) trstoplist.o : stoplist.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_STOPLIST -c -o trstoplist.o \ stoplist.cpp clean: rm -f *.o $(PROGS) recoll-1.17.3/rcldb/rcldb.cpp000644 001750 000000 00000172541 11740755063 016366 0ustar00dockeswheel000000 000000 /* 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 #include #include #include #include #include #include #include #include #include #include #ifndef NO_NAMESPACES using namespace std; #endif /* NO_NAMESPACES */ #include "xapian.h" #include "rclconfig.h" #include "debuglog.h" #include "rcldb.h" #include "rcldb_p.h" #include "stemdb.h" #include "textsplit.h" #include "transcode.h" #include "unacpp.h" #include "conftree.h" #include "pathut.h" #include "smallut.h" #include "utf8iter.h" #include "searchdata.h" #include "rclquery.h" #include "rclquery_p.h" #include "md5.h" #include "rclversion.h" #include "cancelcheck.h" #include "ptmutex.h" #include "termproc.h" #ifndef MAX #define MAX(A,B) (A>B?A:B) #endif #ifndef MIN #define MIN(A,B) (Atitle, for a remnant of compatibility with // omega // Static/Default table for field->prefix/weight translation. // This is logically const after initialization. Can't use a // static object to init this as the static std::string objects may // not be ready. // // This map is searched if a match is not found in the dynamic // "fields" configuration (cf: Db::fieldToTraits()), meaning that the // entries can be overriden in the configuration, but not // suppressed. static map fldToTraits; static PTMutexInit o_fldToTraits_mutex; static void initFldToTraits() { PTMutexLocker locker(o_fldToTraits_mutex); // As we perform non-locked testing of initialization, check again with // the lock held if (fldToTraits.size()) return; // Can't remember why "abstract" is indexed without a prefix // (result: it's indexed twice actually). Maybe I'll dare change // this one day fldToTraits[Doc::keyabs] = FieldTraits(); fldToTraits["ext"] = FieldTraits("XE"); fldToTraits[Doc::keyfn] = FieldTraits("XSFN"); fldToTraits[cstr_caption] = FieldTraits("S"); fldToTraits[Doc::keytt] = FieldTraits("S"); fldToTraits["subject"] = FieldTraits("S"); fldToTraits[Doc::keyau] = FieldTraits("A"); fldToTraits["creator"] = FieldTraits("A"); fldToTraits["from"] = FieldTraits("A"); fldToTraits[Doc::keykw] = FieldTraits("K"); fldToTraits["keyword"] = FieldTraits("K"); fldToTraits["tag"] = FieldTraits("K"); fldToTraits["tags"] = FieldTraits("K"); fldToTraits["xapyear"] = FieldTraits("Y"); fldToTraits["xapyearmon"] = FieldTraits("M"); fldToTraits["xapdate"] = FieldTraits("D"); fldToTraits[Doc::keytp] = FieldTraits("T"); } // Compute the unique term used to link documents to their origin. // "Q" + external udi static inline string make_uniterm(const string& udi) { string uniterm("Q"); uniterm.append(udi); return uniterm; } // Compute parent term used to link documents to their parent document (if any) // "F" + parent external udi static inline string make_parentterm(const string& udi) { // I prefer to be in possible conflict with omega than with // user-defined fields (Xxxx) that we also allow. "F" is currently // not used by omega (2008-07) string pterm("F"); pterm.append(udi); return pterm; } /* See comment in class declaration: return all subdocuments of a * document given by its unique id. */ bool Db::Native::subDocs(const string &udi, vector& docids) { LOGDEB2(("subDocs: [%s]\n", uniterm.c_str())); string pterm = make_parentterm(udi); XAPTRY(docids.clear(); docids.insert(docids.begin(), xrdb.postlist_begin(pterm), xrdb.postlist_end(pterm)), xrdb, m_rcldb->m_reason); if (!m_rcldb->m_reason.empty()) { LOGERR(("Rcl::Db::subDocs: %s\n", m_rcldb->m_reason.c_str())); return false; } else { LOGDEB0(("Db::Native::subDocs: returning %d ids\n", docids.size())); return true; } } // Turn data record from db into document fields bool Db::Native::dbDataToRclDoc(Xapian::docid docid, std::string &data, Doc &doc) { LOGDEB2(("Db::dbDataToRclDoc: data:\n%s\n", data.c_str())); ConfSimple parms(data); if (!parms.ok()) return false; parms.get(Doc::keyurl, doc.url); parms.get(Doc::keytp, doc.mimetype); parms.get(Doc::keyfmt, doc.fmtime); parms.get(Doc::keydmt, doc.dmtime); parms.get(Doc::keyoc, doc.origcharset); parms.get(cstr_caption, doc.meta[Doc::keytt]); parms.get(Doc::keykw, doc.meta[Doc::keykw]); parms.get(Doc::keyabs, doc.meta[Doc::keyabs]); // Possibly remove synthetic abstract indicator (if it's there, we // used to index the beginning of the text as abstract). doc.syntabs = false; if (doc.meta[Doc::keyabs].find(cstr_syntAbs) == 0) { doc.meta[Doc::keyabs] = doc.meta[Doc::keyabs].substr(cstr_syntAbs.length()); doc.syntabs = true; } parms.get(Doc::keyipt, doc.ipath); parms.get(Doc::keypcs, doc.pcbytes); parms.get(Doc::keyfs, doc.fbytes); parms.get(Doc::keyds, doc.dbytes); parms.get(Doc::keysig, doc.sig); doc.xdocid = docid; // Other, not predefined meta fields: list keys = parms.getNames(string()); for (list::const_iterator it = keys.begin(); it != keys.end(); it++) { if (doc.meta.find(*it) == doc.meta.end()) parms.get(*it, doc.meta[*it]); } doc.meta[Doc::keymt] = doc.dmtime.empty() ? doc.fmtime : doc.dmtime; return true; } // Remove prefixes (caps) from a list of terms. static void noPrefixList(const list& in, list& out) { for (list::const_iterator qit = in.begin(); qit != in.end(); qit++) { if ('A' <= qit->at(0) && qit->at(0) <= 'Z') { string term = *qit; while (term.length() && 'A' <= term.at(0) && term.at(0) <= 'Z') term.erase(0, 1); if (term.length()) out.push_back(term); continue; } else { out.push_back(*qit); } } } //#define DEBUGABSTRACT 1 #ifdef DEBUGABSTRACT #define LOGABS LOGDEB #else #define LOGABS LOGDEB2 #endif #if 0 static void listList(const string& what, const list&l) { string a; for (list::const_iterator it = l.begin(); it != l.end(); it++) { a = a + *it + " "; } LOGDEB(("%s: %s\n", what.c_str(), a.c_str())); } #endif // Build a document abstract by extracting text chunks around the query terms // This uses the db termlists, not the original document. // // DatabaseModified and other general exceptions are catched and // possibly retried by our caller vector Db::Native::makeAbstract(Xapian::docid docid, Query *query) { Chrono chron; LOGDEB2(("makeAbstract:%d: maxlen %d wWidth %d\n", chron.ms(), m_rcldb->m_synthAbsLen, m_rcldb->m_synthAbsWordCtxLen)); list terms; { list iterms; query->getMatchTerms(docid, iterms); noPrefixList(iterms, terms); if (terms.empty()) { LOGDEB(("makeAbstract::Empty term list\n")); return vector(); } } // listList("Match terms: ", terms); // Retrieve db-wide frequencies for the query terms (we do this once per // query, using all the query terms, not only the document match terms) if (query->m_nq->termfreqs.empty()) { list iqterms, qterms; query->getQueryTerms(iqterms); noPrefixList(iqterms, qterms); // listList("Query terms: ", qterms); double doccnt = xrdb.get_doccount(); if (doccnt == 0) doccnt = 1; for (list::const_iterator qit = qterms.begin(); qit != qterms.end(); qit++) { query->m_nq->termfreqs[*qit] = xrdb.get_termfreq(*qit) / doccnt; LOGABS(("makeAbstract: [%s] db freq %.1e\n", qit->c_str(), query->m_nq->termfreqs[*qit])); } LOGABS(("makeAbstract:%d: got termfreqs\n", chron.ms())); } // Compute a term quality coefficient by retrieving the term // Within Document Frequencies and multiplying by overal term // frequency, then using log-based thresholds. We are going to try // and show text around the less common search terms. map termQcoefs; double totalweight = 0; double doclen = xrdb.get_doclength(docid); if (doclen == 0) doclen = 1; for (list::const_iterator qit = terms.begin(); qit != terms.end(); qit++) { Xapian::TermIterator term = xrdb.termlist_begin(docid); term.skip_to(*qit); if (term != xrdb.termlist_end(docid) && *term == *qit) { double q = (term.get_wdf() / doclen) * query->m_nq->termfreqs[*qit]; q = -log10(q); if (q < 3) { q = 0.05; } else if (q < 4) { q = 0.3; } else if (q < 5) { q = 0.7; } else if (q < 6) { q = 0.8; } else { q = 1; } termQcoefs[*qit] = q; totalweight += q; } } LOGABS(("makeAbstract:%d: computed Qcoefs.\n", chron.ms())); // Build a sorted by quality term list. multimap byQ; for (list::const_iterator qit = terms.begin(); qit != terms.end(); qit++) { if (termQcoefs.find(*qit) != termQcoefs.end()) byQ.insert(pair(termQcoefs[*qit], *qit)); } #ifdef DEBUGABSTRACT for (multimap::reverse_iterator qit = byQ.rbegin(); qit != byQ.rend(); qit++) { LOGDEB(("%.1e->[%s]\n", qit->first, qit->second.c_str())); } #endif // For each of the query terms, ask xapian for its positions list // in the document. For each position entry, remember it in // qtermposs and insert it and its neighbours in the set of // 'interesting' positions // The terms 'array' that we partially populate with the document // terms, at their positions around the search terms positions: map sparseDoc; // All the chosen query term positions. vector qtermposs; // Limit the total number of slots we populate. The 7 is taken as // average word size. It was a mistake to have the user max // abstract size parameter in characters, we basically only deal // with words. We used to limit the character size at the end, but // this damaged our careful selection of terms const unsigned int maxtotaloccs = m_rcldb->m_synthAbsLen /(7 * (m_rcldb->m_synthAbsWordCtxLen+1)); LOGABS(("makeAbstract:%d: mxttloccs %d\n", chron.ms(), maxtotaloccs)); // This can't happen, but would crash us if (totalweight == 0.0) { LOGERR(("makeAbstract: 0 totalweight!\n")); return vector(); } // This is used to mark positions overlapped by a multi-word match term const string occupiedmarker("?"); // Let's go populate for (multimap::reverse_iterator qit = byQ.rbegin(); qit != byQ.rend(); qit++) { string qterm = qit->second; unsigned int maxoccs; if (byQ.size() == 1) { maxoccs = maxtotaloccs; } else { // We give more slots to the better terms float q = qit->first / totalweight; maxoccs = int(ceil(maxtotaloccs * q)); LOGABS(("makeAbstract: [%s] %d max occs (coef %.2f)\n", qterm.c_str(), maxoccs, q)); } // The match term may span several words int qtrmwrdcnt = TextSplit::countWords(qterm, TextSplit::TXTS_NOSPANS); Xapian::PositionIterator pos; // There may be query terms not in this doc. This raises an // exception when requesting the position list, we catch it. string emptys; try { unsigned int occurrences = 0; for (pos = xrdb.positionlist_begin(docid, qterm); pos != xrdb.positionlist_end(docid, qterm); pos++) { int ipos = *pos; if (ipos < int(baseTextPosition)) // Not in text body continue; LOGABS(("makeAbstract: [%s] at %d occurrences %d maxoccs %d\n", qterm.c_str(), ipos, occurrences, maxoccs)); // Remember the term position qtermposs.push_back(ipos); // Add adjacent slots to the set to populate at next // step by inserting empty strings. Special provisions // for adding ellipsis and for positions overlapped by // the match term. unsigned int sta = MAX(0, ipos-m_rcldb->m_synthAbsWordCtxLen); unsigned int sto = ipos + qtrmwrdcnt-1 + m_rcldb->m_synthAbsWordCtxLen; for (unsigned int ii = sta; ii <= sto; ii++) { if (ii == (unsigned int)ipos) { sparseDoc[ii] = qterm; } else if (ii > (unsigned int)ipos && ii < (unsigned int)ipos + qtrmwrdcnt) { sparseDoc[ii] = occupiedmarker; } else if (!sparseDoc[ii].compare(cstr_ellipsis)) { // For an empty slot, the test has a side // effect of inserting an empty string which // is what we want sparseDoc[ii] = emptys; } } // Add ellipsis at the end. This may be replaced later by // an overlapping extract. Take care not to replace an // empty string here, we really want an empty slot, // use find() if (sparseDoc.find(sto+1) == sparseDoc.end()) { sparseDoc[sto+1] = cstr_ellipsis; } // Limit to allocated occurences and total size if (++occurrences >= maxoccs || qtermposs.size() >= maxtotaloccs) break; } } catch (...) { // Term does not occur. No problem. } if (qtermposs.size() >= maxtotaloccs) break; } LOGABS(("makeAbstract:%d:chosen number of positions %d\n", chron.millis(), qtermposs.size())); // This can happen if there are term occurences in the keywords // etc. but not elsewhere ? if (qtermposs.size() == 0) { LOGDEB1(("makeAbstract: no occurrences\n")); return vector(); } // Walk all document's terms position lists and populate slots // around the query terms. We arbitrarily truncate the list to // avoid taking forever. If we do cutoff, the abstract may be // inconsistant (missing words, potentially altering meaning), // which is bad. { Xapian::TermIterator term; int cutoff = 500 * 1000; for (term = xrdb.termlist_begin(docid); term != xrdb.termlist_end(docid); term++) { // Ignore prefixed terms if ('A' <= (*term).at(0) && (*term).at(0) <= 'Z') continue; if (cutoff-- < 0) { LOGDEB0(("makeAbstract: max term count cutoff\n")); break; } Xapian::PositionIterator pos; for (pos = xrdb.positionlist_begin(docid, *term); pos != xrdb.positionlist_end(docid, *term); pos++) { if (cutoff-- < 0) { LOGDEB0(("makeAbstract: max term count cutoff\n")); break; } map::iterator vit; if ((vit=sparseDoc.find(*pos)) != sparseDoc.end()) { // Don't replace a term: the terms list is in // alphabetic order, and we may have several terms // at the same position, we want to keep only the // first one (ie: dockes and dockes@wanadoo.fr) if (vit->second.empty()) { LOGABS(("makeAbstract: populating: [%s] at %d\n", (*term).c_str(), *pos)); sparseDoc[*pos] = *term; } } } } } #if 0 // Debug only: output the full term[position] vector bool epty = false; int ipos = 0; for (map::iterator it = sparseDoc.begin(); it != sparseDoc.end(); it++, ipos++) { if (it->empty()) { if (!epty) LOGDEB(("makeAbstract:vec[%d]: [%s]\n", ipos, it->c_str())); epty=true; } else { epty = false; LOGDEB(("makeAbstract:vec[%d]: [%s]\n", ipos, it->c_str())); } } #endif LOGABS(("makeAbstract:%d: extracting\n", chron.millis())); // Finally build the abstract by walking the map (in order of position) vector vabs; string chunk; bool incjk = false; for (map::const_iterator it = sparseDoc.begin(); it != sparseDoc.end(); it++) { LOGDEB2(("Abtract:output %u -> [%s]\n", it->first,it->second.c_str())); if (!occupiedmarker.compare(it->second)) continue; Utf8Iter uit(it->second); bool newcjk = false; if (TextSplit::isCJK(*uit)) newcjk = true; if (!incjk || (incjk && !newcjk)) chunk += " "; incjk = newcjk; if (it->second == cstr_ellipsis) { vabs.push_back(chunk); chunk.clear(); } else { chunk += it->second; } } if (!chunk.empty()) vabs.push_back(chunk); LOGDEB2(("makeAbtract: done in %d mS\n", chron.millis())); return vabs; } /* Rcl::Db methods ///////////////////////////////// */ Db::Db(RclConfig *cfp) : m_ndb(0), m_config(cfp), m_idxAbsTruncLen(250), m_synthAbsLen(250), m_synthAbsWordCtxLen(4), m_flushMb(-1), m_curtxtsz(0), m_flushtxtsz(0), m_occtxtsz(0), m_occFirstCheck(1), m_maxFsOccupPc(0), m_mode(Db::DbRO) { if (!fldToTraits.size()) initFldToTraits(); m_ndb = new Native(this); if (m_config) { m_config->getConfParam("maxfsoccuppc", &m_maxFsOccupPc); m_config->getConfParam("idxflushmb", &m_flushMb); } #ifdef IDX_THREADS if (m_ndb && !m_ndb->m_wqueue.start(DbUpdWorker, this)) { LOGERR(("Db::Db: Worker start failed\n")); return; } #endif // IDX_THREADS } Db::~Db() { LOGDEB2(("Db::~Db\n")); if (m_ndb == 0) return; LOGDEB(("Db::~Db: isopen %d m_iswritable %d\n", m_ndb->m_isopen, m_ndb->m_iswritable)); i_close(true); } list Db::getStemmerNames() { list res; stringToStrings(Xapian::Stem::get_available_languages(), res); return res; } bool Db::open(OpenMode mode, OpenError *error) { if (error) *error = DbOpenMainDb; if (m_ndb == 0 || m_config == 0) { m_reason = "Null configuration or Xapian Db"; return false; } LOGDEB(("Db::open: m_isopen %d m_iswritable %d\n", m_ndb->m_isopen, m_ndb->m_iswritable)); if (m_ndb->m_isopen) { // We used to return an error here but I see no reason to if (!close()) return false; } if (!m_config->getStopfile().empty()) m_stops.setFile(m_config->getStopfile()); string dir = m_config->getDbDir(); string ermsg; try { switch (mode) { case DbUpd: case DbTrunc: { int action = (mode == DbUpd) ? Xapian::DB_CREATE_OR_OPEN : Xapian::DB_CREATE_OR_OVERWRITE; m_ndb->xwdb = Xapian::WritableDatabase(dir, action); // If db is empty, write the data format version at once // to avoid stupid error messages: if (m_ndb->xwdb.get_doccount() == 0) m_ndb->xwdb.set_metadata(cstr_RCL_IDX_VERSION_KEY, cstr_RCL_IDX_VERSION); m_ndb->m_iswritable = true; // We open a readonly object in all cases (possibly in // addition to the r/w one) because some operations // are faster when performed through a Database: no // forced flushes on allterms_begin(), ie, used in // subDocs() m_ndb->xrdb = Xapian::Database(dir); LOGDEB(("Db::open: lastdocid: %d\n", m_ndb->xwdb.get_lastdocid())); LOGDEB2(("Db::open: resetting updated\n")); updated.resize(m_ndb->xwdb.get_lastdocid() + 1); for (unsigned int i = 0; i < updated.size(); i++) updated[i] = false; } break; case DbRO: default: m_ndb->m_iswritable = false; m_ndb->xrdb = Xapian::Database(dir); for (list::iterator it = m_extraDbs.begin(); it != m_extraDbs.end(); it++) { if (error) *error = DbOpenExtraDb; LOGDEB(("Db::Open: adding query db [%s]\n", it->c_str())); // An error here used to be non-fatal (1.13 and older) // but I can't see why m_ndb->xrdb.add_database(Xapian::Database(*it)); } break; } if (error) *error = DbOpenMainDb; // Check index format version. Must not try to check a just created or // truncated db if (mode != DbTrunc && m_ndb->xdb().get_doccount() > 0) { string version = m_ndb->xdb().get_metadata(cstr_RCL_IDX_VERSION_KEY); if (version.compare(cstr_RCL_IDX_VERSION)) { m_ndb->m_noversionwrite = true; LOGERR(("Rcl::Db::open: file index [%s], software [%s]\n", version.c_str(), cstr_RCL_IDX_VERSION.c_str())); throw Xapian::DatabaseError("Recoll index version mismatch", "", ""); } } m_mode = mode; m_ndb->m_isopen = true; m_basedir = dir; if (error) *error = DbOpenNoError; return true; } XCATCHERROR(ermsg); m_reason = ermsg; LOGERR(("Db::open: exception while opening [%s]: %s\n", dir.c_str(), ermsg.c_str())); return false; } // Note: xapian has no close call, we delete and recreate the db bool Db::close() { LOGDEB2(("Db::close()\n")); return i_close(false); } bool Db::i_close(bool final) { if (m_ndb == 0) return false; LOGDEB(("Db::i_close(%d): m_isopen %d m_iswritable %d\n", final, m_ndb->m_isopen, m_ndb->m_iswritable)); if (m_ndb->m_isopen == false && !final) return true; string ermsg; try { bool w = m_ndb->m_iswritable; if (w) { if (!m_ndb->m_noversionwrite) m_ndb->xwdb.set_metadata(cstr_RCL_IDX_VERSION_KEY, cstr_RCL_IDX_VERSION); LOGDEB(("Rcl::Db:close: xapian will close. May take some time\n")); } // Used to do a flush here. Cant see why it should be necessary. deleteZ(m_ndb); if (w) LOGDEB(("Rcl::Db:close() xapian close done.\n")); if (final) { return true; } m_ndb = new Native(this); if (m_ndb) { return true; } LOGERR(("Rcl::Db::close(): cant recreate db object\n")); return false; } XCATCHERROR(ermsg); LOGERR(("Db:close: exception while deleting db: %s\n", ermsg.c_str())); return false; } // Reopen the db with a changed list of additional dbs bool Db::adjustdbs() { if (m_mode != DbRO) { LOGERR(("Db::adjustdbs: mode not RO\n")); return false; } if (m_ndb && m_ndb->m_isopen) { if (!close()) return false; if (!open(m_mode)) { return false; } } return true; } int Db::docCnt() { int res = -1; if (!m_ndb || !m_ndb->m_isopen) return -1; XAPTRY(res = m_ndb->xdb().get_doccount(), m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR(("Db::docCnt: got error: %s\n", m_reason.c_str())); return -1; } return res; } int Db::termDocCnt(const string& _term) { int res = -1; if (!m_ndb || !m_ndb->m_isopen) return -1; string term; if (!unacmaybefold(_term, term, "UTF-8", true)) { LOGINFO(("Db::termDocCnt: unac failed for [%s]\n", _term.c_str())); return 0; } if (m_stops.isStop(term)) { LOGDEB1(("Db::termDocCnt [%s] in stop list\n", term.c_str())); return 0; } XAPTRY(res = m_ndb->xdb().get_termfreq(term), m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR(("Db::termDocCnt: got error: %s\n", m_reason.c_str())); return -1; } return res; } bool Db::addQueryDb(const string &dir) { LOGDEB(("Db::addQueryDb: ndb %p iswritable %d db [%s]\n", m_ndb, (m_ndb)?m_ndb->m_iswritable:0, dir.c_str())); if (!m_ndb) return false; if (m_ndb->m_iswritable) return false; if (find(m_extraDbs.begin(), m_extraDbs.end(), dir) == m_extraDbs.end()) { m_extraDbs.push_back(dir); } return adjustdbs(); } bool Db::rmQueryDb(const string &dir) { if (!m_ndb) return false; if (m_ndb->m_iswritable) return false; if (dir.empty()) { m_extraDbs.clear(); } else { list::iterator it = find(m_extraDbs.begin(), m_extraDbs.end(), dir); if (it != m_extraDbs.end()) { m_extraDbs.erase(it); } } return adjustdbs(); } bool Db::testDbDir(const string &dir) { string aerr; LOGDEB(("Db::testDbDir: [%s]\n", dir.c_str())); try { Xapian::Database db(dir); } XCATCHERROR(aerr); if (!aerr.empty()) { LOGERR(("Db::Open: error while trying to open database " "from [%s]: %s\n", dir.c_str(), aerr.c_str())); return false; } return true; } bool Db::isopen() { if (m_ndb == 0) return false; return m_ndb->m_isopen; } // Try to translate field specification into field prefix. We have a // default table used if translations are not in the config for some // reason (old config not updated ?). We use it only if the config // translation fails. Also we add in there fields which should be // indexed with no prefix (ie: abstract) bool Db::fieldToTraits(const string& fld, const FieldTraits **ftpp) { if (m_config && m_config->getFieldTraits(fld, ftpp)) return true; // No data in rclconfig? Check default values map::const_iterator it = fldToTraits.find(fld); if (it != fldToTraits.end()) { *ftpp = &it->second; return true; } *ftpp = 0; return false; } // The splitter breaks text into words and adds postings to the Xapian // document. We use a single object to split all of the document // fields and position jumps to separate fields class TextSplitDb : public TextSplitP { public: Xapian::Document &doc; // Xapian document // Base for document section. Gets large increment when we change // sections, to avoid cross-section proximity matches. Xapian::termpos basepos; // Current relative position. This is the remembered value from // the splitter callback. The term position is reset for each call // to text_to_words(), so that the last value of curpos is the // section size (last relative term position), and this is what // gets added to basepos in addition to the inter-section increment // to compute the first position of the next section. Xapian::termpos curpos; TextSplitDb(Xapian::Document &d, TermProc *prc) : TextSplitP(prc), doc(d), basepos(1), curpos(0), wdfinc(1) {} // Reimplement text_to_words to add start and end special terms virtual bool text_to_words(const string &in); void setprefix(const string& pref) {prefix = pref;} void setwdfinc(int i) {wdfinc = i;} friend class TermProcIdx; private: // If prefix is set, we also add a posting for the prefixed terms // (ie: for titles, add postings for both "term" and "Sterm") string prefix; // Some fields have more weight int wdfinc; }; // Reimplement text_to_words to insert the begin and end anchor terms. bool TextSplitDb::text_to_words(const string &in) { bool ret = false; string ermsg; try { // Index the possibly prefixed start term. doc.add_posting(prefix + start_of_field_term, basepos, wdfinc); ++basepos; } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR(("Db: xapian add_posting error %s\n", ermsg.c_str())); goto out; } if (!TextSplitP::text_to_words(in)) { LOGDEB(("TextSplitDb: TextSplit::text_to_words failed\n")); goto out; } try { // Index the possibly prefixed end term. doc.add_posting(prefix + end_of_field_term, basepos+curpos+1, wdfinc); ++basepos; } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR(("Db: xapian add_posting error %s\n", ermsg.c_str())); goto out; } ret = true; out: basepos += curpos + 100; return true; } class TermProcIdx : public TermProc { public: TermProcIdx() : TermProc(0), m_ts(0) {} void setTSD(TextSplitDb *ts) {m_ts = ts;} bool takeword(const std::string &term, int pos, int, int) { // Compute absolute position (pos is relative to current segment), // and remember relative. m_ts->curpos = pos; pos += m_ts->basepos; string ermsg; try { // Index without prefix, using the field-specific weighting LOGDEB1(("Emitting term at %d : [%s]\n", pos, term.c_str())); m_ts->doc.add_posting(term, pos, m_ts->wdfinc); #ifdef TESTING_XAPIAN_SPELL if (Db::isSpellingCandidate(term)) { m_ts->db.add_spelling(term); } #endif // Index the prefixed term. if (!m_ts->prefix.empty()) { m_ts->doc.add_posting(m_ts->prefix + term, pos, m_ts->wdfinc); } return true; } XCATCHERROR(ermsg); LOGERR(("Db: xapian add_posting error %s\n", ermsg.c_str())); return false; } private: TextSplitDb *m_ts; }; #ifdef TESTING_XAPIAN_SPELL string Db::getSpellingSuggestion(const string& word) { if (m_ndb == 0) return string(); string term; if (!unacmaybefold(word, term, "UTF-8", true)) { LOGINFO(("Db::getSpelling: unac failed for [%s]\n", word.c_str())); return string(); } if (!isSpellingCandidate(term)) return string(); return m_ndb->xrdb.get_spelling_suggestion(term); } #endif // Let our user set the parameters for abstract processing void Db::setAbstractParams(int idxtrunc, int syntlen, int syntctxlen) { LOGDEB1(("Db::setAbstractParams: trunc %d syntlen %d ctxlen %d\n", idxtrunc, syntlen, syntctxlen)); if (idxtrunc > 0) m_idxAbsTruncLen = idxtrunc; if (syntlen > 0) m_synthAbsLen = syntlen; if (syntctxlen > 0) m_synthAbsWordCtxLen = syntctxlen; } static const int MB = 1024 * 1024; static const string cstr_nc("\n\r\x0c"); #define RECORD_APPEND(R, NM, VAL) {R += NM + "=" + VAL + "\n";} #ifdef IDX_THREADS void *DbUpdWorker(void* vdbp) { Db *dbp = (Db *)vdbp; WorkQueue *tqp = &(dbp->m_ndb->m_wqueue); DbUpdTask *tsk; for (;;) { if (!tqp->take(&tsk)) { tqp->workerExit(); return (void*)1; } LOGDEB(("DbUpdWorker: got task, ql %d\n", int(tqp->size()))); const char *fnc = tsk->udi.c_str(); string ermsg; // Add db entry or update existing entry: try { Xapian::docid did = dbp->m_ndb->xwdb.replace_document(tsk->uniterm, tsk->doc); if (did < dbp->updated.size()) { dbp->updated[did] = true; LOGINFO(("Db::add: docid %d updated [%s]\n", did, fnc)); } else { LOGINFO(("Db::add: docid %d added [%s]\n", did, fnc)); } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR(("Db::add: replace_document failed: %s\n", ermsg.c_str())); ermsg.erase(); // FIXME: is this ever actually needed? try { dbp->m_ndb->xwdb.add_document(tsk->doc); LOGDEB(("Db::add: %s added (failed re-seek for duplicate)\n", fnc)); } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR(("Db::add: add_document failed: %s\n", ermsg.c_str())); tqp->workerExit(); return (void*)0; } } dbp->maybeflush(tsk->txtlen); delete tsk; } } #endif // IDX_THREADS // Add document in internal form to the database: index the terms in // the title abstract and body and add special terms for file name, // date, mime type etc. , create the document data record (more // metadata), and update database bool Db::addOrUpdate(const string &udi, const string &parent_udi, Doc &doc) { LOGDEB(("Db::add: udi [%s] parent [%s]\n", udi.c_str(), parent_udi.c_str())); if (m_ndb == 0) return false; // Check file system full every mbyte of indexed text. if (m_maxFsOccupPc > 0 && (m_occFirstCheck || (m_curtxtsz - m_occtxtsz) / MB >= 1)) { LOGDEB(("Db::add: checking file system usage\n")); int pc; m_occFirstCheck = 0; if (fsocc(m_basedir, &pc) && pc >= m_maxFsOccupPc) { LOGERR(("Db::add: stop indexing: file system " "%d%% full > max %d%%\n", pc, m_maxFsOccupPc)); return false; } m_occtxtsz = m_curtxtsz; } Xapian::Document newdocument; // The term processing pipeline: TermProcIdx tpidx; TermProc *nxt = &tpidx; TermProcStop tpstop(nxt, m_stops);nxt = &tpstop; // TermProcCommongrams tpcommon(nxt, m_stops); nxt = &tpcommon; TermProcPrep tpprep(nxt); nxt = &tpprep; TextSplitDb splitter(newdocument, nxt); tpidx.setTSD(&splitter); // Split and index file name as document term(s) LOGDEB2(("Db::add: split file name [%s]\n", fn.c_str())); if (!splitter.text_to_words(doc.utf8fn)) LOGDEB(("Db::addOrUpdate: split failed for file name\n")); // If the ipath is like a path, index the last element. This is // for compound documents like zip and chm for which the filter // uses the file path as ipath. if (!doc.ipath.empty() && doc.ipath.find_first_not_of("0123456789") != string::npos) { string utf8ipathlast; // There is no way in hell we could have an idea of the // charset here, so let's hope it's ascii or utf-8. We call // transcode to strip the bad chars and pray if (transcode(path_getsimple(doc.ipath), utf8ipathlast, "UTF-8", "UTF-8")) { splitter.text_to_words(utf8ipathlast); } } // Split and index the path from the url for path-based filtering { string path = url_gpath(doc.url); vector vpath; stringToTokens(path, vpath, "/"); splitter.curpos = 0; newdocument.add_posting(pathelt_prefix, splitter.basepos + splitter.curpos++); for (vector::iterator it = vpath.begin(); it != vpath.end(); it++){ if (it->length() > 230) { // Just truncate it. May still be useful because of wildcards *it = it->substr(0, 230); } newdocument.add_posting(pathelt_prefix + *it, splitter.basepos + splitter.curpos++); } } // Index textual metadata. These are all indexed as text with // positions, as we may want to do phrase searches with them (this // makes no sense for keywords by the way). // // The order has no importance, and we set a position gap of 100 // between fields to avoid false proximity matches. map::iterator meta_it; for (meta_it = doc.meta.begin(); meta_it != doc.meta.end(); meta_it++) { if (!meta_it->second.empty()) { const FieldTraits *ftp; // We don't test for an empty prefix here. Some fields are part // of the internal conf with an empty prefix (ie: abstract). if (!fieldToTraits(meta_it->first, &ftp)) { LOGDEB0(("Db::add: no prefix for field [%s], no indexing\n", meta_it->first.c_str())); continue; } LOGDEB0(("Db::add: field [%s] pfx [%s] inc %d: [%s]\n", meta_it->first.c_str(), ftp->pfx.c_str(), ftp->wdfinc, meta_it->second.c_str())); splitter.setprefix(ftp->pfx); // Subject splitter.setwdfinc(ftp->wdfinc); if (!splitter.text_to_words(meta_it->second)) LOGDEB(("Db::addOrUpdate: split failed for %s\n", meta_it->first.c_str())); } } splitter.setprefix(string()); splitter.setwdfinc(1); if (splitter.curpos < baseTextPosition) splitter.basepos = baseTextPosition; // Split and index body text LOGDEB2(("Db::add: split body: [%s]\n", doc.text.c_str())); if (!splitter.text_to_words(doc.text)) LOGDEB(("Db::addOrUpdate: split failed for main text\n")); ////// Special terms for other metadata. No positions for these. // Mime type newdocument.add_term("T" + doc.mimetype); // Simple file name indexed for file name searches with a term prefix // We also add a term for the filename extension if any. if (!doc.utf8fn.empty()) { string fn; if (unacmaybefold(doc.utf8fn, fn, "UTF-8", true)) { // We should truncate after extracting the extension, but this is // a pathological case anyway if (fn.size() > 230) utf8truncate(fn, 230); string::size_type pos = fn.rfind('.'); if (pos != string::npos && pos != fn.length() - 1) { newdocument.add_term(string("XE") + fn.substr(pos + 1)); } fn = string("XSFN") + fn; newdocument.add_term(fn); } // Store utf8fn inside the metadata array as keyfn // (="filename") so that it can be accessed by the "stored" // processing below, without special-casing it. We only do it // if keyfn is currently empty, because there could be a value // already (ie for a mail attachment with a file name // attribute) if (doc.meta[Doc::keyfn].empty()) { doc.meta[Doc::keyfn] = doc.utf8fn; } } // Udi unique term: this is used for file existence/uptodate // checks, and unique id for the replace_document() call. string uniterm = make_uniterm(udi); newdocument.add_term(uniterm); // Parent term. This is used to find all descendents, mostly to delete them // when the parent goes away if (!parent_udi.empty()) { newdocument.add_term(make_parentterm(parent_udi)); } // Dates etc. time_t mtime = atol(doc.dmtime.empty() ? doc.fmtime.c_str() : doc.dmtime.c_str()); struct tm *tm = localtime(&mtime); char buf[9]; snprintf(buf, 9, "%04d%02d%02d", tm->tm_year+1900, tm->tm_mon + 1, tm->tm_mday); newdocument.add_term("D" + string(buf)); // Date (YYYYMMDD) buf[6] = '\0'; newdocument.add_term("M" + string(buf)); // Month (YYYYMM) buf[4] = '\0'; newdocument.add_term("Y" + string(buf)); // Year (YYYY) ////////////////////////////////////////////////////////////////// // Document data record. omindex has the following nl separated fields: // - url // - sample // - caption (title limited to 100 chars) // - mime type // // The title, author, abstract and keywords fields are special, // they always get stored in the document data // record. Configurable other fields can be, too. // // We truncate stored fields abstract, title and keywords to // reasonable lengths and suppress newlines (so that the data // record can keep a simple syntax) string record; RECORD_APPEND(record, Doc::keyurl, doc.url); RECORD_APPEND(record, Doc::keytp, doc.mimetype); // We left-zero-pad the times so that they are lexico-sortable leftzeropad(doc.fmtime, 11); RECORD_APPEND(record, Doc::keyfmt, doc.fmtime); if (!doc.dmtime.empty()) { leftzeropad(doc.dmtime, 11); RECORD_APPEND(record, Doc::keydmt, doc.dmtime); } RECORD_APPEND(record, Doc::keyoc, doc.origcharset); if (doc.fbytes.empty()) doc.fbytes = doc.pcbytes; if (!doc.fbytes.empty()) { RECORD_APPEND(record, Doc::keyfs, doc.fbytes); leftzeropad(doc.fbytes, 12); newdocument.add_value(VALUE_SIZE, doc.fbytes); } if (!doc.pcbytes.empty()) RECORD_APPEND(record, Doc::keypcs, doc.pcbytes); char sizebuf[30]; sprintf(sizebuf, "%u", (unsigned int)doc.text.length()); RECORD_APPEND(record, Doc::keyds, sizebuf); // Note that we add the signature both as a value and in the data record if (!doc.sig.empty()) RECORD_APPEND(record, Doc::keysig, doc.sig); newdocument.add_value(VALUE_SIG, doc.sig); if (!doc.ipath.empty()) RECORD_APPEND(record, Doc::keyipt, doc.ipath); doc.meta[Doc::keytt] = neutchars(truncate_to_word(doc.meta[Doc::keytt], 150), cstr_nc); if (!doc.meta[Doc::keytt].empty()) RECORD_APPEND(record, cstr_caption, doc.meta[Doc::keytt]); trimstring(doc.meta[Doc::keykw], " \t\r\n"); doc.meta[Doc::keykw] = neutchars(truncate_to_word(doc.meta[Doc::keykw], 300), cstr_nc); if (!doc.meta[Doc::keykw].empty()) RECORD_APPEND(record, Doc::keykw, doc.meta[Doc::keykw]); // If abstract is empty, we make up one with the beginning of the // document. This is then not indexed, but part of the doc data so // that we can return it to a query without having to decode the // original file. bool syntabs = false; // Note that the map accesses by operator[] create empty entries if they // don't exist yet. trimstring(doc.meta[Doc::keyabs], " \t\r\n"); if (doc.meta[Doc::keyabs].empty()) { syntabs = true; if (!doc.text.empty()) doc.meta[Doc::keyabs] = cstr_syntAbs + neutchars(truncate_to_word(doc.text, m_idxAbsTruncLen), cstr_nc); } else { doc.meta[Doc::keyabs] = neutchars(truncate_to_word(doc.meta[Doc::keyabs], m_idxAbsTruncLen), cstr_nc); } if (!doc.meta[Doc::keyabs].empty()) RECORD_APPEND(record, Doc::keyabs, doc.meta[Doc::keyabs]); const set& stored = m_config->getStoredFields(); for (set::const_iterator it = stored.begin(); it != stored.end(); it++) { string nm = m_config->fieldCanon(*it); if (!doc.meta[*it].empty()) { string value = neutchars(truncate_to_word(doc.meta[*it], 150), cstr_nc); RECORD_APPEND(record, nm, value); } } // If the file's md5 was computed, add value. This is optionally // used for query result duplicate elimination. string& md5 = doc.meta[Doc::keymd5]; if (!md5.empty()) { string digest; MD5HexScan(md5, digest); newdocument.add_value(VALUE_MD5, digest); } LOGDEB0(("Rcl::Db::add: new doc record:\n%s\n", record.c_str())); newdocument.set_data(record); #ifdef IDX_THREADS DbUpdTask *tp = new DbUpdTask(udi, uniterm, newdocument, doc.text.length()); if (!m_ndb->m_wqueue.put(tp)) { LOGERR(("Db::addOrUpdate:Cant queue task\n")); return false; } #else const char *fnc = udi.c_str(); string ermsg; // Add db entry or update existing entry: try { Xapian::docid did = m_ndb->xwdb.replace_document(uniterm, newdocument); if (did < updated.size()) { updated[did] = true; LOGINFO(("Db::add: docid %d updated [%s]\n", did, fnc)); } else { LOGINFO(("Db::add: docid %d added [%s]\n", did, fnc)); } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR(("Db::add: replace_document failed: %s\n", ermsg.c_str())); ermsg.erase(); // FIXME: is this ever actually needed? try { m_ndb->xwdb.add_document(newdocument); LOGDEB(("Db::add: %s added (failed re-seek for duplicate)\n", fnc)); } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR(("Db::add: add_document failed: %s\n", ermsg.c_str())); return false; } } // Test if we're over the flush threshold (limit memory usage): maybeflush(doc.text.length()); #endif // IDX_THREADS return true; } // Flush when idxflushmbs is reached bool Db::maybeflush(off_t moretext) { if (m_flushMb > 0) { m_curtxtsz += moretext; if ((m_curtxtsz - m_flushtxtsz) / MB >= m_flushMb) { LOGDEB(("Db::add/delete: txt size >= %d Mb, flushing\n", m_flushMb)); string ermsg; try { m_ndb->xwdb.flush(); } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR(("Db::add: flush() failed: %s\n", ermsg.c_str())); return false; } m_flushtxtsz = m_curtxtsz; } } return true; } // Test if doc given by udi has changed since last indexed (test sigs) bool Db::needUpdate(const string &udi, const string& sig) { if (m_ndb == 0) return false; string uniterm = make_uniterm(udi); string ermsg; // We look up the document indexed by the uniterm. This is either // the actual document file, or, for a multi-document file, the // pseudo-doc we create to stand for the file itself. // We try twice in case database needs to be reopened. for (int tries = 0; tries < 2; tries++) { try { // Get the doc or pseudo-doc Xapian::PostingIterator docid =m_ndb->xrdb.postlist_begin(uniterm); if (docid == m_ndb->xrdb.postlist_end(uniterm)) { // If no document exist with this path, we do need update LOGDEB(("Db::needUpdate:yes (new): [%s]\n", uniterm.c_str())); return true; } Xapian::Document doc = m_ndb->xrdb.get_document(*docid); // Retrieve old file/doc signature from value string osig = doc.get_value(VALUE_SIG); LOGDEB2(("Db::needUpdate: oldsig [%s] new [%s]\n", osig.c_str(), sig.c_str())); // Compare new/old sig if (sig != osig) { LOGDEB(("Db::needUpdate:yes: olsig [%s] new [%s] [%s]\n", osig.c_str(), sig.c_str(), uniterm.c_str())); // Db is not up to date. Let's index the file return true; } LOGDEB(("Db::needUpdate:no: [%s]\n", uniterm.c_str())); // Up to date. // Set the uptodate flag for doc / pseudo doc if (m_mode != DbRO) { updated[*docid] = true; // Set the existence flag for all the subdocs (if any) vector docids; if (!m_ndb->subDocs(udi, docids)) { LOGERR(("Rcl::Db::needUpdate: can't get subdocs list\n")); return true; } for (vector::iterator it = docids.begin(); it != docids.end(); it++) { if (*it < updated.size()) { LOGDEB2(("Db::needUpdate: set flag for docid %d\n", *it)); updated[*it] = true; } } } return false; } catch (const Xapian::DatabaseModifiedError &e) { LOGDEB(("Db::needUpdate: got modified error. reopen/retry\n")); m_reason = e.get_msg(); m_ndb->xrdb.reopen(); continue; } XCATCHERROR(m_reason); break; } LOGERR(("Db::needUpdate: error while checking existence: %s\n", m_reason.c_str())); return true; } // Return list of existing stem db languages list Db::getStemLangs() { LOGDEB(("Db::getStemLang\n")); list dirs; if (m_ndb == 0 || m_ndb->m_isopen == false) return dirs; dirs = StemDb::getLangs(m_basedir); return dirs; } /** * Delete stem db for given language */ bool Db::deleteStemDb(const string& lang) { LOGDEB(("Db::deleteStemDb(%s)\n", lang.c_str())); if (m_ndb == 0 || m_ndb->m_isopen == false) return false; return StemDb::deleteDb(m_basedir, lang); } /** * Create database of stem to parents associations for a given language. * We walk the list of all terms, stem them, and create another Xapian db * with documents indexed by a single term (the stem), and with the list of * parent terms in the document data. */ bool Db::createStemDb(const string& lang) { LOGDEB(("Db::createStemDb(%s)\n", lang.c_str())); if (m_ndb == 0 || m_ndb->m_isopen == false) return false; return StemDb::createDb(m_ndb->xdb(), m_basedir, lang); } /** * This is called at the end of an indexing session, to delete the * documents for files that are no longer there. This can ONLY be called * after a full file-system tree walk, else the file existence flags will * be wrong. */ bool Db::purge() { LOGDEB(("Db::purge\n")); if (m_ndb == 0) return false; LOGDEB(("Db::purge: m_isopen %d m_iswritable %d\n", m_ndb->m_isopen, m_ndb->m_iswritable)); if (m_ndb->m_isopen == false || m_ndb->m_iswritable == false) return false; #ifdef IDX_THREADS m_ndb->m_wqueue.waitIdle(); #endif // IDX_THREADS // For xapian versions up to 1.0.1, deleting a non-existant // document would trigger an exception that would discard any // pending update. This could lose both previous added documents // or deletions. Adding the flush before the delete pass ensured // that any added document would go to the index. Kept here // because it doesn't really hurt. try { m_ndb->xwdb.flush(); } catch (...) { LOGERR(("Db::purge: 1st flush failed\n")); } // Walk the document array and delete any xapian document whose // flag is not set (we did not see its source during indexing). int purgecount = 0; for (Xapian::docid docid = 1; docid < updated.size(); ++docid) { if (!updated[docid]) { if ((purgecount+1) % 100 == 0) { try { CancelCheck::instance().checkCancel(); } catch(CancelExcept) { LOGINFO(("Db::purge: partially cancelled\n")); break; } } try { if (m_flushMb > 0) { // We use an average term length of 5 for // estimating the doc sizes which is probably not // accurate but gives rough consistency with what // we do for add/update. I should fetch the doc // size from the data record, but this would be // bad for performance. Xapian::termcount trms = m_ndb->xwdb.get_doclength(docid); maybeflush(trms * 5); } m_ndb->xwdb.delete_document(docid); LOGDEB(("Db::purge: deleted document #%d\n", docid)); } catch (const Xapian::DocNotFoundError &) { LOGDEB0(("Db::purge: document #%d not found\n", docid)); } catch (const Xapian::Error &e) { LOGERR(("Db::purge: document #%d: %s\n", docid, e.get_msg().c_str())); } catch (...) { LOGERR(("Db::purge: document #%d: unknown error\n", docid)); } purgecount++; } } try { m_ndb->xwdb.flush(); } catch (...) { LOGERR(("Db::purge: 2nd flush failed\n")); } return true; } /* Delete document(s) for given unique identifier (doc and descendents) */ bool Db::purgeFile(const string &udi, bool *existed) { LOGDEB(("Db:purgeFile: [%s]\n", udi.c_str())); if (m_ndb == 0 || !m_ndb->m_iswritable) return false; #ifdef IDX_THREADS m_ndb->m_wqueue.waitIdle(); #endif // IDX_THREADS Xapian::WritableDatabase db = m_ndb->xwdb; string uniterm = make_uniterm(udi); string ermsg; try { Xapian::PostingIterator docid = db.postlist_begin(uniterm); if (docid == db.postlist_end(uniterm)) { if (existed) *existed = false; return true; } *existed = true; LOGDEB(("purgeFile: delete docid %d\n", *docid)); if (m_flushMb > 0) { Xapian::termcount trms = m_ndb->xwdb.get_doclength(*docid); maybeflush(trms * 5); } db.delete_document(*docid); vector docids; m_ndb->subDocs(udi, docids); LOGDEB(("purgeFile: subdocs cnt %d\n", docids.size())); for (vector::iterator it = docids.begin(); it != docids.end(); it++) { LOGDEB(("Db::purgeFile: delete subdoc %d\n", *it)); if (m_flushMb > 0) { Xapian::termcount trms = m_ndb->xwdb.get_doclength(*it); maybeflush(trms * 5); } db.delete_document(*it); } return true; } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR(("Db::purgeFile: %s\n", ermsg.c_str())); } return false; } // File name wild card expansion. This is a specialisation ot termMatch bool Db::filenameWildExp(const string& fnexp, list& names) { string pattern = fnexp; names.clear(); // If pattern is not capitalized, not quoted (quoted pattern can't // get here currently anyway), and has no wildcards, we add * at // each end: match any substring if (pattern[0] == '"' && pattern[pattern.size()-1] == '"') { pattern = pattern.substr(1, pattern.size() -2); } else if (pattern.find_first_of(cstr_minwilds) == string::npos && !unaciscapital(pattern)) { pattern = "*" + pattern + "*"; } // else let it be LOGDEB(("Rcl::Db::filenameWildExp: pattern: [%s]\n", pattern.c_str())); TermMatchResult result; if (!termMatch(ET_WILD, string(), pattern, result, 1000, Doc::keyfn)) return false; for (list::const_iterator it = result.entries.begin(); it != result.entries.end(); it++) names.push_back(it->term); if (names.empty()) { // Build an impossible query: we know its impossible because we // control the prefixes! names.push_back("XNONENoMatchingTerms"); } return true; } // Walk the Y terms and return min/max bool Db::maxYearSpan(int *minyear, int *maxyear) { *minyear = 1000000; *maxyear = -1000000; TermMatchResult result; if (!termMatch(ET_WILD, string(), "*", result, 5000, "xapyear")) return false; for (list::const_iterator it = result.entries.begin(); it != result.entries.end(); it++) { if (!it->term.empty()) { int year = atoi(it->term.c_str()+1); if (year < *minyear) *minyear = year; if (year > *maxyear) *maxyear = year; } } return true; } class TermMatchCmpByWcf { public: int operator()(const TermMatchEntry& l, const TermMatchEntry& r) { return r.wcf - l.wcf < 0; } }; class TermMatchCmpByTerm { public: int operator()(const TermMatchEntry& l, const TermMatchEntry& r) { return l.term.compare(r.term) > 0; } }; class TermMatchTermEqual { public: int operator()(const TermMatchEntry& l, const TermMatchEntry& r) { return !l.term.compare(r.term); } }; bool Db::stemExpand(const string &lang, const string &term, TermMatchResult& result, int max) { list dirs = m_extraDbs; dirs.push_front(m_basedir); for (list::iterator it = dirs.begin(); it != dirs.end(); it++) { list more; StemDb::stemExpand(*it, lang, term, more); LOGDEB1(("Db::stemExpand: Got %d from %s\n", more.size(), it->c_str())); result.entries.insert(result.entries.end(), more.begin(), more.end()); if (result.entries.size() >= (unsigned int)max) break; } LOGDEB1(("Db:::stemExpand: final count %d \n", result.size())); return true; } /** Add prefix to all strings in list */ static void addPrefix(list& terms, const string& prefix) { if (prefix.empty()) return; for (list::iterator it = terms.begin(); it != terms.end(); it++) it->term.insert(0, prefix); } // Characters that can begin a wildcard or regexp expression. We use skipto // to begin the allterms search with terms that begin with the portion of // the input string prior to these chars. const string cstr_wildSpecChars = "*?["; const string cstr_regSpecChars = "(.[{"; // Find all index terms that match a wildcard or regular expression bool Db::termMatch(MatchType typ, const string &lang, const string &root, TermMatchResult& res, int max, const string& field, string *prefixp ) { if (!m_ndb || !m_ndb->m_isopen) return false; Xapian::Database xdb = m_ndb->xdb(); res.clear(); XAPTRY(res.dbdoccount = xdb.get_doccount(); res.dbavgdoclen = xdb.get_avlength(), xdb, m_reason); if (!m_reason.empty()) return false; // Get rid of capitals and accents string droot; if (!unacmaybefold(root, droot, "UTF-8", true)) { LOGERR(("Db::termMatch: unac failed for [%s]\n", root.c_str())); return false; } string nochars = typ == ET_WILD ? cstr_wildSpecChars : cstr_regSpecChars; string prefix; if (!field.empty()) { const FieldTraits *ftp = 0; if (!fieldToTraits(field, &ftp) || ftp->pfx.empty()) { LOGDEB(("Db::termMatch: field is not indexed (no prefix): [%s]\n", field.c_str())); } else { prefix = ftp->pfx; } if (prefixp) *prefixp = prefix; } if (typ == ET_STEM) { if (!stemExpand(lang, root, res, max)) return false; res.entries.sort(); res.entries.unique(); for (list::iterator it = res.entries.begin(); it != res.entries.end(); it++) { XAPTRY(it->wcf = xdb.get_collection_freq(it->term); it->docs = xdb.get_termfreq(it->term), xdb, m_reason); if (!m_reason.empty()) return false; LOGDEB1(("termMatch: %d [%s]\n", it->wcf, it->term.c_str())); } if (!prefix.empty()) addPrefix(res.entries, prefix); } else { regex_t reg; int errcode; if (typ == ET_REGEXP) { string mroot = droot; if ((errcode = regcomp(®, mroot.c_str(), REG_EXTENDED|REG_NOSUB))) { char errbuf[200]; regerror(errcode, ®, errbuf, 199); LOGERR(("termMatch: regcomp failed: %s\n", errbuf)); res.entries.push_back(string(errbuf)); regfree(®); return false; } } // Find the initial section before any special char string::size_type es = droot.find_first_of(nochars); string is; switch (es) { case string::npos: is = prefix + droot; break; case 0: is = prefix; break; default: is = prefix + droot.substr(0, es); break; } LOGDEB(("termMatch: initsec: [%s]\n", is.c_str())); for (int tries = 0; tries < 2; tries++) { try { Xapian::TermIterator it = xdb.allterms_begin(); if (!is.empty()) it.skip_to(is.c_str()); for (int n = 0; it != xdb.allterms_end(); it++) { // If we're beyond the terms matching the initial // string, end if (!is.empty() && (*it).find(is) != 0) break; string term; if (!prefix.empty()) term = (*it).substr(prefix.length()); else term = *it; if (typ == ET_WILD) { if (fnmatch(droot.c_str(), term.c_str(), 0) == FNM_NOMATCH) continue; } else { if (regexec(®, term.c_str(), 0, 0, 0)) continue; } // Do we want stem expansion here? We don't do it for now res.entries.push_back(TermMatchEntry(*it, xdb.get_collection_freq(*it), it.get_termfreq())); ++n; } m_reason.erase(); break; } catch (const Xapian::DatabaseModifiedError &e) { m_reason = e.get_msg(); xdb.reopen(); continue; } XCATCHERROR(m_reason); break; } if (!m_reason.empty()) { LOGERR(("termMatch: %s\n", m_reason.c_str())); return false; } if (typ == ET_REGEXP) { regfree(®); } } TermMatchCmpByTerm tcmp; res.entries.sort(tcmp); TermMatchTermEqual teq; res.entries.unique(teq); TermMatchCmpByWcf wcmp; res.entries.sort(wcmp); if (max > 0) { res.entries.resize(MIN(res.entries.size(), (unsigned int)max)); } return true; } /** Term list walking. */ class TermIter { public: Xapian::TermIterator it; Xapian::Database db; }; TermIter *Db::termWalkOpen() { if (!m_ndb || !m_ndb->m_isopen) return 0; TermIter *tit = new TermIter; if (tit) { tit->db = m_ndb->xdb(); XAPTRY(tit->it = tit->db.allterms_begin(), tit->db, m_reason); if (!m_reason.empty()) { LOGERR(("Db::termWalkOpen: xapian error: %s\n", m_reason.c_str())); return 0; } } return tit; } bool Db::termWalkNext(TermIter *tit, string &term) { XAPTRY( if (tit && tit->it != tit->db.allterms_end()) { term = *(tit->it)++; return true; } , tit->db, m_reason); if (!m_reason.empty()) { LOGERR(("Db::termWalkOpen: xapian error: %s\n", m_reason.c_str())); } return false; } void Db::termWalkClose(TermIter *tit) { try { delete tit; } catch (...) {} } bool Db::termExists(const string& word) { if (!m_ndb || !m_ndb->m_isopen) return 0; XAPTRY(if (!m_ndb->xdb().term_exists(word)) return false, m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR(("Db::termWalkOpen: xapian error: %s\n", m_reason.c_str())); return false; } return true; } bool Db::stemDiffers(const string& lang, const string& word, const string& base) { Xapian::Stem stemmer(lang); if (!stemmer(word).compare(stemmer(base))) { LOGDEB2(("Rcl::Db::stemDiffers: same for %s and %s\n", word.c_str(), base.c_str())); return false; } return true; } bool Db::makeDocAbstract(Doc &doc, Query *query, vector& abstract) { LOGDEB1(("Db::makeDocAbstract: exti %d\n", exti)); if (!m_ndb || !m_ndb->m_isopen) { LOGERR(("Db::makeDocAbstract: no db\n")); return false; } XAPTRY(abstract = m_ndb->makeAbstract(doc.xdocid, query), m_ndb->xrdb, m_reason); return m_reason.empty() ? true : false; } bool Db::makeDocAbstract(Doc &doc, Query *query, string& abstract) { LOGDEB1(("Db::makeDocAbstract: exti %d\n", exti)); if (!m_ndb || !m_ndb->m_isopen) { LOGERR(("Db::makeDocAbstract: no db\n")); return false; } vector vab; XAPTRY(vab = m_ndb->makeAbstract(doc.xdocid, query), m_ndb->xrdb, m_reason); for (vector::const_iterator it = vab.begin(); it != vab.end(); it++) { abstract.append(*it); abstract.append(cstr_ellipsis); } return m_reason.empty() ? true : false; } // Retrieve document defined by Unique doc identifier. This is mainly used // by the GUI history feature bool Db::getDoc(const string &udi, Doc &doc) { LOGDEB(("Db:getDoc: [%s]\n", udi.c_str())); if (m_ndb == 0) return false; // Initialize what we can in any case. If this is history, caller // will make partial display in case of error doc.meta[Rcl::Doc::keyrr] = "100%"; doc.pc = 100; string uniterm = make_uniterm(udi); for (int tries = 0; tries < 2; tries++) { try { if (!m_ndb->xrdb.term_exists(uniterm)) { // Document found in history no longer in the // database. We return true (because their might be // other ok docs further) but indicate the error with // pc = -1 doc.pc = -1; LOGINFO(("Db:getDoc: no such doc in index: [%s] (len %d)\n", uniterm.c_str(), uniterm.length())); return true; } Xapian::PostingIterator docid = m_ndb->xrdb.postlist_begin(uniterm); Xapian::Document xdoc = m_ndb->xrdb.get_document(*docid); string data = xdoc.get_data(); doc.meta[Rcl::Doc::keyudi] = udi; return m_ndb->dbDataToRclDoc(*docid, data, doc); } catch (const Xapian::DatabaseModifiedError &e) { m_reason = e.get_msg(); m_ndb->xrdb.reopen(); continue; } XCATCHERROR(m_reason); break; } LOGERR(("Db::getDoc: %s\n", m_reason.c_str())); return false; } #ifndef NO_NAMESPACES } #endif recoll-1.17.3/rcldb/rcldb.h000644 001750 000000 00000025664 11740755063 016036 0ustar00dockeswheel000000 000000 /* 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 _DB_H_INCLUDED_ #define _DB_H_INCLUDED_ #include #include #include #include "cstr.h" #include "refcntr.h" #include "rcldoc.h" #include "stoplist.h" #include "rclconfig.h" #ifndef NO_NAMESPACES using std::string; using std::list; using std::vector; #endif // rcldb defines an interface for a 'real' text database. The current // implementation uses xapian only, and xapian-related code is in rcldb.cpp // If support was added for other backend, the xapian code would be moved in // rclxapian.cpp, another file would be created for the new backend, and the // configuration/compile/link code would be adjusted to allow choosing. There // is no plan for supporting multiple different backends. // // In no case does this try to implement a useful virtualized text-db interface // The main goal is simplicity and good matching to usage inside the recoll // user interface. In other words, this is not exhaustive or well-designed or // reusable. // // Unique Document Identifier: uniquely identifies a document in its // source storage (file system or other). Used for up to date checks // etc. "udi". Our user is responsible for making sure it's not too // big, cause it's stored as a Xapian term (< 150 bytes would be // reasonable) class RclConfig; #ifndef NO_NAMESPACES namespace Rcl { #endif // Omega compatible values. We leave a hole for future omega values. Not sure // it makes any sense to keep any level of omega compat given that the index // is incompatible anyway. enum value_slot { // Omega-compatible values: VALUE_LASTMOD = 0, // 4 byte big endian value - seconds since 1970. VALUE_MD5 = 1, // 16 byte MD5 checksum of original document. VALUE_SIZE = 2, // sortable_serialise() // Recoll only: VALUE_SIG = 10 // Doc sig as chosen by app (ex: mtime+size }; class SearchData; class TermIter; class Query; /** Used for returning result lists for index terms matching some criteria */ class TermMatchEntry { public: TermMatchEntry() : wcf(0) {} TermMatchEntry(const string&t, int f, int d) : term(t), wcf(f), docs(d) {} TermMatchEntry(const string&t) : term(t), wcf(0) {} bool operator==(const TermMatchEntry &o) { return term == o.term;} bool operator<(const TermMatchEntry &o) { return term < o.term;} string term; int wcf; // Total count of occurrences within collection. int docs; // Number of documents countaining term. }; class TermMatchResult { public: TermMatchResult() {clear();} void clear() {entries.clear(); dbdoccount = 0; dbavgdoclen = 0;} list entries; unsigned int dbdoccount; double dbavgdoclen; }; #ifdef IDX_THREADS extern void *DbUpdWorker(void*); #endif // IDX_THREADS /** * Wrapper class for the native database. */ class Db { public: // A place for things we don't want visible here. class Native; friend class Native; #ifdef IDX_THREADS friend void *DbUpdWorker(void*); #endif // IDX_THREADS /* General stuff (valid for query or update) ****************************/ Db(RclConfig *cfp); ~Db(); enum OpenMode {DbRO, DbUpd, DbTrunc}; enum OpenError {DbOpenNoError, DbOpenMainDb, DbOpenExtraDb}; bool open(OpenMode mode, OpenError *error = 0); bool close(); bool isopen(); /** Get explanation about last error */ string getReason() const {return m_reason;} /** List possible stemmer names */ static list getStemmerNames(); /** Test word for spelling correction candidate: not too long, no special chars... */ static bool isSpellingCandidate(const string& term) { if (term.empty() || term.length() > 50) return false; if (term.find_first_of(" !\"#$%&()*+,-./0123456789:;<=>?@[\\]^_`{|}~") != string::npos) return false; return true; } /** List existing stemming databases */ std::list getStemLangs(); #ifdef TESTING_XAPIAN_SPELL /** Return spelling suggestion */ string getSpellingSuggestion(const string& word); #endif /* The next two, only for searchdata, should be somehow hidden */ /* Return list of configured stop words */ const StopList& getStopList() const {return m_stops;} /* Field name to prefix translation (ie: author -> 'A') */ bool fieldToTraits(const string& fldname, const FieldTraits **ftpp); /* Update-related methods ******************************************/ /** Test if the db entry for the given udi is up to date (by * comparing the input and stored sigs). * Side-effect: set the existence flag for the file document * and all subdocs if any (for later use by 'purge()') */ bool needUpdate(const string &udi, const string& sig); /** Add or update document. The Doc class should have been filled as much as * possible depending on the document type. parent_udi is only * use for subdocs, else set it to empty */ bool addOrUpdate(const string &udi, const string &parent_udi, Doc &doc); /** Delete document(s) for given UDI, including subdocs */ bool purgeFile(const string &udi, bool *existed = 0); /** Remove documents that no longer exist in the file system. This * depends on the update map, which is built during * indexing (needUpdate()). * * This should only be called after a full walk of * the file system, else the update map will not be complete, and * many documents will be deleted that shouldn't, which is why this * has to be called externally, rcldb can't know if the indexing * pass was complete or partial. */ bool purge(); /** Create stem expansion database for given language. */ bool createStemDb(const string &lang); /** Delete stem expansion database for given language. */ bool deleteStemDb(const string &lang); /* Query-related methods ************************************/ /** Return total docs in db */ int docCnt(); /** Return count of docs which have an occurrence of term */ int termDocCnt(const string& term); /** Add extra database for querying */ bool addQueryDb(const string &dir); /** Remove extra database. if dir == "", remove all. */ bool rmQueryDb(const string &dir); /** Tell if directory seems to hold xapian db */ static bool testDbDir(const string &dir); /** Return a list of index terms that match the input string * Expansion is performed either with either wildcard or regexp processing * Stem expansion is performed if lang is not empty */ enum MatchType {ET_WILD, ET_REGEXP, ET_STEM}; bool termMatch(MatchType typ, const string &lang, const string &s, TermMatchResult& result, int max = -1, const string& field = cstr_null, string *prefix = 0 ); /** Return min and max years for doc mod times in db */ bool maxYearSpan(int *minyear, int *maxyear); /** Special filename wildcard to XSFN terms expansion. internal/searchdata use only */ bool filenameWildExp(const string& exp, list& names); /** Set parameters for synthetic abstract generation */ void setAbstractParams(int idxTrunc, int synthLen, int syntCtxLen); /** Build synthetic abstract for document, extracting chunks relevant for * the input query. This uses index data only (no access to the file) */ bool makeDocAbstract(Doc &doc, Query *query, string& abstract); bool makeDocAbstract(Doc &doc, Query *query, vector& abstract); /** Get document for given udi * * Used by the 'history' feature (and nothing else?) */ bool getDoc(const string &udi, Doc &doc); /* The following are mainly for the aspell module */ /** Whole term list walking. */ TermIter *termWalkOpen(); bool termWalkNext(TermIter *, string &term); void termWalkClose(TermIter *); /** Test term existence */ bool termExists(const string& term); /** Test if terms stem to different roots. */ bool stemDiffers(const string& lang, const string& term, const string& base); RclConfig *getConf() {return m_config;} /* This has to be public for access by embedded Query::Native */ Native *m_ndb; private: // Internal form of close, can be called during destruction bool i_close(bool final); RclConfig *m_config; string m_reason; // Error explanation /* Parameters cached out of the configuration files */ // This is how long an abstract we keep or build from beginning of // text when indexing. It only has an influence on the size of the // db as we are free to shorten it again when displaying int m_idxAbsTruncLen; // This is the size of the abstract that we synthetize out of query // term contexts at *query time* int m_synthAbsLen; // This is how many words (context size) we keep around query terms // when building the abstract int m_synthAbsWordCtxLen; // Flush threshold. Megabytes of text indexed before we flush. int m_flushMb; // Text bytes indexed since beginning long long m_curtxtsz; // Text bytes at last flush long long m_flushtxtsz; // Text bytes at last fsoccup check long long m_occtxtsz; // First fs occup check ? int m_occFirstCheck; // Maximum file system occupation percentage int m_maxFsOccupPc; // Database directory string m_basedir; // List of directories for additional databases to query list m_extraDbs; OpenMode m_mode; vector updated; StopList m_stops; // Reinitialize when adding/removing additional dbs bool adjustdbs(); bool stemExpand(const string &lang, const string &s, TermMatchResult& result, int max = -1); // Flush when idxflushmb is reached bool maybeflush(off_t moretext); /* Copyconst and assignemt private and forbidden */ Db(const Db &) {} Db& operator=(const Db &) {return *this;}; }; // This has to go somewhere, and as it needs the Xapian version, this is // the most reasonable place. string version_string(); extern const string pathelt_prefix; extern const string start_of_field_term; extern const string end_of_field_term; #ifndef NO_NAMESPACES } #endif // NO_NAMESPACES #endif /* _DB_H_INCLUDED_ */ recoll-1.17.3/rcldb/rcldb_p.h000644 001750 000000 00000010744 11740755063 016346 0ustar00dockeswheel000000 000000 /* Copyright (C) 2007 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 _rcldb_p_h_included_ #define _rcldb_p_h_included_ #ifdef IDX_THREADS #include "workqueue.h" #endif // IDX_THREADS #include "xapian.h" namespace Rcl { // Generic Xapian exception catching code. We do this quite often, // and I have no idea how to do this except for a macro #define XCATCHERROR(MSG) \ catch (const Xapian::Error &e) { \ MSG = e.get_msg(); \ if (MSG.empty()) MSG = "Empty error message"; \ } catch (const string &s) { \ MSG = s; \ if (MSG.empty()) MSG = "Empty error message"; \ } catch (const char *s) { \ MSG = s; \ if (MSG.empty()) MSG = "Empty error message"; \ } catch (...) { \ MSG = "Caught unknown xapian exception"; \ } #define XAPTRY(STMTTOTRY, XAPDB, ERSTR) \ for (int tries = 0; tries < 2; tries++) { \ try { \ STMTTOTRY; \ ERSTR.erase(); \ break; \ } catch (const Xapian::DatabaseModifiedError &e) { \ ERSTR = e.get_msg(); \ XAPDB.reopen(); \ continue; \ } XCATCHERROR(ERSTR); \ break; \ } class Query; #ifdef IDX_THREADS class DbUpdTask { public: DbUpdTask(const string& ud, const string& un, const Xapian::Document &d, size_t tl) : udi(ud), uniterm(un), doc(d), txtlen(tl) {} string udi; string uniterm; Xapian::Document doc; size_t txtlen; }; #endif // IDX_THREADS // A class for data and methods that would have to expose // Xapian-specific stuff if they were in Rcl::Db. There could actually be // 2 different ones for indexing or query as there is not much in // common. class Db::Native { public: Db *m_rcldb; // Parent bool m_isopen; bool m_iswritable; bool m_noversionwrite; //Set if open failed because of version mismatch! #ifdef IDX_THREADS WorkQueue m_wqueue; #endif // IDX_THREADS // Indexing Xapian::WritableDatabase xwdb; // Querying (active even if the wdb is too) Xapian::Database xrdb; // We sometimes go through the wdb for some query ops, don't // really know if this makes sense Xapian::Database& xdb() {return m_iswritable ? xwdb : xrdb;} Native(Db *db) : m_rcldb(db), m_isopen(false), m_iswritable(false), m_noversionwrite(false) #ifdef IDX_THREADS , m_wqueue(10) #endif // IDX_THREADS { } ~Native() { #ifdef IDX_THREADS if (m_iswritable) { void *status = m_wqueue.setTerminateAndWait(); LOGDEB(("Native: worker status %ld\n", long(status))); } #endif // IDX_THREADS } vector makeAbstract(Xapian::docid id, Query *query); bool dbDataToRclDoc(Xapian::docid docid, std::string &data, Doc &doc); /** Compute list of subdocuments for a given udi. We look for documents * indexed by a parent term matching the udi, the posting list for the * parentterm(udi) (As suggested by James Aylett) * * Note that this is not currently recursive: all subdocs are supposed * to be children of the file doc. * Ie: in a mail folder, all messages, attachments, attachments of * attached messages etc. must have the folder file document as * parent. * Parent-child relationships are defined by the indexer (rcldb user) * * The file-system indexer currently works this way (flatly), * subDocs() could be relatively easily changed to support full recursivity * if needed. */ bool subDocs(const string &udi, vector& docids); }; } #endif /* _rcldb_p_h_included_ */ recoll-1.17.3/rcldb/rcldoc.cpp000644 001750 000000 00000006100 11740755063 016531 0ustar00dockeswheel000000 000000 /* Copyright (C) 2007 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 "rcldoc.h" #include "debuglog.h" namespace Rcl { const string Doc::keyurl("url"); const string Doc::keyfn("filename"); const string Doc::keyipt("ipath"); const string Doc::keytp("mtype"); const string Doc::keyfmt("fmtime"); const string Doc::keydmt("dmtime"); const string Doc::keymt("mtime"); const string Doc::keyoc("origcharset"); const string Doc::keypcs("pcbytes"); const string Doc::keyfs("fbytes"); const string Doc::keyds("dbytes"); const string Doc::keysz("size"); const string Doc::keysig("sig"); const string Doc::keyrr("relevancyrating"); const string Doc::keycc("collapsecount"); const string Doc::keyabs("abstract"); const string Doc::keyau("author"); const string Doc::keytt("title"); const string Doc::keykw("keywords"); const string Doc::keymd5("md5"); const string Doc::keybcknd("rclbes"); const string Doc::keyudi("rcludi"); const string Doc::keyapptg("rclaptg"); const string Doc::keybght("beagleHitType"); void Doc::dump(bool dotext) const { LOGDEB(("Rcl::Doc::dump: url: [%s]\n", url.c_str())); LOGDEB(("Rcl::Doc::dump: utf8fn: [%s]\n", utf8fn.c_str())); LOGDEB(("Rcl::Doc::dump: ipath: [%s]\n", ipath.c_str())); LOGDEB(("Rcl::Doc::dump: mimetype: [%s]\n", mimetype.c_str())); LOGDEB(("Rcl::Doc::dump: fmtime: [%s]\n", fmtime.c_str())); LOGDEB(("Rcl::Doc::dump: dmtime: [%s]\n", dmtime.c_str())); LOGDEB(("Rcl::Doc::dump: origcharset: [%s]\n", origcharset.c_str())); LOGDEB(("Rcl::Doc::dump: syntabs: [%d]\n", syntabs)); LOGDEB(("Rcl::Doc::dump: pcbytes: [%s]\n", pcbytes.c_str())); LOGDEB(("Rcl::Doc::dump: fbytes: [%s]\n", fbytes.c_str())); LOGDEB(("Rcl::Doc::dump: dbytes: [%s]\n", dbytes.c_str())); LOGDEB(("Rcl::Doc::dump: sig: [%s]\n", sig.c_str())); LOGDEB(("Rcl::Doc::dump: pc: [%d]\n", pc)); LOGDEB(("Rcl::Doc::dump: xdocid: [%lu]\n", (unsigned long)xdocid)); for (map::const_iterator it = meta.begin(); it != meta.end(); it++) { LOGDEB(("Rcl::Doc::dump: meta[%s]: [%s]\n", (*it).first.c_str(), (*it).second.c_str())); } if (dotext) LOGDEB(("Rcl::Doc::dump: text: \n[%s]\n", text.c_str())); } } recoll-1.17.3/rcldb/rcldoc.h000644 001750 000000 00000015455 11740755063 016213 0ustar00dockeswheel000000 000000 /* 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 _RCLDOC_H_INCLUDED_ #define _RCLDOC_H_INCLUDED_ #include #include #ifndef NO_NAMESPACES using std::string; using std::map; namespace Rcl { #endif /** * Dumb holder for document attributes and data. * * This is used both for indexing, where fields are filled-up by the * indexer prior to adding to the index, and for querying, where * fields are filled from data stored in the index. Not all fields are * in use at both index and query times, and not all field data is * stored at index time (for example the "text" field is split and * indexed, but not stored as such) */ class Doc { public: //////////////////////////////////////////////////////////// // The following fields are stored into the document data record (so they // can be accessed after a query without fetching the actual document). // We indicate the routine that sets them up during indexing // Binary or url-encoded url. No transcoding: this is used to access files // Index: computed by Db::add caller. // Query: from doc data. string url; // Transcoded version of the simple file name for SFN-prefixed // specific file name indexing // Index: set by DbIndexer::processone string utf8fn; // Internal path for multi-doc files. Ascii // Set by FsIndexer::processone string ipath; // Mime type. Set by FileInterner::internfile string mimetype; // File modification time as decimal ascii unix time // Set by FsIndexer::processone string fmtime; // Data reference date (same format). Ie: mail date // Possibly set by mimetype-specific handler // Filter::metaData["modificationdate"] string dmtime; // Charset we transcoded the 'text' field from (in case we want back) // Possibly set by handler string origcharset; // A map for textual metadata like, author, keywords, abstract, // title. The entries are possibly set by the mimetype-specific // handler. If a fieldname-to-prefix translation exists, the // terms in the value will be indexed with a prefix. // Only some predefined fields are stored in the data record: // "title", "keywords", "abstract", "author", but if a field name is // in the "stored" configuration list, it will be stored too. map meta; // Attribute for the "abstract" entry. true if it is just the top // of doc, not a native document attribute. Not stored directly, but // as an indicative prefix at the beginning of the abstract (ugly hack) bool syntabs; // File size. This is the size of the compressed file or of the // external containing archive. // Index: Set by caller prior to Db::Add. // Query: not set currently (not stored) string pcbytes; // Document size, ie, size of the .odt or .xls. // Index: Set in internfile from the filter stack // Query: set from data record string fbytes; // Doc text size. // Index: from text.length(). // Query: set by rcldb from index data record string dbytes; // Doc signature. Used for up to date checks. // Index: set by Db::Add caller. Query: set from doc data. // This is opaque to rcldb, and could just as well be ctime, size, // ctime+size, md5, whatever. string sig; ///////////////////////////////////////////////// // The following fields don't go to the db record, so they can't // be retrieved at query time // Main document text. This is plaintext utf-8 text to be split // and indexed string text; int pc; // relevancy percentage, used by sortseq, convenience unsigned long xdocid; // Opaque: rcldb doc identifier. /////////////////////////////////////////////////////////////////// void erase() { url.erase(); utf8fn.erase(); ipath.erase(); mimetype.erase(); fmtime.erase(); dmtime.erase(); origcharset.erase(); meta.clear(); syntabs = false; pcbytes.erase(); fbytes.erase(); dbytes.erase(); sig.erase(); text.erase(); pc = 0; xdocid = 0; } /** Get value for named field. If value pointer is 0, just test existence */ bool getmeta(const string& nm, string *value = 0) const { map::const_iterator it = meta.find(nm); if (it != meta.end()) { if (value) *value = it->second; return true; } else { return false; } } void dump(bool dotext=false) const; // The official names for recoll native fields when used in a text // context (ie: the python interface duplicates some of the fixed // fields in the meta array, these are the names used). Defined in // rcldoc.cpp. For fields stored in the meta[] array (ie, title, // author), filters _must_ use these values static const string keyurl; // url static const string keyfn; // file name static const string keyipt; // ipath static const string keytp; // mime type static const string keyfmt; // file mtime static const string keydmt; // document mtime static const string keymt; // mtime dmtime if set else fmtime static const string keyoc; // original charset static const string keypcs; // document outer container size static const string keyfs; // document size static const string keyds; // document text size static const string keysz; // dbytes if set else fbytes else pcbytes static const string keysig; // sig static const string keyrr; // relevancy rating static const string keycc; // Collapse count static const string keyabs; // abstract static const string keyau; // author static const string keytt; // title static const string keykw; // keywords static const string keymd5; // file md5 checksum static const string keybcknd; // backend type for data not from the filesys // udi back from index. Only set by Rcl::Query::getdoc(). static const string keyudi; static const string keyapptg; // apptag. Set from localfields (fsindexer) static const string keybght; // beagle hit type ("beagleHitType") }; #ifndef NO_NAMESPACES } #endif #endif /* _RCLDOC_H_INCLUDED_ */ recoll-1.17.3/rcldb/rclquery.cpp000644 001750 000000 00000031431 11740755063 017136 0ustar00dockeswheel000000 000000 /* Copyright (C) 2008 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 #include #include "xapian.h" #include "cstr.h" #include "rclconfig.h" #include "debuglog.h" #include "rcldb.h" #include "rcldb_p.h" #include "rclquery.h" #include "rclquery_p.h" #include "conftree.h" #include "smallut.h" #include "searchdata.h" #include "unacpp.h" #ifndef NO_NAMESPACES namespace Rcl { #endif // Field names inside the index data record may differ from the rcldoc ones // (esp.: caption / title) static const string& docfToDatf(const string& df) { if (!df.compare(Doc::keytt)) { return cstr_caption; } else if (!df.compare(Doc::keymt)) { return cstr_dmtime; } else { return df; } } // Sort helper class. As Xapian sorting is lexicographic, we do some // special processing for special fields like dates and sizes. User // custom field data will have to be processed before insertion to // achieve equivalent results. class QSorter : public Xapian::Sorter { public: QSorter(const string& f) : m_fld(docfToDatf(f) + "=") { m_ismtime = !m_fld.compare("dmtime="); m_issize = !m_fld.compare("fbytes=") || !m_fld.compare("dbytes=") || !m_fld.compare("pcbytes="); } virtual std::string operator()(const Xapian::Document& xdoc) const { string data = xdoc.get_data(); // It would be simpler to do the record->Rcl::Doc thing, but // hand-doing this will be faster. It makes more assumptions // about the format than a ConfTree though: string::size_type i1, i2; i1 = data.find(m_fld); if (i1 == string::npos) { if (m_ismtime) { // Ugly: specialcase mtime as it's either dmtime or fmtime i1 = data.find("fmtime="); if (i1 == string::npos) { return string(); } } else { return string(); } } i1 += m_fld.length(); if (i1 >= data.length()) return string(); i2 = data.find_first_of("\n\r", i1); if (i2 == string::npos) return string(); string term = data.substr(i1, i2-i1); if (m_ismtime) { return term; } else if (m_issize) { // Left zeropad values for appropriate numeric sorting leftzeropad(term, 12); return term; } // Process data for better sorting. We should actually do the // unicode thing // (http://unicode.org/reports/tr10/#Introduction), but just // removing accents and majuscules will remove the most // glaring weirdnesses (or not, depending on your national // approach to collating...) string sortterm; // We're not even sure the term is utf8 here (ie: url) if (!unacmaybefold(term, sortterm, "UTF-8", true)) { sortterm = term; } // Also remove some common uninteresting starting characters i1 = sortterm.find_first_not_of(" \t\\\"'([*+,.#/"); if (i1 != 0 && i1 != string::npos) { sortterm = sortterm.substr(i1, sortterm.size()-i1); } LOGDEB2(("QSorter: [%s] -> [%s]\n", term.c_str(), sortterm.c_str())); return sortterm; } private: string m_fld; bool m_ismtime; bool m_issize; }; Query::Query(Db *db) : m_nq(new Native(this)), m_db(db), m_sorter(0), m_sortAscending(true), m_collapseDuplicates(false), m_resCnt(-1) { } Query::~Query() { deleteZ(m_nq); if (m_sorter) { delete (QSorter*)m_sorter; m_sorter = 0; } } string Query::getReason() const { return m_reason; } Db *Query::whatDb() { return m_db; } void Query::setSortBy(const string& fld, bool ascending) { if (fld.empty()) { m_sortField.erase(); } else { m_sortField = m_db->getConf()->fieldCanon(fld); m_sortAscending = ascending; } LOGDEB0(("RclQuery::setSortBy: [%s] %s\n", m_sortField.c_str(), m_sortAscending ? "ascending" : "descending")); } //#define ISNULL(X) (X).isNull() #define ISNULL(X) !(X) // Prepare query out of user search data bool Query::setQuery(RefCntr sdata) { LOGDEB(("Query::setQuery:\n")); if (!m_db || ISNULL(m_nq)) { LOGERR(("Query::setQuery: not initialised!\n")); return false; } m_resCnt = -1; m_reason.erase(); m_nq->clear(); Xapian::Query xq; if (!sdata->toNativeQuery(*m_db, &xq)) { m_reason += sdata->getReason(); return false; } m_nq->xquery = xq; string d; for (int tries = 0; tries < 2; tries++) { try { m_nq->xenquire = new Xapian::Enquire(m_db->m_ndb->xrdb); if (m_collapseDuplicates) { m_nq->xenquire->set_collapse_key(Rcl::VALUE_MD5); } else { m_nq->xenquire->set_collapse_key(Xapian::BAD_VALUENO); } m_nq->xenquire->set_docid_order(Xapian::Enquire::DONT_CARE); if (!m_sortField.empty()) { if (m_sorter) { delete (QSorter*)m_sorter; m_sorter = 0; } m_sorter = new QSorter(m_sortField); // It really seems there is a xapian bug about sort order, we // invert here. m_nq->xenquire->set_sort_by_key((QSorter*)m_sorter, !m_sortAscending); } m_nq->xenquire->set_query(m_nq->xquery); m_nq->xmset = Xapian::MSet(); // Get the query description and trim the "Xapian::Query" d = m_nq->xquery.get_description(); m_reason.erase(); break; } catch (const Xapian::DatabaseModifiedError &e) { m_reason = e.get_msg(); m_db->m_ndb->xrdb.reopen(); continue; } XCATCHERROR(m_reason); break; } if (!m_reason.empty()) { LOGDEB(("Query::SetQuery: xapian error %s\n", m_reason.c_str())); return false; } if (d.find("Xapian::Query") == 0) d.erase(0, strlen("Xapian::Query")); sdata->setDescription(d); LOGDEB(("Query::SetQuery: Q: %s\n", sdata->getDescription().c_str())); return true; } bool Query::getQueryTerms(list& terms) { if (ISNULL(m_nq)) return false; terms.clear(); Xapian::TermIterator it; string ermsg; try { for (it = m_nq->xquery.get_terms_begin(); it != m_nq->xquery.get_terms_end(); it++) { terms.push_back(*it); } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR(("getQueryTerms: xapian error: %s\n", ermsg.c_str())); return false; } return true; } bool Query::getMatchTerms(const Doc& doc, list& terms) { return getMatchTerms(doc.xdocid, terms); } bool Query::getMatchTerms(unsigned long xdocid, list& terms) { if (ISNULL(m_nq) || !m_nq->xenquire) { LOGERR(("Query::getMatchTerms: no query opened\n")); return -1; } terms.clear(); Xapian::TermIterator it; Xapian::docid id = Xapian::docid(xdocid); XAPTRY(terms.insert(terms.begin(), m_nq->xenquire->get_matching_terms_begin(id), m_nq->xenquire->get_matching_terms_end(id)), m_db->m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR(("getQueryTerms: xapian error: %s\n", m_reason.c_str())); return false; } return true; } // Mset size static const int qquantum = 50; // Get estimated result count for query. Xapian actually does most of // the search job in there, this can be long int Query::getResCnt() { if (ISNULL(m_nq) || !m_nq->xenquire) { LOGERR(("Query::getResCnt: no query opened\n")); return -1; } if (m_resCnt >= 0) return m_resCnt; m_resCnt = -1; if (m_nq->xmset.size() <= 0) { Chrono chron; XAPTRY(m_nq->xmset = m_nq->xenquire->get_mset(0, qquantum, 1000); m_resCnt = m_nq->xmset.get_matches_lower_bound(), m_db->m_ndb->xrdb, m_reason); LOGDEB(("Query::getResCnt: %d mS\n", chron.millis())); if (!m_reason.empty()) LOGERR(("xenquire->get_mset: exception: %s\n", m_reason.c_str())); } else { m_resCnt = m_nq->xmset.get_matches_lower_bound(); } return m_resCnt; } // Get document at rank xapi in query results. We check if the // current mset has the doc, else ask for an other one. We use msets // of qquantum documents. // // Note that as stated by a Xapian developer, Enquire searches from // scratch each time get_mset() is called. So the better performance // on subsequent calls is probably only due to disk caching. bool Query::getDoc(int xapi, Doc &doc) { LOGDEB1(("Query::getDoc: xapian enquire index %d\n", xapi)); if (ISNULL(m_nq) || !m_nq->xenquire) { LOGERR(("Query::getDoc: no query opened\n")); return false; } int first = m_nq->xmset.get_firstitem(); int last = first + m_nq->xmset.size() -1; if (!(xapi >= first && xapi <= last)) { LOGDEB(("Fetching for first %d, count %d\n", xapi, qquantum)); XAPTRY(m_nq->xmset = m_nq->xenquire->get_mset(xapi, qquantum, (const Xapian::RSet *)0), m_db->m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR(("enquire->get_mset: exception: %s\n", m_reason.c_str())); return false; } if (m_nq->xmset.empty()) { LOGDEB(("enquire->get_mset: got empty result\n")); return false; } first = m_nq->xmset.get_firstitem(); last = first + m_nq->xmset.size() -1; } LOGDEB1(("Query::getDoc: Qry [%s] win [%d-%d] Estimated results: %d", m_nq->query.get_description().c_str(), first, last, m_nq->xmset.get_matches_lower_bound())); Xapian::Document xdoc; Xapian::docid docid = 0; int pc = 0; int collapsecount = 0; string data; string udi; m_reason.erase(); for (int xaptries=0; xaptries < 2; xaptries++) { try { xdoc = m_nq->xmset[xapi-first].get_document(); collapsecount = m_nq->xmset[xapi-first].get_collapse_count(); docid = *(m_nq->xmset[xapi-first]); pc = m_nq->xmset.convert_to_percent(m_nq->xmset[xapi-first]); data = xdoc.get_data(); m_reason.erase(); Chrono chron; Xapian::TermIterator it = xdoc.termlist_begin(); it.skip_to("Q"); if (it != xdoc.termlist_end()) { udi = *it; if (!udi.empty()) udi = udi.substr(1); } LOGDEB2(("Query::getDoc: %d ms for udi [%s], collapse count %d\n", chron.millis(), udi.c_str(), collapsecount)); break; } catch (Xapian::DatabaseModifiedError &error) { // retry or end of loop m_reason = error.get_msg(); continue; } XCATCHERROR(m_reason); break; } if (!m_reason.empty()) { LOGERR(("Query::getDoc: %s\n", m_reason.c_str())); return false; } doc.meta[Rcl::Doc::keyudi] = udi; doc.pc = pc; char buf[200]; if (collapsecount>0) { sprintf(buf,"%3d%% (%d)", pc, collapsecount+1); } else { sprintf(buf,"%3d%%", pc); } doc.meta[Doc::keyrr] = buf; sprintf(buf, "%d", collapsecount); doc.meta[Rcl::Doc::keycc] = buf; // Parse xapian document's data and populate doc fields return m_db->m_ndb->dbDataToRclDoc(docid, data, doc); } list Query::expand(const Doc &doc) { LOGDEB(("Rcl::Query::expand()\n")); list res; if (ISNULL(m_nq) || !m_nq->xenquire) { LOGERR(("Query::expand: no query opened\n")); return res; } for (int tries = 0; tries < 2; tries++) { try { Xapian::RSet rset; rset.add_document(Xapian::docid(doc.xdocid)); // We don't exclude the original query terms. Xapian::ESet eset = m_nq->xenquire->get_eset(20, rset, false); LOGDEB(("ESet terms:\n")); // We filter out the special terms for (Xapian::ESetIterator it = eset.begin(); it != eset.end(); it++) { LOGDEB((" [%s]\n", (*it).c_str())); if ((*it).empty() || ((*it).at(0)>='A' && (*it).at(0)<='Z')) continue; res.push_back(*it); if (res.size() >= 10) break; } m_reason.erase(); break; } catch (const Xapian::DatabaseModifiedError &e) { m_reason = e.get_msg(); m_db->m_ndb->xrdb.reopen(); continue; } XCATCHERROR(m_reason); break; } if (!m_reason.empty()) { LOGERR(("Query::expand: xapian error %s\n", m_reason.c_str())); res.clear(); } return res; } } recoll-1.17.3/rcldb/rclquery.h000644 001750 000000 00000006163 11740755063 016607 0ustar00dockeswheel000000 000000 /* Copyright (C) 2008 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 _rclquery_h_included_ #define _rclquery_h_included_ #include #include #include #ifndef NO_NAMESPACES using std::string; using std::list; using std::vector; #endif #include "refcntr.h" #ifndef NO_NAMESPACES namespace Rcl { #endif class SearchData; class Db; class Doc; /** * An Rcl::Query is a question (SearchData) applied to a * database. Handles access to the results. Somewhat equivalent to a * cursor in an rdb. * */ class Query { public: /** The constructor only allocates memory */ Query(Db *db); ~Query(); /** Get explanation about last error */ string getReason() const; /** Choose sort order. Must be called before setQuery */ void setSortBy(const string& fld, bool ascending = true); const string& getSortBy() const {return m_sortField;} bool getSortAscending() const {return m_sortAscending;} /** Return or filter results with identical content checksum */ void setCollapseDuplicates(bool on) {m_collapseDuplicates = on;} /** Accept data describing the search and query the index. This can * be called repeatedly on the same object which gets reinitialized each * time. */ bool setQuery(RefCntr q); /** Get results count for current query */ int getResCnt(); /** Get document at rank i in current query results. */ bool getDoc(int i, Doc &doc); /** Get possibly expanded list of query terms */ bool getQueryTerms(list& terms); /** Return a list of terms which matched for a specific result document */ bool getMatchTerms(const Doc& doc, list& terms); bool getMatchTerms(unsigned long xdocid, list& terms); /** Expand query to look for documents like the one passed in */ list expand(const Doc &doc); /** Return the Db we're set for */ Db *whatDb(); /* make this public for access from embedded Db::Native */ class Native; Native *m_nq; private: string m_reason; // Error explanation Db *m_db; void *m_sorter; string m_sortField; bool m_sortAscending; bool m_collapseDuplicates; int m_resCnt; /* Copyconst and assignement private and forbidden */ Query(const Query &) {} Query & operator=(const Query &) {return *this;}; }; #ifndef NO_NAMESPACES } #endif // NO_NAMESPACES #endif /* _rclquery_h_included_ */ recoll-1.17.3/rcldb/rclquery_p.h000644 001750 000000 00000003141 11740755063 017117 0ustar00dockeswheel000000 000000 /* Copyright (C) 2007 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 _rclquery_p_h_included_ #define _rclquery_p_h_included_ #include #include using std::map; using std::vector; #include #include "rclquery.h" namespace Rcl { class Query::Native { public: /** The query I belong to */ Query *m_q; /** query descriptor: terms and subqueries joined by operators * (or/and etc...) */ Xapian::Query xquery; Xapian::Enquire *xenquire; // Open query descriptor. Xapian::MSet xmset; // Partial result set // Term frequencies for current query. See makeAbstract, setQuery map termfreqs; Native(Query *q) : m_q(q), xenquire(0) { } ~Native() { clear(); } void clear() { delete xenquire; xenquire = 0; termfreqs.clear(); } }; } #endif /* _rclquery_p_h_included_ */ recoll-1.17.3/rcldb/searchdata.cpp000644 001750 000000 00000110745 11740755063 017375 0ustar00dockeswheel000000 000000 /* 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. */ // Handle translation from rcl's SearchData structures to Xapian Queries #include #include #include #include #include #include "xapian.h" #include "cstr.h" #include "rcldb.h" #include "searchdata.h" #include "debuglog.h" #include "smallut.h" #include "textsplit.h" #include "unacpp.h" #include "utf8iter.h" #include "stoplist.h" #include "rclconfig.h" #include "termproc.h" #ifndef NO_NAMESPACES using namespace std; namespace Rcl { #endif typedef vector::iterator qlist_it_t; typedef vector::const_iterator qlist_cit_t; static const int original_term_wqf_booster = 10; /* The dates-to-query routine is is lifted quasi-verbatim but * modified from xapian-omega:date.cc. Copyright info: * * Copyright 1999,2000,2001 BrightStation PLC * Copyright 2001 James Aylett * Copyright 2001,2002 Ananova Ltd * Copyright 2002 Intercede 1749 Ltd * Copyright 2002,2003,2006 Olly Betts * * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ static Xapian::Query date_range_filter(int y1, int m1, int d1, int y2, int m2, int d2) { // Xapian uses a smallbuf and snprintf. Can't be bothered, we're // only doing %d's ! char buf[200]; sprintf(buf, "D%04d%02d", y1, m1); vector v; int d_last = monthdays(m1, y1); int d_end = d_last; if (y1 == y2 && m1 == m2 && d2 < d_last) { d_end = d2; } // Deal with any initial partial month if (d1 > 1 || d_end < d_last) { for ( ; d1 <= d_end ; d1++) { sprintf(buf + 7, "%02d", d1); v.push_back(Xapian::Query(buf)); } } else { buf[0] = 'M'; v.push_back(Xapian::Query(buf)); } if (y1 == y2 && m1 == m2) { return Xapian::Query(Xapian::Query::OP_OR, v.begin(), v.end()); } int m_last = (y1 < y2) ? 12 : m2 - 1; while (++m1 <= m_last) { sprintf(buf + 5, "%02d", m1); buf[0] = 'M'; v.push_back(Xapian::Query(buf)); } if (y1 < y2) { while (++y1 < y2) { sprintf(buf + 1, "%04d", y1); buf[0] = 'Y'; v.push_back(Xapian::Query(buf)); } sprintf(buf + 1, "%04d", y2); buf[0] = 'M'; for (m1 = 1; m1 < m2; m1++) { sprintf(buf + 5, "%02d", m1); v.push_back(Xapian::Query(buf)); } } sprintf(buf + 5, "%02d", m2); // Deal with any final partial month if (d2 < monthdays(m2, y2)) { buf[0] = 'D'; for (d1 = 1 ; d1 <= d2; d1++) { sprintf(buf + 7, "%02d", d1); v.push_back(Xapian::Query(buf)); } } else { buf[0] = 'M'; v.push_back(Xapian::Query(buf)); } return Xapian::Query(Xapian::Query::OP_OR, v.begin(), v.end()); } // Expand categories and mime type wild card exps // Actually, using getAllMimeTypes() here is a bit problematic because // there maybe other types in the index, not indexed by content, but // which could be searched by file name. It would probably be // preferable to do a termMatch() on field "mtype", which would // retrieve all values from the index. bool SearchData::expandFileTypes(RclConfig *cfg, vector& tps) { if (!cfg) { LOGFATAL(("Db::expandFileTypes: null configuration!!\n")); return false; } vector exptps; list alltypes = cfg->getAllMimeTypes(); for (vector::iterator it = tps.begin(); it != tps.end(); it++) { if (cfg->isMimeCategory(*it)) { listtps; cfg->getMimeCatTypes(*it, tps); exptps.insert(exptps.end(), tps.begin(), tps.end()); } else { for (list::const_iterator ait = alltypes.begin(); ait != alltypes.end(); ait++) { if (fnmatch(it->c_str(), ait->c_str(), FNM_CASEFOLD) != FNM_NOMATCH) { exptps.push_back(*ait); } } } } tps = exptps; return true; } bool SearchData::toNativeQuery(Rcl::Db &db, void *d) { LOGDEB2(("SearchData::toNativeQuery: stemlang [%s]\n", m_stemlang.c_str())); Xapian::Query xq; m_reason.erase(); // Walk the clause list translating each in turn and building the // Xapian query tree for (qlist_it_t it = m_query.begin(); it != m_query.end(); it++) { Xapian::Query nq; if (!(*it)->toNativeQuery(db, &nq, m_stemlang)) { LOGERR(("SearchData::toNativeQuery: failed\n")); m_reason = (*it)->getReason(); return false; } if (nq.empty()) { LOGDEB(("SearchData::toNativeQuery: skipping empty clause\n")); continue; } // If this structure is an AND list, must use AND_NOT for excl clauses. // Else this is an OR list, and there can't be excl clauses (checked by // addClause()) Xapian::Query::op op; if (m_tp == SCLT_AND) { if ((*it)->m_tp == SCLT_EXCL) { op = Xapian::Query::OP_AND_NOT; } else { op = Xapian::Query::OP_AND; } } else { op = Xapian::Query::OP_OR; } if (xq.empty()) { if (op == Xapian::Query::OP_AND_NOT) xq = Xapian::Query(op, Xapian::Query::MatchAll, nq); else xq = nq; } else { xq = Xapian::Query(op, xq, nq); } } if (xq.empty()) xq = Xapian::Query::MatchAll; if (m_haveDates) { // If one of the extremities is unset, compute db extremas if (m_dates.y1 == 0 || m_dates.y2 == 0) { int minyear = 1970, maxyear = 2100; if (!db.maxYearSpan(&minyear, &maxyear)) { LOGERR(("Can't retrieve index min/max dates\n")); //whatever, go on. } if (m_dates.y1 == 0) { m_dates.y1 = minyear; m_dates.m1 = 1; m_dates.d1 = 1; } if (m_dates.y2 == 0) { m_dates.y2 = maxyear; m_dates.m2 = 12; m_dates.d2 = 31; } } LOGDEB(("Db::toNativeQuery: date interval: %d-%d-%d/%d-%d-%d\n", m_dates.y1, m_dates.m1, m_dates.d1, m_dates.y2, m_dates.m2, m_dates.d2)); Xapian::Query dq = date_range_filter(m_dates.y1, m_dates.m1, m_dates.d1, m_dates.y2, m_dates.m2, m_dates.d2); if (dq.empty()) { LOGINFO(("Db::toNativeQuery: date filter is empty\n")); } // If no probabilistic query is provided then promote the daterange // filter to be THE query instead of filtering an empty query. if (xq.empty()) { LOGINFO(("Db::toNativeQuery: proba query is empty\n")); xq = dq; } else { xq = Xapian::Query(Xapian::Query::OP_FILTER, xq, dq); } } if (m_minSize != size_t(-1) || m_maxSize != size_t(-1)) { Xapian::Query sq; char min[50], max[50]; sprintf(min, "%lld", (long long)m_minSize); sprintf(max, "%lld", (long long)m_maxSize); if (m_minSize == size_t(-1)) { string value(max); leftzeropad(value, 12); sq = Xapian::Query(Xapian::Query::OP_VALUE_LE, VALUE_SIZE, value); } else if (m_maxSize == size_t(-1)) { string value(min); leftzeropad(value, 12); sq = Xapian::Query(Xapian::Query::OP_VALUE_GE, VALUE_SIZE, value); } else { string minvalue(min); leftzeropad(minvalue, 12); string maxvalue(max); leftzeropad(maxvalue, 12); sq = Xapian::Query(Xapian::Query::OP_VALUE_RANGE, VALUE_SIZE, minvalue, maxvalue); } // If no probabilistic query is provided then promote the // filter to be THE query instead of filtering an empty query. if (xq.empty()) { LOGINFO(("Db::toNativeQuery: proba query is empty\n")); xq = sq; } else { xq = Xapian::Query(Xapian::Query::OP_FILTER, xq, sq); } } // Add the file type filtering clause if any if (!m_filetypes.empty()) { expandFileTypes(db.getConf(), m_filetypes); Xapian::Query tq; for (vector::iterator it = m_filetypes.begin(); it != m_filetypes.end(); it++) { string term = "T" + *it; LOGDEB0(("Adding file type term: [%s]\n", term.c_str())); tq = tq.empty() ? Xapian::Query(term) : Xapian::Query(Xapian::Query::OP_OR, tq, Xapian::Query(term)); } xq = xq.empty() ? tq : Xapian::Query(Xapian::Query::OP_FILTER, xq, tq); } // Add the neg file type filtering clause if any if (!m_nfiletypes.empty()) { expandFileTypes(db.getConf(), m_nfiletypes); Xapian::Query tq; for (vector::iterator it = m_nfiletypes.begin(); it != m_nfiletypes.end(); it++) { string term = "T" + *it; LOGDEB0(("Adding negative file type term: [%s]\n", term.c_str())); tq = tq.empty() ? Xapian::Query(term) : Xapian::Query(Xapian::Query::OP_OR, tq, Xapian::Query(term)); } xq = xq.empty() ? tq : Xapian::Query(Xapian::Query::OP_AND_NOT, xq, tq); } // Add the directory filtering clause. This is a phrase of terms // prefixed with the pathelt prefix XP if (!m_topdir.empty()) { vector vpath; stringToTokens(m_topdir, vpath, "/"); vector pvpath; if (m_topdir[0] == '/') pvpath.push_back(pathelt_prefix); for (vector::const_iterator it = vpath.begin(); it != vpath.end(); it++){ pvpath.push_back(pathelt_prefix + *it); } Xapian::Query::op tdop; if (m_topdirweight == 1.0) { tdop = m_topdirexcl ? Xapian::Query::OP_AND_NOT : Xapian::Query::OP_FILTER; } else { tdop = m_topdirexcl ? Xapian::Query::OP_AND_NOT : Xapian::Query::OP_AND_MAYBE; } Xapian::Query tdq = Xapian::Query(Xapian::Query::OP_PHRASE, pvpath.begin(), pvpath.end()); if (m_topdirweight != 1.0) tdq = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, tdq, m_topdirweight); xq = Xapian::Query(tdop, xq, tdq); } *((Xapian::Query *)d) = xq; return true; } // This is called by the GUI simple search if the option is set: add // (OR) phrase to a query (if it is simple enough) so that results // where the search terms are close and in order will come up on top. // We remove very common terms from the query to avoid performance issues. bool SearchData::maybeAddAutoPhrase(Rcl::Db& db, double freqThreshold) { LOGDEB0(("SearchData::maybeAddAutoPhrase()\n")); if (!m_query.size()) { LOGDEB2(("SearchData::maybeAddAutoPhrase: empty query\n")); return false; } string field; list words; // Walk the clause list. If we find any non simple clause or different // field names, bail out. for (qlist_it_t it = m_query.begin(); it != m_query.end(); it++) { SClType tp = (*it)->m_tp; if (tp != SCLT_AND && tp != SCLT_OR) { LOGDEB2(("SearchData::maybeAddAutoPhrase: rejected clause\n")); return false; } SearchDataClauseSimple *clp = dynamic_cast(*it); if (clp == 0) { LOGDEB2(("SearchData::maybeAddAutoPhrase: dyncast failed\n")); return false; } if (it == m_query.begin()) { field = clp->getfield(); } else { if (clp->getfield().compare(field)) { LOGDEB2(("SearchData::maybeAddAutoPhrase: diff. fields\n")); return false; } } // If there are wildcards or quotes in there, bail out if (clp->gettext().find_first_of("\"*[?") != string::npos) { LOGDEB2(("SearchData::maybeAddAutoPhrase: wildcards\n")); return false; } // Do a simple word-split here, don't bother with the full-blown // textsplit. The autophrase thing is just "best effort", it's // normal that it won't work in strange cases. vector wl; stringToStrings(clp->gettext(), wl); words.insert(words.end(), wl.begin(), wl.end()); } // Trim the word list by eliminating very frequent terms // (increasing the slack as we do it): int slack = 0; int doccnt = db.docCnt(); if (!doccnt) doccnt = 1; string swords; for (list::iterator it = words.begin(); it != words.end(); it++) { double freq = double(db.termDocCnt(*it)) / doccnt; if (freq < freqThreshold) { if (!swords.empty()) swords.append(1, ' '); swords += *it; } else { LOGDEB0(("Autophrase: [%s] too frequent (%.2f %%)\n", it->c_str(), 100 * freq)); slack++; } } // We can't make a phrase with a single word :) int nwords = TextSplit::countWords(swords); if (nwords <= 1) { LOGDEB2(("SearchData::maybeAddAutoPhrase: ended with 1 word\n")); return false; } // Increase the slack: we want to be a little more laxist than for // an actual user-entered phrase slack += 1 + nwords / 3; SearchDataClauseDist *nclp = new SearchDataClauseDist(SCLT_PHRASE, swords, slack, field); // If the toplevel conjunction is an OR, just OR the phrase, else // deepen the tree. if (m_tp == SCLT_OR) { addClause(nclp); } else { // My type is AND. Change it to OR and insert two queries, one // being the original query as a subquery, the other the // phrase. SearchData *sd = new SearchData(m_tp); sd->m_query = m_query; sd->m_stemlang = m_stemlang; m_tp = SCLT_OR; m_query.clear(); SearchDataClauseSub *oq = new SearchDataClauseSub(SCLT_OR, RefCntr(sd)); addClause(oq); addClause(nclp); } return true; } // Add clause to current list. OR lists cant have EXCL clauses. bool SearchData::addClause(SearchDataClause* cl) { if (m_tp == SCLT_OR && (cl->m_tp == SCLT_EXCL)) { LOGERR(("SearchData::addClause: cant add EXCL to OR list\n")); m_reason = "No Negative (AND_NOT) clauses allowed in OR queries"; return false; } cl->setParent(this); m_haveWildCards = m_haveWildCards || cl->m_haveWildCards; m_query.push_back(cl); return true; } // Make me all new void SearchData::erase() { LOGDEB0(("SearchData::erase\n")); m_tp = SCLT_AND; for (qlist_it_t it = m_query.begin(); it != m_query.end(); it++) delete *it; m_query.clear(); m_filetypes.clear(); m_topdir.erase(); m_topdirexcl = false; m_description.erase(); m_reason.erase(); m_haveDates = false; m_minSize = size_t(-1); m_maxSize = size_t(-1); } // Am I a file name only search ? This is to turn off term highlighting bool SearchData::fileNameOnly() { for (qlist_it_t it = m_query.begin(); it != m_query.end(); it++) if (!(*it)->isFileName()) return false; return true; } // Extract all terms and term groups bool SearchData::getTerms(vector& terms, vector >& groups, vector& gslks) const { for (qlist_cit_t it = m_query.begin(); it != m_query.end(); it++) (*it)->getTerms(terms, groups, gslks); return true; } // Extract user terms void SearchData::getUTerms(vector& terms) const { for (qlist_cit_t it = m_query.begin(); it != m_query.end(); it++) (*it)->getUTerms(terms); sort(terms.begin(), terms.end()); vector::iterator it = unique(terms.begin(), terms.end()); terms.erase(it, terms.end()); } // Splitter callback for breaking a user string into simple terms and // phrases. This is for parts of the user entry which would appear as // a single word because there is no white space inside, but are // actually multiple terms to rcldb (ie term1,term2) class TextSplitQ : public TextSplitP { public: TextSplitQ(Flags flags, const StopList &_stops, TermProc *prc) : TextSplitP(prc, flags), curnostemexp(false), stops(_stops), alltermcount(0), lastpos(0) {} bool takeword(const std::string &term, int pos, int bs, int be) { // Check if the first letter is a majuscule in which // case we do not want to do stem expansion. Need to do this // before unac of course... curnostemexp = unaciscapital(term); return TextSplitP::takeword(term, pos, bs, be); } bool curnostemexp; vector terms; vector nostemexps; const StopList &stops; // Count of terms including stopwords: this is for adjusting // phrase/near slack int alltermcount; int lastpos; }; class TermProcQ : public TermProc { public: TermProcQ() : TermProc(0), m_ts(0) {} void setTSQ(TextSplitQ *ts) {m_ts = ts;} bool takeword(const std::string &term, int pos, int bs, int be) { m_ts->alltermcount++; if (m_ts->lastpos < pos) m_ts->lastpos = pos; bool noexpand = be ? m_ts->curnostemexp : true; LOGDEB(("TermProcQ::takeword: pushing [%s] pos %d noexp %d\n", term.c_str(), pos, noexpand)); if (m_terms[pos].size() < term.size()) { m_terms[pos] = term; m_nste[pos] = noexpand; } return true; } bool flush() { for (map::const_iterator it = m_terms.begin(); it != m_terms.end(); it++) { m_ts->terms.push_back(it->second); m_ts->nostemexps.push_back(m_nste[it->first]); } return true; } private: TextSplitQ *m_ts; map m_terms; map m_nste; }; // A class used to translate a user compound string (*not* a query // language string) as may be entered in any_terms/all_terms search // entry fields, ex: [term1 "a phrase" term3] into a xapian query // tree. // The object keeps track of the query terms and term groups while // translating. class StringToXapianQ { public: StringToXapianQ(Db& db, const string& field, const string &stmlng, bool boostUser) : m_db(db), m_field(field), m_stemlang(stmlng), m_doBoostUserTerms(boostUser) { } bool processUserString(const string &iq, string &ermsg, list &pqueries, const StopList &stops, int slack = 0, bool useNear = false); // After processing the string: return search terms and term // groups (ie: for highlighting) bool getTerms(vector& terms, vector >& groups) { terms.insert(terms.end(), m_terms.begin(), m_terms.end()); groups.insert(groups.end(), m_groups.begin(), m_groups.end()); return true; } bool getUTerms(vector& terms) { terms.insert(terms.end(), m_uterms.begin(), m_uterms.end()); return true; } private: void expandTerm(bool dont, const string& term, list& exp, string& sterm, const string& prefix); // After splitting entry on whitespace: process non-phrase element void processSimpleSpan(const string& span, bool nostemexp, list &pqueries); // Process phrase/near element void processPhraseOrNear(TextSplitQ *splitData, list &pqueries, bool useNear, int slack, int mods); Db& m_db; const string& m_field; const string& m_stemlang; bool m_doBoostUserTerms; // Single terms and phrases resulting from breaking up text; vector m_uterms; vector m_terms; vector > m_groups; }; #if 1 static void listVector(const string& what, const vector&l) { string a; for (vector::const_iterator it = l.begin(); it != l.end(); it++) { a = a + *it + " "; } LOGDEB(("%s: %s\n", what.c_str(), a.c_str())); } static void listList(const string& what, const list& l) { string a; for (list::const_iterator it = l.begin(); it != l.end(); it++) { a = a + *it + " "; } LOGDEB(("%s: %s\n", what.c_str(), a.c_str())); } #endif /** Expand stem and wildcards * * @param nostemexp don't perform stem expansion. This is mainly used to * prevent stem expansion inside phrases (because the user probably * does not expect it). This does NOT prevent wild card expansion. * Other factors than nostemexp can prevent stem expansion: * a null stemlang, resulting from a global user preference, a * capitalized term, or wildcard(s) * @param term input single word * @param exp output expansion list * @param sterm output original input term if there were no wildcards */ void StringToXapianQ::expandTerm(bool nostemexp, const string& term, list& exp, string &sterm, const string& prefix) { LOGDEB2(("expandTerm: field [%s] term [%s] stemlang [%s] nostemexp %d\n", m_field.c_str(), term.c_str(), m_stemlang.c_str(), nostemexp)); sterm.erase(); exp.clear(); if (term.empty()) { return; } bool haswild = term.find_first_of(cstr_minwilds) != string::npos; // No stemming if there are wildcards or prevented globally. if (haswild || m_stemlang.empty()) { LOGDEB2(("expandTerm: found wildcards or stemlang empty: no exp\n")); nostemexp = true; } if (nostemexp && !haswild) { sterm = term; m_uterms.push_back(sterm); exp.push_front(prefix + term); exp.resize(1); } else { TermMatchResult res; if (haswild) { m_db.termMatch(Rcl::Db::ET_WILD, m_stemlang, term, res, -1, m_field); } else { sterm = term; m_uterms.push_back(sterm); m_db.termMatch(Rcl::Db::ET_STEM, m_stemlang, term, res, -1, m_field); } for (list::const_iterator it = res.entries.begin(); it != res.entries.end(); it++) { exp.push_back(it->term); } } //listVector("ExpandTerm:uterms now: ", m_uterms); } // Do distribution of string vectors: a,b c,d -> a,c a,d b,c b,d void multiply_groups(vector >::const_iterator vvit, vector >::const_iterator vvend, vector& comb, vector >&allcombs) { // Remember my string vector and compute next, for recursive calls. vector >::const_iterator myvit = vvit++; // Walk the string vector I'm called upon and, for each string, // add it to current result, an call myself recursively on the // next string vector. The last call (last element of the vector of // vectors), adds the elementary result to the output // Walk my string vector for (vector::const_iterator strit = (*myvit).begin(); strit != (*myvit).end(); strit++) { // Add my current value to the string vector we're building comb.push_back(*strit); if (vvit == vvend) { // Last call: store current result allcombs.push_back(comb); } else { // Call recursively on next string vector multiply_groups(vvit, vvend, comb, allcombs); } // Pop the value I just added (make room for the next element in my // vector) comb.pop_back(); } } void StringToXapianQ::processSimpleSpan(const string& span, bool nostemexp, list &pqueries) { LOGDEB2(("StringToXapianQ::processSimpleSpan: [%s] nostemexp %d\n", span.c_str(), int(nostemexp))); list exp; string sterm; // dumb version of user term string prefix; const FieldTraits *ftp; if (!m_field.empty() && m_db.fieldToTraits(m_field, &ftp)) { prefix = ftp->pfx; } expandTerm(nostemexp, span, exp, sterm, prefix); // m_terms is used for highlighting, we don't want prefixes in there. for (list::const_iterator it = exp.begin(); it != exp.end(); it++) { m_terms.push_back(it->substr(prefix.size())); } // Push either term or OR of stem-expanded set Xapian::Query xq(Xapian::Query::OP_OR, exp.begin(), exp.end()); // If sterm (simplified original user term) is not null, give it a // relevance boost. We do this even if no expansion occurred (else // the non-expanded terms in a term list would end-up with even // less wqf). This does not happen if there are wildcards anywhere // in the search. if (m_doBoostUserTerms && !sterm.empty()) { xq = Xapian::Query(Xapian::Query::OP_OR, xq, Xapian::Query(prefix+sterm, original_term_wqf_booster)); } pqueries.push_back(xq); } // User entry element had several terms: transform into a PHRASE or // NEAR xapian query, the elements of which can themselves be OR // queries if the terms get expanded by stemming or wildcards (we // don't do stemming for PHRASE though) void StringToXapianQ::processPhraseOrNear(TextSplitQ *splitData, list &pqueries, bool useNear, int slack, int mods) { Xapian::Query::op op = useNear ? Xapian::Query::OP_NEAR : Xapian::Query::OP_PHRASE; list orqueries; bool hadmultiple = false; vector >groups; string prefix; const FieldTraits *ftp; if (!m_field.empty() && m_db.fieldToTraits(m_field, &ftp)) { prefix = ftp->pfx; } if (mods & Rcl::SearchDataClause::SDCM_ANCHORSTART) { orqueries.push_back(Xapian::Query(prefix + start_of_field_term)); slack++; } // Go through the list and perform stem/wildcard expansion for each element vector::iterator nxit = splitData->nostemexps.begin(); for (vector::iterator it = splitData->terms.begin(); it != splitData->terms.end(); it++, nxit++) { LOGDEB0(("ProcessPhrase: processing [%s]\n", it->c_str())); // Adjust when we do stem expansion. Not inside phrases, and // some versions of xapian will accept only one OR clause // inside NEAR, all others must be leafs. bool nostemexp = *nxit || (op == Xapian::Query::OP_PHRASE) || hadmultiple; string sterm; list exp; expandTerm(nostemexp, *it, exp, sterm, prefix); LOGDEB0(("ProcessPhrase: exp size %d\n", exp.size())); listList("", exp); // groups is used for highlighting, we don't want prefixes in there. vector noprefs; for (list::const_iterator it = exp.begin(); it != exp.end(); it++) { noprefs.push_back(it->substr(prefix.size())); } groups.push_back(noprefs); orqueries.push_back(Xapian::Query(Xapian::Query::OP_OR, exp.begin(), exp.end())); #ifdef XAPIAN_NEAR_EXPAND_SINGLE_BUF if (exp.size() > 1) hadmultiple = true; #endif } if (mods & Rcl::SearchDataClause::SDCM_ANCHOREND) { orqueries.push_back(Xapian::Query(prefix + end_of_field_term)); slack++; } // Generate an appropriate PHRASE/NEAR query with adjusted slack // For phrases, give a relevance boost like we do for original terms LOGDEB2(("PHRASE/NEAR: alltermcount %d lastpos %d\n", splitData->alltermcount, splitData->lastpos)); Xapian::Query xq(op, orqueries.begin(), orqueries.end(), splitData->lastpos + 1 + slack); if (op == Xapian::Query::OP_PHRASE) xq = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, xq, original_term_wqf_booster); pqueries.push_back(xq); // Add all combinations of NEAR/PHRASE groups to the highlighting data. vector > allcombs; vector comb; multiply_groups(groups.begin(), groups.end(), comb, allcombs); m_groups.insert(m_groups.end(), allcombs.begin(), allcombs.end()); } // Trim string beginning with ^ or ending with $ and convert to flags static int stringToMods(string& s) { int mods = 0; // Check for an anchored search trimstring(s); if (s.length() > 0 && s[0] == '^') { mods |= Rcl::SearchDataClause::SDCM_ANCHORSTART; s.erase(0, 1); } if (s.length() > 0 && s[s.length()-1] == '$') { mods |= Rcl::SearchDataClause::SDCM_ANCHOREND; s.erase(s.length()-1); } return mods; } /** * Turn user entry string (NOT query language) into a list of xapian queries. * We just separate words and phrases, and do wildcard and stem expansion, * * This is used to process data entered into an OR/AND/NEAR/PHRASE field of * the GUI. * * The final list contains one query for each term or phrase * - Elements corresponding to a stem-expanded part are an OP_OR * composition of the stem-expanded terms (or a single term query). * - Elements corresponding to phrase/near are an OP_PHRASE/NEAR * composition of the phrase terms (no stem expansion in this case) * @return the subquery count (either or'd stem-expanded terms or phrase word * count) */ bool StringToXapianQ::processUserString(const string &iq, string &ermsg, list &pqueries, const StopList& stops, int slack, bool useNear ) { LOGDEB(("StringToXapianQ:: query string: [%s], slack %d, near %d\n", iq.c_str(), slack, useNear)); ermsg.erase(); m_uterms.clear(); m_terms.clear(); m_groups.clear(); // Simple whitespace-split input into user-level words and // double-quoted phrases: word1 word2 "this is a phrase". // // The text splitter may further still decide that the resulting // "words" are really phrases, this depends on separators: // [paul@dom.net] would still be a word (span), but [about:me] // will probably be handled as a phrase. list phrases; TextSplit::stringToStrings(iq, phrases); // Process each element: textsplit into terms, handle stem/wildcard // expansion and transform into an appropriate Xapian::Query try { for (list::iterator it = phrases.begin(); it != phrases.end(); it++) { LOGDEB0(("strToXapianQ: phrase/word: [%s]\n", it->c_str())); int mods = stringToMods(*it); int terminc = mods != 0 ? 1 : 0; // If there are multiple spans in this element, including // at least one composite, we have to increase the slack // else a phrase query including a span would fail. // Ex: "term0@term1 term2" is onlyspans-split as: // 0 term0@term1 0 12 // 2 term2 13 18 // The position of term2 is 2, not 1, so a phrase search // would fail. // We used to do word split, searching for // "term0 term1 term2" instead, which may have worse // performance, but will succeed. // We now adjust the phrase/near slack by comparing the term count // and the last position // The term processing pipeline: TermProcQ tpq; TermProc *nxt = &tpq; TermProcStop tpstop(nxt, stops); nxt = &tpstop; //TermProcCommongrams tpcommon(nxt, stops); nxt = &tpcommon; //tpcommon.onlygrams(true); TermProcPrep tpprep(nxt); nxt = &tpprep; TextSplitQ splitter(TextSplit::Flags(TextSplit::TXTS_ONLYSPANS | TextSplit::TXTS_KEEPWILD), stops, nxt); tpq.setTSQ(&splitter); splitter.text_to_words(*it); slack += splitter.lastpos - splitter.terms.size() + 1; LOGDEB0(("strToXapianQ: termcount: %d\n", splitter.terms.size())); switch (splitter.terms.size() + terminc) { case 0: continue;// ?? case 1: processSimpleSpan(splitter.terms.front(), splitter.nostemexps.front(), pqueries); break; default: processPhraseOrNear(&splitter, pqueries, useNear, slack, mods); } } } catch (const Xapian::Error &e) { ermsg = e.get_msg(); } catch (const string &s) { ermsg = s; } catch (const char *s) { ermsg = s; } catch (...) { ermsg = "Caught unknown exception"; } if (!ermsg.empty()) { LOGERR(("stringToXapianQueries: %s\n", ermsg.c_str())); return false; } return true; } // Translate a simple OR, AND, or EXCL search clause. bool SearchDataClauseSimple::toNativeQuery(Rcl::Db &db, void *p, const string& stemlang) { const string& l_stemlang = (m_modifiers&SDCM_NOSTEMMING)? cstr_null: stemlang; LOGDEB2(("SearchDataClauseSimple::toNativeQuery: stemlang [%s]\n", stemlang.c_str())); m_terms.clear(); m_groups.clear(); Xapian::Query *qp = (Xapian::Query *)p; *qp = Xapian::Query(); Xapian::Query::op op; switch (m_tp) { case SCLT_AND: op = Xapian::Query::OP_AND; break; // EXCL will be set with AND_NOT in the list. So it's an OR list here case SCLT_OR: case SCLT_EXCL: op = Xapian::Query::OP_OR; break; default: LOGERR(("SearchDataClauseSimple: bad m_tp %d\n", m_tp)); return false; } list pqueries; // We normally boost the original term in the stem expansion list. Don't // do it if there are wildcards anywhere, this would skew the results. bool doBoostUserTerm = (m_parentSearch && !m_parentSearch->haveWildCards()) || (m_parentSearch == 0 && !m_haveWildCards); StringToXapianQ tr(db, m_field, l_stemlang, doBoostUserTerm); if (!tr.processUserString(m_text, m_reason, pqueries, db.getStopList())) return false; if (pqueries.empty()) { LOGERR(("SearchDataClauseSimple: resolved to null query\n")); return true; } tr.getTerms(m_terms, m_groups); tr.getUTerms(m_uterms); //listVector("SearchDataClauseSimple: Uterms: ", m_uterms); *qp = Xapian::Query(op, pqueries.begin(), pqueries.end()); if (m_weight != 1.0) { *qp = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, *qp, m_weight); } return true; } // Translate a FILENAME search clause. This mostly (or always) comes // from a "filename" search from the gui or recollq. A query language // "filename:"-prefixed field will not go through here, but through // the generic field-processing code. // // In the case of multiple space-separated fragments, we generate an // AND of OR queries. Each OR query comes from the expansion of a // fragment. We used to generate a single OR with all expanded terms, // which did not make much sense. bool SearchDataClauseFilename::toNativeQuery(Rcl::Db &db, void *p, const string&) { Xapian::Query *qp = (Xapian::Query *)p; *qp = Xapian::Query(); list patterns; TextSplit::stringToStrings(m_text, patterns); list names; for (list::iterator it = patterns.begin(); it != patterns.end(); it++) { list more; db.filenameWildExp(*it, more); Xapian::Query tq = Xapian::Query(Xapian::Query::OP_OR, more.begin(), more.end()); *qp = qp->empty() ? tq : Xapian::Query(Xapian::Query::OP_AND, *qp, tq); } if (m_weight != 1.0) { *qp = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, *qp, m_weight); } return true; } // Translate NEAR or PHRASE clause. bool SearchDataClauseDist::toNativeQuery(Rcl::Db &db, void *p, const string& stemlang) { const string& l_stemlang = (m_modifiers&SDCM_NOSTEMMING)? cstr_null: stemlang; LOGDEB(("SearchDataClauseDist::toNativeQuery\n")); m_terms.clear(); m_groups.clear(); Xapian::Query *qp = (Xapian::Query *)p; *qp = Xapian::Query(); list pqueries; Xapian::Query nq; // We normally boost the original term in the stem expansion list. Don't // do it if there are wildcards anywhere, this would skew the results. bool doBoostUserTerm = (m_parentSearch && !m_parentSearch->haveWildCards()) || (m_parentSearch == 0 && !m_haveWildCards); // We produce a single phrase out of the user entry then use // stringToXapianQueries() to lowercase and simplify the phrase // terms etc. This will result into a single (complex) // Xapian::Query. if (m_text.find('\"') != string::npos) { m_text = neutchars(m_text, "\""); } string s = cstr_dquote + m_text + cstr_dquote; bool useNear = (m_tp == SCLT_NEAR); StringToXapianQ tr(db, m_field, l_stemlang, doBoostUserTerm); if (!tr.processUserString(s, m_reason, pqueries, db.getStopList(), m_slack, useNear)) return false; if (pqueries.empty()) { LOGERR(("SearchDataClauseDist: resolved to null query\n")); return true; } tr.getTerms(m_terms, m_groups); tr.getUTerms(m_uterms); *qp = *pqueries.begin(); if (m_weight != 1.0) { *qp = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, *qp, m_weight); } return true; } // Translate subquery bool SearchDataClauseSub::toNativeQuery(Rcl::Db &db, void *p, const string&) { return m_sub->toNativeQuery(db, p); } bool SearchDataClauseSub::getTerms(vector& terms, vector >& groups, vector& gslks) const { return m_sub.getconstptr()->getTerms(terms, groups, gslks); } void SearchDataClauseSub::getUTerms(vector& terms) const { m_sub.getconstptr()->getUTerms(terms); } } // Namespace Rcl recoll-1.17.3/rcldb/searchdata.h000644 001750 000000 00000026714 11740755063 017044 0ustar00dockeswheel000000 000000 /* 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 _SEARCHDATA_H_INCLUDED_ #define _SEARCHDATA_H_INCLUDED_ /** * Structures to hold data coming almost directly from the gui * and handle its translation to Xapian queries. * This is not generic code, it reflects the choices made for the user * interface, and it also knows some specific of recoll's usage of Xapian * (ie: term prefixes) */ #include #include #include "rcldb.h" #include "refcntr.h" #include "smallut.h" #include "cstr.h" class RclConfig; #ifndef NO_NAMESPACES using std::vector; using std::string; namespace Rcl { #endif // NO_NAMESPACES /** Search clause types */ enum SClType { SCLT_AND, SCLT_OR, SCLT_EXCL, SCLT_FILENAME, SCLT_PHRASE, SCLT_NEAR, SCLT_SUB }; class SearchDataClause; /** Data structure representing a Recoll user query, for translation into a Xapian query tree. This could probably better called a 'question'. This is a list of search clauses combined through either OR or AND. Clauses either reflect user entry in a query field: some text, a clause type (AND/OR/NEAR etc.), possibly a distance, or points to another SearchData representing a subquery. The content of each clause when added may not be fully parsed yet (may come directly from a gui field). It will be parsed and may be translated to several queries in the Xapian sense, for exemple several terms and phrases as would result from ["this is a phrase" term1 term2] . This is why the clauses also have an AND/OR/... type. A phrase clause could be added either explicitly or using double quotes: {SCLT_PHRASE, [this is a phrase]} or as {SCLT_XXX, ["this is a phrase"]} */ class SearchData { public: SearchData(SClType tp) : m_tp(tp), m_topdirexcl(false), m_topdirweight(1.0), m_haveDates(false), m_maxSize(size_t(-1)), m_minSize(size_t(-1)), m_haveWildCards(false) { if (m_tp != SCLT_OR && m_tp != SCLT_AND) m_tp = SCLT_OR; } ~SearchData() {erase();} /** Make pristine */ void erase(); /** Is there anything but a file name search in here ? */ bool fileNameOnly(); /** Do we have wildcards anywhere apart from filename searches ? */ bool haveWildCards() {return m_haveWildCards;} /** Translate to Xapian query. rcldb knows about the void* */ bool toNativeQuery(Rcl::Db &db, void *); /** We become the owner of cl and will delete it */ bool addClause(SearchDataClause *cl); /** If this is a simple query (one field only, no distance clauses), * add phrase made of query terms to query, so that docs containing the * user terms in order will have higher relevance. This must be called * before toNativeQuery(). * @param threshold: don't use terms more frequent than the value * (proportion of docs where they occur) */ bool maybeAddAutoPhrase(Rcl::Db &db, double threshold); /** Set/get top subdirectory for filtering results */ void setTopdir(const string& t, bool excl = false, float w = 1.0) { m_topdir = t; m_topdirexcl = excl; m_topdirweight = w; } void setMinSize(size_t size) {m_minSize = size;} void setMaxSize(size_t size) {m_maxSize = size;} /** Set date span for filtering results */ void setDateSpan(DateInterval *dip) {m_dates = *dip; m_haveDates = true;} /** Add file type for filtering results */ void addFiletype(const string& ft) {m_filetypes.push_back(ft);} /** Add file type to not wanted list */ void remFiletype(const string& ft) {m_nfiletypes.push_back(ft);} void setStemlang(const string& lang = "english") {m_stemlang = lang;} /** Retrieve error description */ string getReason() {return m_reason;} /** Get terms and phrase/near groups. Used in the GUI for highlighting * The groups and gslks vectors are parallel and hold the phrases/near * string groups and their associated slacks (distance in excess of group * size) */ bool getTerms(vector& terms, vector >& groups, vector& gslks) const; /** Get user-input terms (before expansion etc.) */ void getUTerms(vector& terms) const; /** * Get/set the description field which is retrieved from xapian after * initializing the query. It is stored here for usage in the GUI. */ string getDescription() {return m_description;} void setDescription(const string& d) {m_description = d;} private: SClType m_tp; // Only SCLT_AND or SCLT_OR here vector m_query; vector m_filetypes; // Restrict to filetypes if set. vector m_nfiletypes; // Unwanted file types string m_topdir; // Restrict to subtree. bool m_topdirexcl; // Invert meaning float m_topdirweight; // affect weight instead of filter bool m_haveDates; DateInterval m_dates; // Restrict to date interval size_t m_maxSize; size_t m_minSize; // Printable expanded version of the complete query, retrieved/set // from rcldb after the Xapian::setQuery() call string m_description; string m_reason; bool m_haveWildCards; string m_stemlang; bool expandFileTypes(RclConfig *cfg, vector& exptps); /* Copyconst and assignment private and forbidden */ SearchData(const SearchData &) {} SearchData& operator=(const SearchData&) {return *this;}; }; class SearchDataClause { public: enum Modifier {SDCM_NONE=0, SDCM_NOSTEMMING=1, SDCM_ANCHORSTART=2, SDCM_ANCHOREND=4}; SearchDataClause(SClType tp) : m_tp(tp), m_parentSearch(0), m_haveWildCards(0), m_modifiers(SDCM_NONE), m_weight(1.0) {} virtual ~SearchDataClause() {} virtual bool toNativeQuery(Rcl::Db &db, void *, const string&) = 0; bool isFileName() const {return m_tp == SCLT_FILENAME ? true: false;} virtual string getReason() const {return m_reason;} virtual bool getTerms(vector&, vector >&, vector&) const = 0; virtual void getUTerms(vector&) const = 0; SClType getTp() {return m_tp;} void setParent(SearchData *p) {m_parentSearch = p;} virtual void setModifiers(Modifier mod) {m_modifiers = mod;} virtual int getModifiers() {return m_modifiers;} virtual void addModifier(Modifier mod) { int imod = getModifiers(); imod |= mod; setModifiers(Modifier(imod)); } virtual void setWeight(float w) {m_weight = w;} friend class SearchData; protected: string m_reason; SClType m_tp; SearchData *m_parentSearch; bool m_haveWildCards; Modifier m_modifiers; float m_weight; private: SearchDataClause(const SearchDataClause&) {} SearchDataClause& operator=(const SearchDataClause&) { return *this; } }; /** * "Simple" data clause with user-entered query text. This can include * multiple phrases and words, but no specified distance. */ class SearchDataClauseSimple : public SearchDataClause { public: SearchDataClauseSimple(SClType tp, const string& txt, const string& fld = string()) : SearchDataClause(tp), m_text(txt), m_field(fld), m_slack(0) { m_haveWildCards = (txt.find_first_of(cstr_minwilds) != string::npos); } virtual ~SearchDataClauseSimple() {} /** Translate to Xapian query */ virtual bool toNativeQuery(Rcl::Db &db, void *, const string& stemlang); /** Retrieve query terms and term groups. This is used for highlighting */ virtual bool getTerms(vector& terms, /* Single terms */ vector >& groups, /* Prox grps */ vector& gslks) const /* Prox slacks */ { terms.insert(terms.end(), m_terms.begin(), m_terms.end()); groups.insert(groups.end(), m_groups.begin(), m_groups.end()); gslks.insert(gslks.end(), m_groups.size(), m_slack); return true; } virtual void getUTerms(vector& terms) const { terms.insert(terms.end(), m_uterms.begin(), m_uterms.end()); } virtual const string& gettext() {return m_text;} virtual const string& getfield() {return m_field;} protected: string m_text; // Raw user entry text. string m_field; // Field specification if any // Single terms and phrases resulting from breaking up m_text; // valid after toNativeQuery() call vector m_terms; vector > m_groups; // User terms before expansion vector m_uterms; // Declare m_slack here. Always 0, but allows getTerms to work for // SearchDataClauseDist int m_slack; }; /** Filename search clause. This is special because term expansion is only * performed against the XSFN terms (it's performed against the main index * for all other fields). Else we could just use a "filename:" field * This doesn't really make sense (either). I think we could either expand * filenames against all terms and then select the XSFN ones, or always perform * expansion only against the field's terms ? Anyway this doesn't hurt * much either. * * There is a big advantage though in expanding only against the * field, especially for file names, because this makes searches for * "*xx" much faster (no need to scan the whole main index). */ class SearchDataClauseFilename : public SearchDataClauseSimple { public: SearchDataClauseFilename(const string& txt) : SearchDataClauseSimple(SCLT_FILENAME, txt) { // File name searches don't count when looking for wild cards. m_haveWildCards = false; } virtual ~SearchDataClauseFilename() {} virtual bool toNativeQuery(Rcl::Db &db, void *, const string& stemlang); }; /** * A clause coming from a NEAR or PHRASE entry field. There is only one * string group, and a specified distance, which applies to it. */ class SearchDataClauseDist : public SearchDataClauseSimple { public: SearchDataClauseDist(SClType tp, const string& txt, int slack, const string& fld = string()) : SearchDataClauseSimple(tp, txt, fld) {m_slack = slack;} virtual ~SearchDataClauseDist() {} virtual bool toNativeQuery(Rcl::Db &db, void *, const string& stemlang); // m_slack is declared in SearchDataClauseSimple }; /** Subquery */ class SearchDataClauseSub : public SearchDataClause { public: // We take charge of the SearchData * and will delete it. SearchDataClauseSub(SClType tp, RefCntr sub) : SearchDataClause(tp), m_sub(sub) {} virtual ~SearchDataClauseSub() {} virtual bool toNativeQuery(Rcl::Db &db, void *, const string& stemlang); virtual bool getTerms(vector&, vector >&, vector&) const; virtual void getUTerms(vector&) const; protected: RefCntr m_sub; }; } // Namespace Rcl #endif /* _SEARCHDATA_H_INCLUDED_ */ recoll-1.17.3/rcldb/stemdb.cpp000644 001750 000000 00000026246 11740755063 016556 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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. */ /** * Management of the auxiliary databases listing stems and their expansion * terms */ #include #include #include #include #include "stemdb.h" #include "wipedir.h" #include "pathut.h" #include "debuglog.h" #include "smallut.h" #include "utf8iter.h" #include "textsplit.h" using namespace std; namespace Rcl { namespace StemDb { static const string cstr_stemdirstem = "stem_"; /// Compute name of stem db for given base database and language static string stemdbname(const string& dbdir, const string& lang) { return path_cat(dbdir, cstr_stemdirstem + lang); } list getLangs(const string& dbdir) { string pattern = cstr_stemdirstem + "*"; list dirs = path_dirglob(dbdir, pattern); for (list::iterator it = dirs.begin(); it != dirs.end(); it++) { *it = path_basename(*it); *it = it->substr(cstr_stemdirstem.length(), string::npos); } return dirs; } bool deleteDb(const string& dbdir, const string& lang) { string dir = stemdbname(dbdir, lang); if (wipedir(dir) == 0 && rmdir(dir.c_str()) == 0) return true; return false; } // Autoclean/delete directory class DirWiper { public: string dir; bool do_it; DirWiper(string d) : dir(d), do_it(true) {} ~DirWiper() { if (do_it) { wipedir(dir); rmdir(dir.c_str()); } } }; inline static bool p_notlowerascii(unsigned int c) { if (c < 'a' || (c > 'z' && c < 128)) return true; return false; } static bool addAssoc(Xapian::WritableDatabase &sdb, const string& stem, const list& derivs) { Xapian::Document newdocument; newdocument.add_term(stem); // The doc data is just parents=blank-separated-list string record = "parents="; for (list::const_iterator it = derivs.begin(); it != derivs.end(); it++) { record += *it + " "; } record += "\n"; LOGDEB2(("createStemDb: stmdoc data: [%s]\n", record.c_str())); newdocument.set_data(record); try { sdb.replace_document(stem, newdocument); } catch (...) { LOGERR(("Db::createstemdb(addAssoc): replace failed\n")); return false; } return true; } /** * Create database of stem to parents associations for a given language. * We walk the list of all terms, stem them, and create another Xapian db * with documents indexed by a single term (the stem), and with the list of * parent terms in the document data. */ bool createDb(Xapian::Database& xdb, const string& dbdir, const string& lang) { LOGDEB(("StemDb::createDb(%s)\n", lang.c_str())); Chrono cron; // First build the in-memory stem database: // We walk the list of all terms, and stem each. // If the stem is identical to the term, no need to create an entry // Else, we add an entry to the multimap. // At the end, we only save stem-terms associations with several terms, the // others are not useful // Note: a map > would probably be more efficient multimap assocs; // Statistics int nostem=0; // Dont even try: not-alphanum (incomplete for now) int stemconst=0; // Stem == term int stemdiff=0; // Count of all different stems int stemmultiple = 0; // Count of stems with multiple derivatives try { Xapian::Stem stemmer(lang); Xapian::TermIterator it; for (it = xdb.allterms_begin(); it != xdb.allterms_end(); it++) { // Deciding if we try to stem the term. // If it has any // non-lowercase 7bit char (that is, numbers, capitals and // punctuation) dont. string::iterator sit = (*it).begin(), eit = sit + (*it).length(); if ((sit = find_if(sit, eit, p_notlowerascii)) != eit) { ++nostem; LOGDEB1(("stemskipped: [%s], because of 0x%x\n", (*it).c_str(), *sit)); continue; } // Detect and skip CJK terms. // We're still sending all other multibyte utf-8 chars to // the stemmer, which is not too well defined for // xapian<1.0 (very obsolete now), but seems to work // anyway. There shouldnt be too many in any case because // accents are stripped at this point. Effect of stripping // accents on stemming unknown, hopefuly none, there is // nothing we can do about it. Utf8Iter utfit(*it); if (TextSplit::isCJK(*utfit)) { // LOGDEB(("stemskipped: Skipping CJK\n")); continue; } string stem = stemmer(*it); LOGDEB2(("Db::createStemDb: word [%s], stem [%s]\n", (*it).c_str(), stem.c_str())); if (stem == *it) { ++stemconst; continue; } assocs.insert(pair(stem, *it)); } } catch (const Xapian::Error &e) { LOGERR(("Db::createStemDb: build failed: %s\n", e.get_msg().c_str())); return false; } catch (...) { LOGERR(("Db::createStemDb: build failed: no stemmer for %s ? \n", lang.c_str())); return false; } LOGDEB1(("StemDb::createDb(%s): in memory map built: %.2f S\n", lang.c_str(), cron.secs())); // Create xapian database for stem relations string stemdbdir = stemdbname(dbdir, lang); // We want to get rid of the db dir in case of error. This gets disarmed // just before success return. DirWiper wiper(stemdbdir); string ermsg; Xapian::WritableDatabase sdb; try { sdb = Xapian::WritableDatabase(stemdbdir, Xapian::DB_CREATE_OR_OVERWRITE); } catch (const Xapian::Error &e) { ermsg = e.get_msg(); } catch (const string &s) { ermsg = s; } catch (const char *s) { ermsg = s; } catch (...) { ermsg = "Caught unknown exception"; } if (!ermsg.empty()) { LOGERR(("Db::createstemdb: exception while opening [%s]: %s\n", stemdbdir.c_str(), ermsg.c_str())); return false; } // Enter pseud-docs in db by walking the multimap. string stem; list derivs; for (multimap::const_iterator it = assocs.begin(); it != assocs.end(); it++) { if (stem == it->first) { // Staying with same stem derivs.push_back(it->second); // cerr << " " << it->second << endl; } else { // Changing stems ++stemdiff; LOGDEB2(("createStemDb: stem [%s]\n", stem.c_str())); // We need an entry even if there is only one derivative // so that it is possible to search by entering the stem // even if it doesnt exist as a term if (!derivs.empty()) { if (derivs.size() > 1) ++stemmultiple; if (!addAssoc(sdb, stem, derivs)) { return false; } derivs.clear(); } stem = it->first; derivs.push_back(it->second); // cerr << "\n" << stem << " " << it->second; } } if (!derivs.empty()) { if (derivs.size() > 1) ++stemmultiple; if (!addAssoc(sdb, stem, derivs)) { return false; } } LOGDEB1(("StemDb::createDb(%s): done: %.2f S\n", lang.c_str(), cron.secs())); LOGDEB(("Stem map size: %d stems %d mult %d no %d const %d\n", assocs.size(), stemdiff, stemmultiple, nostem, stemconst)); wiper.do_it = false; return true; } static string stringlistdisp(const list& sl) { string s; for (list::const_iterator it = sl.begin(); it!= sl.end(); it++) s += "[" + *it + "] "; if (!s.empty()) s.erase(s.length()-1); return s; } /** * Expand term to list of all terms which stem to the same term, for one * expansion language */ static bool stemExpandOne(const std::string& dbdir, const std::string& lang, const std::string& term, list& result) { try { Xapian::Stem stemmer(lang); string stem = stemmer(term); LOGDEB(("stemExpand:%s: [%s] stem-> [%s]\n", lang.c_str(), term.c_str(), stem.c_str())); // Open stem database string stemdbdir = stemdbname(dbdir, lang); Xapian::Database sdb(stemdbdir); LOGDEB0(("stemExpand: %s lastdocid: %d\n", stemdbdir.c_str(), sdb.get_lastdocid())); // Try to fetch the doc from the stem db if (!sdb.term_exists(stem)) { LOGDEB0(("Db::stemExpand: no term for %s\n", stem.c_str())); } else { Xapian::PostingIterator did = sdb.postlist_begin(stem); if (did == sdb.postlist_end(stem)) { LOGDEB0(("stemExpand: no term(1) for %s\n",stem.c_str())); } else { Xapian::Document doc = sdb.get_document(*did); string data = doc.get_data(); // Build expansion list from database data No need for // a conftree, but we need to massage the data a // little string::size_type pos = data.find('='); string::size_type pos1 = data.rfind('\n'); if (pos == string::npos || pos1 == string::npos || pos1 <= pos+1) { LOGERR(("stemExpand: bad data in db: [%s]\n", data.c_str())); } else { ++pos; stringToStrings(data.substr(pos, pos1-pos), result); } } } // If the user term or stem are not in the list, add them if (find(result.begin(), result.end(), term) == result.end()) { result.push_back(term); } if (find(result.begin(), result.end(), stem) == result.end()) { result.push_back(stem); } LOGDEB0(("stemExpand:%s: %s -> %s\n", lang.c_str(), stem.c_str(), stringlistdisp(result).c_str())); } catch (...) { LOGERR(("stemExpand: error accessing stem db. dbdir [%s] lang [%s]\n", dbdir.c_str(), lang.c_str())); result.push_back(term); return false; } return true; } /** * Expand term to list of all terms which stem to the same term, add the * expansion sets for possibly multiple expansion languages */ bool stemExpand(const std::string& dbdir, const std::string& langs, const std::string& term, list& result) { list llangs; stringToStrings(langs, llangs); for (list::const_iterator it = llangs.begin(); it != llangs.end(); it++) { list oneexp; stemExpandOne(dbdir, *it, term, oneexp); result.insert(result.end(), oneexp.begin(), oneexp.end()); } result.sort(); result.unique(); return true; } } } recoll-1.17.3/rcldb/stemdb.h000644 001750 000000 00000003711 11740755063 016213 0ustar00dockeswheel000000 000000 /* 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 _STEMDB_H_INCLUDED_ #define _STEMDB_H_INCLUDED_ /// Stem database code /// /// Stem databases list stems and the set of index terms they expand to. They /// are computed from index data by stemming each term and regrouping those /// that stem to the same value. /// Stem databases are stored as separate xapian databases (used as an /// Isam method), in subdirectories of the index. #include #include #include #ifndef NO_NAMESPACES using std::string; using std::list; namespace Rcl { namespace StemDb { #endif // NO_NAMESPACES /// Get languages of existing stem databases extern std::list getLangs(const std::string& dbdir); /// Delete stem database for given language extern bool deleteDb(const std::string& dbdir, const std::string& lang); /// Create stem database for given language extern bool createDb(Xapian::Database& xdb, const std::string& dbdir, const std::string& lang); /// Expand term to stem siblings extern bool stemExpand(const std::string& dbdir, const std::string& langs, const std::string& term, list& result); #ifndef NO_NAMESPACES } } #endif // NO_NAMESPACES #endif /* _STEMDB_H_INCLUDED_ */ recoll-1.17.3/rcldb/stoplist.cpp000644 001750 000000 00000005356 11740755063 017160 0ustar00dockeswheel000000 000000 /* Copyright (C) 2007 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_STOPLIST #include "debuglog.h" #include "readfile.h" #include "unacpp.h" #include "smallut.h" #include "stoplist.h" #ifndef NO_NAMESPACES namespace Rcl { #endif bool StopList::setFile(const string &filename) { m_stops.clear(); string stoptext, reason; if (!file_to_string(filename, stoptext, &reason)) { LOGDEB0(("StopList::StopList: file_to_string(%s) failed: %s\n", filename.c_str(), reason.c_str())); return false; } set stops; stringToStrings(stoptext, stops); for (set::iterator it = stops.begin(); it != stops.end(); it++) { string dterm; unacmaybefold(*it, dterm, "UTF-8", true); m_stops.insert(dterm); } return true; } // Most sites will have an empty stop list. We try to optimize the // empty set case as much as possible. empty() is probably sligtly faster than // find() in this case. bool StopList::isStop(const string &term) const { return m_stops.empty() ? false : m_stops.find(term) != m_stops.end(); } #ifndef NO_NAMESPACES } #endif #else // TEST_STOPLIST #include #include #include #include #include #include #include #include "stoplist.h" using namespace std; using namespace Rcl; static char *thisprog; static char usage [] = "trstoplist stopstermsfile\n\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } const string tstwords[] = { "the", "is", "xweird", "autre", "autre double", "mot1", "mot double", }; const int tstsz = sizeof(tstwords) / sizeof(string); int main(int argc, char **argv) { int count = 10; thisprog = argv[0]; argc--; argv++; if (argc != 1) Usage(); string filename = argv[0]; argc--; StopList sl(filename); for (int i = 0; i < tstsz; i++) { const string &tst = tstwords[i]; cout << "[" << tst << "] " << (sl.isStop(tst) ? "in stop list" : "not in stop list") << endl; } exit(0); } #endif // TEST_STOPLIST recoll-1.17.3/rcldb/stoplist.h000644 001750 000000 00000003127 11740755063 016617 0ustar00dockeswheel000000 000000 /* 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 _STOPLIST_H_INCLUDED_ #define _STOPLIST_H_INCLUDED_ #include #include #ifndef NO_NAMESPACES using std::set; using std::string; namespace Rcl { #endif /** * A StopList is just a bunch of strings read from a file. * * Some of the string may contain whitespace (that's for experimentation with * stop n-grams), so we take care of dquotes while reading the file. We also * lowercase and remove accents. The source file should be utf-8. */ class StopList { public: StopList() {} StopList(const string &filename) {setFile(filename);} virtual ~StopList() {} bool setFile(const string &filename); bool isStop(const string &term) const; bool hasStops() const {return !m_stops.empty();} private: set m_stops; }; #ifndef NO_NAMESPACES } #endif #endif /* _STOPLIST_H_INCLUDED_ */ recoll-1.17.3/rcldb/termproc.h000644 001750 000000 00000015120 11740755063 016565 0ustar00dockeswheel000000 000000 /* 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 _TERMPROC_H_INCLUDED_ #define _TERMPROC_H_INCLUDED_ #include "textsplit.h" #include "stoplist.h" namespace Rcl { /** * Termproc objects take a stream of term tokens as input and do something * with them: transform to lowercase, filter out stop words, generate n-grams, * finally index or generate search clauses, etc. They are chained and can * be arranged to form different pipelines depending on the desired processing * steps: for example, optional stoplist or commongram processing. * * Shared processing steps are defined in this file. The first and last steps * (ie: adding index term) are usually defined in the specific module. */ /** * The base class takes care of chaining: all derived classes call its * takeword() and flush() methods to ensure that terms go through the pipe. */ class TermProc { public: TermProc(TermProc* next) : m_next(next) {} virtual ~TermProc() {} virtual bool takeword(const string &term, int pos, int bs, int be) { if (m_next) return m_next->takeword(term, pos, bs, be); else return true; } virtual bool flush() { if (m_next) return m_next->flush(); else return true; } private: TermProc *m_next; /* Copyconst and assignment private and forbidden */ TermProc(const TermProc &) {} TermProc& operator=(const TermProc &) {return *this;}; }; /** * Specialized TextSplit class: this will probably replace the base * TextSplit when we've converted all the code. The takeword() routine in this * calls a TermProc's instead of being overriden in a user derived class. * The text_to_word() method also takes care of flushing. */ class TextSplitP : public TextSplit { public: TextSplitP(TermProc *prc, Flags flags = Flags(TXTS_NONE)) : TextSplit(flags), m_prc(prc) {} virtual bool text_to_words(const string &in) { bool ret = TextSplit::text_to_words(in); if (m_prc && !m_prc->flush()) return false; return ret; } virtual bool takeword(const string& term, int pos, int bs, int be) { if (m_prc) return m_prc->takeword(term, pos, bs, be); else return true; } private: TermProc *m_prc; }; /** Unaccent and lowercase term. This is usually the first in the pipeline */ class TermProcPrep : public TermProc { public: TermProcPrep(TermProc *nxt) : TermProc(nxt), m_totalterms(0), m_unacerrors(0) {} virtual bool takeword(const string& itrm, int pos, int bs, int be) { m_totalterms++; string otrm; if (!unacmaybefold(itrm, otrm, "UTF-8", true)) { LOGDEB(("splitter::takeword: unac [%s] failed\n", itrm.c_str())); m_unacerrors++; // We don't generate a fatal error because of a bad term, // but one has to put the limit somewhere if (m_unacerrors > 500 && (double(m_totalterms) / double(m_unacerrors)) < 2.0) { // More than 1 error for every other term LOGERR(("splitter::takeword: too many unac errors %d/%d\n", m_unacerrors, m_totalterms)); return false; } return true; } return TermProc::takeword(otrm, pos, bs, be); } virtual bool flush() { m_totalterms = m_unacerrors = 0; return TermProc::flush(); } private: int m_totalterms; int m_unacerrors; }; /** Compare to stop words list and discard if match found */ class TermProcStop : public TermProc { public: TermProcStop(TermProc *nxt, const Rcl::StopList& stops) : TermProc(nxt), m_stops(stops) {} virtual bool takeword(const string& term, int pos, int bs, int be) { if (m_stops.isStop(term)) { return true; } return TermProc::takeword(term, pos, bs, be); } private: const Rcl::StopList& m_stops; }; /** Handle common-gram generation: combine frequent terms with neighbours to * shorten the positions lists for phrase searches. * NOTE: This does not currently work because of bad interaction with the * spans (ie john@domain.com) generation in textsplit. Not used, kept for * testing only */ class TermProcCommongrams : public TermProc { public: TermProcCommongrams(TermProc *nxt, const Rcl::StopList& stops) : TermProc(nxt), m_stops(stops), m_onlygrams(false) { } virtual bool takeword(const string& term, int pos, int bs, int be) { LOGDEB1(("TermProcCom::takeword: pos %d %d %d [%s]\n", pos, bs, be, term.c_str())); bool isstop = m_stops.isStop(term); bool twogramemit = false; if (!m_prevterm.empty() && (m_prevstop || isstop)) { // create 2-gram. space unnecessary but improves // the readability of queries string twogram; twogram.swap(m_prevterm); twogram.append(1, ' '); twogram += term; // When emitting a complex term we set the bps to 0. This may // be used by our clients if (!TermProc::takeword(twogram, m_prevpos, 0, 0)) return false; twogramemit = true; #if 0 if (m_stops.isStop(twogram)) { firstword = twogram; isstop = false; } #endif } m_prevterm = term; m_prevstop = isstop; m_prevpos = pos; m_prevsent = false; m_prevbs = bs; m_prevbe = be; // If flags allow, emit the bare term at the current pos. if (!m_onlygrams || (!isstop && !twogramemit)) { if (!TermProc::takeword(term, pos, bs, be)) return false; m_prevsent = true; } return true; } virtual bool flush() { if (!m_prevsent && !m_prevterm.empty()) if (!TermProc::takeword(m_prevterm, m_prevpos, m_prevbs, m_prevbe)) return false; m_prevterm.clear(); m_prevsent = true; return TermProc::flush(); } void onlygrams(bool on) { m_onlygrams = on; } private: // The stoplist we're using const Rcl::StopList& m_stops; // Remembered data for the last processed term string m_prevterm; bool m_prevstop; int m_prevpos; int m_prevbs; int m_prevbe; bool m_prevsent; // If this is set, we only emit longest grams bool m_onlygrams; }; } // End namespace Rcl #endif /* _TERMPROC_H_INCLUDED_ */ recoll-1.17.3/query/Makefile000644 001750 000000 00000002625 11740755063 016306 0ustar00dockeswheel000000 000000 depth = .. include $(depth)/mk/sysconf PROGS = xadump recollq #trhist qtry qxtry all: $(PROGS) SRCS = xadump.cpp rclqlang.cpp .cpp.o : $(CXX) -c $(ALL_CXXFLAGS) -o $@ $< XADUMP_OBJS= xadump.o $(BIGLIB) xadump : $(XADUMP_OBJS) $(CXX) $(ALL_CXXFLAGS) -o xadump $(XADUMP_OBJS) \ $(LIBICONV) $(LIBXAPIAN) $(LIBSYS) RECOLLQ_OBJS= recollq.o $(BIGLIB) recollq : $(RECOLLQ_OBJS) $(CXX) $(ALL_CXXFLAGS) -o recollq $(RECOLLQ_OBJS) \ $(LIBICONV) $(LIBXAPIAN) $(LIBSYS) recollq.o : recollq.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_RECOLLQ -c recollq.cpp HISTORY_OBJS= trhist.o $(BIGLIB) trhist : $(HISTORY_OBJS) $(CXX) $(ALL_CXXFLAGS) -o trhist $(HISTORY_OBJS) \ $(LIBICONV) $(LIBXAPIAN) trhist.o : history.cpp history.h $(CXX) $(ALL_CXXFLAGS) -DTEST_HISTORY -c -o trhist.o history.cpp WASASTRINGTOQUERY_OBJS= trwasastrtoq.o $(BIGLIB) trwasastrtoq : $(WASASTRINGTOQUERY_OBJS) $(CXX) $(ALL_CXXFLAGS) -o trwasastrtoq $(WASASTRINGTOQUERY_OBJS) \ $(LIBICONV) $(LIBXAPIAN) trwasastrtoq.o : wasastringtoquery.cpp wasastringtoquery.h $(CXX) $(ALL_CXXFLAGS) -DTEST_WASASTRINGTOQUERY -c \ -o trwasastrtoq.o wasastringtoquery.cpp $(BIGLIB): force cd $(depth)/lib;$(MAKE) force: depend: alldeps.stamp alldeps.stamp : $(SRCS) $(CXX) -M $(ALL_CXXFLAGS) $(SRCS) > alldeps touch alldeps.stamp clean: cp /dev/null alldeps rm -f alldeps.stamp rm -f *.o $(PROGS) include alldeps recoll-1.17.3/query/docseq.cpp000644 001750 000000 00000005737 11740755063 016637 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 "docseq.h" #include "filtseq.h" #include "sortseq.h" #include "debuglog.h" string DocSequence::o_sort_trans; string DocSequence::o_filt_trans; int DocSequence::getSeqSlice(int offs, int cnt, vector& result) { int ret = 0; for (int num = offs; num < offs + cnt; num++, ret++) { result.push_back(ResListEntry()); if (!getDoc(num, result.back().doc, &result.back().subHeader)) { result.pop_back(); return ret; } } return ret; } // Remove stacked modifying sources (sort, filter) until we get to a real one void DocSource::stripStack() { if (m_seq.isNull()) return; while (m_seq->getSourceSeq().isNotNull()) { m_seq = m_seq->getSourceSeq(); } } bool DocSource::buildStack() { LOGDEB2(("DocSource::buildStack()\n")); stripStack(); if (m_seq.isNull()) return false; // Filtering must be done before sorting, (which may // truncates the original list) if (m_seq->canFilter()) { if (!m_seq->setFiltSpec(m_fspec)) { LOGERR(("DocSource::buildStack: setfiltspec failed\n")); } } else { if (m_fspec.isNotNull()) { m_seq = RefCntr(new DocSeqFiltered(m_config, m_seq, m_fspec)); } } if (m_seq->canSort()) { if (!m_seq->setSortSpec(m_sspec)) { LOGERR(("DocSource::buildStack: setsortspec failed\n")); } } else { if (m_sspec.isNotNull()) { m_seq = RefCntr(new DocSeqSorted(m_seq, m_sspec)); } } return true; } string DocSource::title() { if (m_seq.isNull()) return string(); string qual; if (m_fspec.isNotNull() && !m_sspec.isNotNull()) qual = string(" (") + o_filt_trans + string(")"); else if (!m_fspec.isNotNull() && m_sspec.isNotNull()) qual = string(" (") + o_sort_trans + string(")"); else if (m_fspec.isNotNull() && m_sspec.isNotNull()) qual = string(" (") + o_sort_trans + string(",") + o_filt_trans + string(")"); return m_seq->title() + qual; } bool DocSource::setFiltSpec(const DocSeqFiltSpec &f) { LOGDEB2(("DocSource::setFiltSpec\n")); m_fspec = f; buildStack(); return true; } bool DocSource::setSortSpec(const DocSeqSortSpec &s) { LOGDEB2(("DocSource::setSortSpec\n")); m_sspec = s; buildStack(); return true; } recoll-1.17.3/query/docseq.h000644 001750 000000 00000015665 11740755063 016305 0ustar00dockeswheel000000 000000 /* 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 _DOCSEQ_H_INCLUDED_ #define _DOCSEQ_H_INCLUDED_ #include #include #include #ifndef NO_NAMESPACES using std::string; using std::list; using std::vector; #endif #include "rcldoc.h" #include "refcntr.h" // A result list entry. struct ResListEntry { Rcl::Doc doc; string subHeader; }; /** Sort specification. */ class DocSeqSortSpec { public: DocSeqSortSpec() : desc(false) {} bool isNotNull() const {return !field.empty();} void reset() {field.erase();} string field; bool desc; }; /** Filtering spec. This is only used to filter by doc category for now, hence the rather specialized interface */ class DocSeqFiltSpec { public: DocSeqFiltSpec() {} enum Crit {DSFS_MIMETYPE, DSFS_QLANG, DSFS_PASSALL}; void orCrit(Crit crit, const string& value) { crits.push_back(crit); values.push_back(value); } std::vector crits; std::vector values; void reset() {crits.clear(); values.clear();} bool isNotNull() const {return crits.size() != 0;} }; /** Interface for a list of documents coming from some source. The result list display data may come from different sources (ie: history or Db query), and be post-processed (DocSeqSorted). Additional functionality like filtering/sorting can either be obtained by stacking DocSequence objects (ie: sorting history), or by native capability (ex: docseqdb can sort and filter). The implementation might be nicer by using more sophisticated c++ with multiple inheritance of sort and filter virtual interfaces, but the current one will have to do for now. */ class DocSequence { public: DocSequence(const string &t) : m_title(t) {} virtual ~DocSequence() {} /** Get document at given rank. * * @param num document rank in sequence * @param doc return data * @param sh subheader to display before this result (ie: date change * inside history) * @return true if ok, false for error or end of data */ virtual bool getDoc(int num, Rcl::Doc &doc, string *sh = 0) = 0; /** Get next page of documents. This accumulates entries into the result * list parameter (doesn't reset it). */ virtual int getSeqSlice(int offs, int cnt, vector& result); /** Get abstract for document. This is special because it may take time. * The default is to return the input doc's abstract fields, but some * sequences can compute a better value (ie: docseqdb) */ virtual bool getAbstract(Rcl::Doc& doc, vector& abs) { abs.push_back(doc.meta[Rcl::Doc::keyabs]); return true; } virtual bool getEnclosing(Rcl::Doc&, Rcl::Doc&) = 0; /** Get estimated total count in results */ virtual int getResCnt() = 0; /** Get title for result list */ virtual string title() {return m_title;} /** Get description for underlying query */ virtual string getDescription() = 0; /** Get search terms (for highlighting abstracts). Some sequences * may have no associated search terms. Implement this for them. */ virtual bool getTerms(vector& terms, vector >& groups, vector& gslks) { terms.clear(); groups.clear(); gslks.clear(); return true; } /** Get user-input terms (before stemming etc.) */ virtual void getUTerms(vector& terms) { terms.clear(); } virtual list expand(Rcl::Doc &) {return list();} /** Optional functionality. */ virtual bool canFilter() {return false;} virtual bool canSort() {return false;} virtual bool setFiltSpec(const DocSeqFiltSpec &) {return false;} virtual bool setSortSpec(const DocSeqSortSpec &) {return false;} virtual RefCntr getSourceSeq() {return RefCntr();} static void set_translations(const string& sort, const string& filt) { o_sort_trans = sort; o_filt_trans = filt; } protected: static string o_sort_trans; static string o_filt_trans; private: string m_title; }; /** A modifier has a child sequence which does the real work and does * something with the results. Some operations are just delegated */ class DocSeqModifier : public DocSequence { public: DocSeqModifier(RefCntr iseq) : DocSequence(""), m_seq(iseq) {} virtual ~DocSeqModifier() {} virtual bool getAbstract(Rcl::Doc& doc, vector& abs) { if (m_seq.isNull()) return false; return m_seq->getAbstract(doc, abs); } virtual string getDescription() { if (m_seq.isNull()) return ""; return m_seq->getDescription(); } virtual bool getTerms(vector& terms, vector >& groups, vector& gslks) { if (m_seq.isNull()) return false; return m_seq->getTerms(terms, groups, gslks); } virtual bool getEnclosing(Rcl::Doc& doc, Rcl::Doc& pdoc) { if (m_seq.isNull()) return false; return m_seq->getEnclosing(doc, pdoc); } virtual void getUTerms(vector& terms) { if (m_seq.isNull()) return; m_seq->getUTerms(terms); } virtual string title() {return m_seq->title();} virtual RefCntr getSourceSeq() {return m_seq;} protected: RefCntr m_seq; }; class RclConfig; // A DocSource can juggle docseqs of different kinds to implement // sorting and filtering in ways depending on the base seqs capabilities class DocSource : public DocSeqModifier { public: DocSource(RclConfig *config, RefCntr iseq) : DocSeqModifier(iseq), m_config(config) {} virtual bool canFilter() {return true;} virtual bool canSort() {return true;} virtual bool setFiltSpec(const DocSeqFiltSpec &); virtual bool setSortSpec(const DocSeqSortSpec &); virtual bool getDoc(int num, Rcl::Doc &doc, string *sh = 0) { if (m_seq.isNull()) return false; return m_seq->getDoc(num, doc, sh); } virtual int getResCnt() { if (m_seq.isNull()) return 0; return m_seq->getResCnt(); } virtual string title(); private: bool buildStack(); void stripStack(); RclConfig *m_config; DocSeqFiltSpec m_fspec; DocSeqSortSpec m_sspec; }; #endif /* _DOCSEQ_H_INCLUDED_ */ recoll-1.17.3/query/docseqdb.cpp000644 001750 000000 00000011224 11740755063 017131 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 "docseqdb.h" #include "rcldb.h" #include "debuglog.h" #include "internfile.h" #include "wasatorcl.h" DocSequenceDb::DocSequenceDb(RefCntr q, const string &t, RefCntr sdata) : DocSequence(t), m_q(q), m_sdata(sdata), m_fsdata(sdata), m_rescnt(-1), m_queryBuildAbstract(true), m_queryReplaceAbstract(false), m_isFiltered(false), m_isSorted(false), m_needSetQuery(false) { } DocSequenceDb::~DocSequenceDb() { } bool DocSequenceDb::getTerms(vector& terms, vector >& groups, vector& gslks) { return m_fsdata->getTerms(terms, groups, gslks); } void DocSequenceDb::getUTerms(vector& terms) { m_sdata->getUTerms(terms); } string DocSequenceDb::getDescription() { return m_fsdata->getDescription(); } bool DocSequenceDb::getDoc(int num, Rcl::Doc &doc, string *sh) { setQuery(); if (sh) sh->erase(); return m_q->getDoc(num, doc); } int DocSequenceDb::getResCnt() { setQuery(); if (m_rescnt < 0) { m_rescnt= m_q->getResCnt(); } return m_rescnt; } bool DocSequenceDb::getAbstract(Rcl::Doc &doc, vector& vabs) { setQuery(); if (m_q->whatDb() && m_queryBuildAbstract && (doc.syntabs || m_queryReplaceAbstract)) { m_q->whatDb()->makeDocAbstract(doc, m_q.getptr(), vabs); } if (vabs.empty()) vabs.push_back(doc.meta[Rcl::Doc::keyabs]); return true; } bool DocSequenceDb::getEnclosing(Rcl::Doc& doc, Rcl::Doc& pdoc) { setQuery(); string udi; if (!FileInterner::getEnclosing(doc.url, doc.ipath, pdoc.url, pdoc.ipath, udi)) return false; return m_q->whatDb()->getDoc(udi, pdoc); } list DocSequenceDb::expand(Rcl::Doc &doc) { setQuery(); return m_q->expand(doc); } string DocSequenceDb::title() { string qual; if (m_isFiltered && !m_isSorted) qual = string(" (") + o_filt_trans + string(")"); else if (!m_isFiltered && m_isSorted) qual = string(" (") + o_sort_trans + string(")"); else if (m_isFiltered && m_isSorted) qual = string(" (") + o_sort_trans + string(",") + o_filt_trans + string(")"); return DocSequence::title() + qual; } bool DocSequenceDb::setFiltSpec(const DocSeqFiltSpec &fs) { LOGDEB(("DocSequenceDb::setFiltSpec\n")); if (fs.isNotNull()) { // We build a search spec by adding a filtering layer to the base one. m_fsdata = RefCntr(new Rcl::SearchData(Rcl::SCLT_AND)); Rcl::SearchDataClauseSub *cl = new Rcl::SearchDataClauseSub(Rcl::SCLT_SUB, m_sdata); m_fsdata->addClause(cl); for (unsigned int i = 0; i < fs.crits.size(); i++) { switch (fs.crits[i]) { case DocSeqFiltSpec::DSFS_MIMETYPE: m_fsdata->addFiletype(fs.values[i]); break; case DocSeqFiltSpec::DSFS_QLANG: { if (m_q.isNull()) break; string reason; Rcl::SearchData *sd = wasaStringToRcl(m_q->whatDb()->getConf(), fs.values[i], reason); if (sd) { Rcl::SearchDataClauseSub *cl1 = new Rcl::SearchDataClauseSub(Rcl::SCLT_SUB, RefCntr(sd)); m_fsdata->addClause(cl1); } } break; default: break; } } m_isFiltered = true; } else { m_fsdata = m_sdata; m_isFiltered = false; } m_needSetQuery = true; return true; } bool DocSequenceDb::setSortSpec(const DocSeqSortSpec &spec) { LOGDEB(("DocSequenceDb::setSortSpec: fld [%s] %s\n", spec.field.c_str(), spec.desc ? "desc" : "asc")); if (spec.isNotNull()) { m_q->setSortBy(spec.field, !spec.desc); m_isSorted = true; } else { m_q->setSortBy(string(), true); m_isSorted = false; } m_needSetQuery = true; return true; } bool DocSequenceDb::setQuery() { if (!m_needSetQuery) return true; m_rescnt = -1; m_needSetQuery = !m_q->setQuery(m_fsdata); return !m_needSetQuery; } recoll-1.17.3/query/docseqdb.h000644 001750 000000 00000004674 11740755063 016611 0ustar00dockeswheel000000 000000 /* 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 _DOCSEQDB_H_INCLUDED_ #define _DOCSEQDB_H_INCLUDED_ #include "docseq.h" #include "refcntr.h" #include "searchdata.h" #include "rclquery.h" /** A DocSequence from a Db query */ class DocSequenceDb : public DocSequence { public: DocSequenceDb(RefCntr q, const string &t, RefCntr sdata); virtual ~DocSequenceDb(); virtual bool getDoc(int num, Rcl::Doc &doc, string * = 0); virtual int getResCnt(); virtual bool getTerms(vector& terms, vector >& groups, vector& gslks); virtual void getUTerms(vector& terms); virtual bool getAbstract(Rcl::Doc &doc, vector&); virtual bool getEnclosing(Rcl::Doc& doc, Rcl::Doc& pdoc); virtual string getDescription(); virtual list expand(Rcl::Doc &doc); virtual bool canFilter() {return true;} virtual bool setFiltSpec(const DocSeqFiltSpec &filtspec); virtual bool canSort() {return true;} virtual bool setSortSpec(const DocSeqSortSpec &sortspec); virtual void setAbstractParams(bool qba, bool qra) { m_queryBuildAbstract = qba; m_queryReplaceAbstract = qra; } virtual string title(); private: RefCntr m_q; RefCntr m_sdata; RefCntr m_fsdata; // Filtered int m_rescnt; bool m_queryBuildAbstract; bool m_queryReplaceAbstract; bool m_isFiltered; bool m_isSorted; bool m_needSetQuery; // search data changed, need to reapply before fetch bool setQuery(); }; #endif /* _DOCSEQDB_H_INCLUDED_ */ recoll-1.17.3/query/docseqhist.cpp000644 001750 000000 00000010526 11740755063 017517 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #include "docseqhist.h" #include "rcldb.h" #include "fileudi.h" #include "internfile.h" #include "base64.h" #include "debuglog.h" #include "smallut.h" // Encode document history entry: // U + Unix time + base64 of udi // The U distinguishes udi-based entries from older fn+ipath ones bool RclDHistoryEntry::encode(string& value) { char chartime[30]; sprintf(chartime,"%ld", unixtime); string budi; base64_encode(udi, budi); value = string("U ") + string(chartime) + " " + budi; return true; } // Decode. We support historical entries which were like "time b64fn [b64ipath]" // Current entry format is "U time b64udi" bool RclDHistoryEntry::decode(const string &value) { list vall; stringToStrings(value, vall); list::const_iterator it = vall.begin(); udi.erase(); string fn, ipath; switch (vall.size()) { case 2: // Old fn+ipath, null ipath case unixtime = atol((*it++).c_str()); base64_decode(*it++, fn); break; case 3: if (!it->compare("U")) { // New udi-based entry it++; unixtime = atol((*it++).c_str()); base64_decode(*it++, udi); } else { // Old fn + ipath. We happen to know how to build an udi unixtime = atol((*it++).c_str()); base64_decode(*it++, fn); base64_decode(*it, ipath); } break; default: return false; } if (!fn.empty()) { // Old style entry found, make an udi, using the fs udi maker make_udi(fn, ipath, udi); } LOGDEB1(("RclDHistoryEntry::decode: udi [%s]\n", udi.c_str())); return true; } bool RclDHistoryEntry::equal(const DynConfEntry& other) { const RclDHistoryEntry& e = dynamic_cast(other); return e.udi == udi; } bool historyEnterDoc(RclDynConf *dncf, const string& udi) { LOGDEB1(("historyEnterDoc: [%s] into %s\n", udi.c_str(), dncf->getFilename().c_str())); RclDHistoryEntry ne(time(0), udi); RclDHistoryEntry scratch; return dncf->insertNew(docHistSubKey, ne, scratch, 200); } list getDocHistory(RclDynConf* dncf) { return dncf->getList(docHistSubKey); } bool DocSequenceHistory::getDoc(int num, Rcl::Doc &doc, string *sh) { // Retrieve history list if (!m_hist) return false; if (m_hlist.empty()) m_hlist = getDocHistory(m_hist); if (num < 0 || num >= (int)m_hlist.size()) return false; int skip; if (m_prevnum >= 0 && num >= m_prevnum) { skip = num - m_prevnum; } else { skip = num; m_it = m_hlist.begin(); m_prevtime = -1; } m_prevnum = num; while (skip--) m_it++; if (sh) { if (m_prevtime < 0 || abs (float(m_prevtime) - float(m_it->unixtime)) > 86400) { m_prevtime = m_it->unixtime; time_t t = (time_t)(m_it->unixtime); *sh = string(ctime(&t)); // Get rid of the final \n in ctime sh->erase(sh->length()-1); } else sh->erase(); } bool ret = m_db->getDoc(m_it->udi, doc); if (!ret) { doc.url = "UNKNOWN"; doc.ipath = ""; } return ret; } bool DocSequenceHistory::getEnclosing(Rcl::Doc& doc, Rcl::Doc& pdoc) { string udi; if (!FileInterner::getEnclosing(doc.url, doc.ipath, pdoc.url, pdoc.ipath, udi)) return false; return m_db->getDoc(udi, pdoc); } int DocSequenceHistory::getResCnt() { if (m_hlist.empty()) m_hlist = getDocHistory(m_hist); return m_hlist.size(); } recoll-1.17.3/query/docseqhist.h000644 001750 000000 00000004517 11740755063 017167 0ustar00dockeswheel000000 000000 /* 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 _DOCSEQHIST_H_INCLUDED_ #define _DOCSEQHIST_H_INCLUDED_ #include "docseq.h" #include "dynconf.h" namespace Rcl { class Db; } /** DynConf Document history entry */ class RclDHistoryEntry : public DynConfEntry { public: RclDHistoryEntry() : unixtime(0) {} RclDHistoryEntry(long t, const string& u) : unixtime(t), udi(u) {} virtual ~RclDHistoryEntry() {} virtual bool decode(const string &value); virtual bool encode(string& value); virtual bool equal(const DynConfEntry& other); long unixtime; string udi; }; /** A DocSequence coming from the history file. * History is kept as a list of urls. This queries the db to fetch * metadata for an url key */ class DocSequenceHistory : public DocSequence { public: DocSequenceHistory(Rcl::Db *d, RclDynConf *h, const string &t) : DocSequence(t), m_db(d), m_hist(h), m_prevnum(-1), m_prevtime(-1) {} virtual ~DocSequenceHistory() {} virtual bool getDoc(int num, Rcl::Doc &doc, string *sh = 0); virtual bool getEnclosing(Rcl::Doc& doc, Rcl::Doc& pdoc); virtual int getResCnt(); virtual string getDescription() {return m_description;} void setDescription(const string& desc) {m_description = desc;} private: Rcl::Db *m_db; RclDynConf *m_hist; int m_prevnum; long m_prevtime; string m_description; // This is just an nls translated 'doc history' list m_hlist; list::const_iterator m_it; }; extern bool historyEnterDoc(RclDynConf *dncf, const string& udi); #endif /* _DOCSEQ_H_INCLUDED_ */ recoll-1.17.3/query/dynconf.cpp000644 001750 000000 00000013663 11740755063 017016 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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_HISTORY #include #include #include #include "dynconf.h" #include "base64.h" #include "smallut.h" #include "debuglog.h" #ifndef NO_NAMESPACES using namespace std; #endif // Well known keys for history and external indexes. const string docHistSubKey = "docs"; const string allEdbsSk = "allExtDbs"; const string actEdbsSk = "actExtDbs"; // @param sk section this is for // @param n new entry // @param s a scratch entry used for decoding and comparisons. // This avoids templating this routine for the actual entry type. bool RclDynConf::insertNew(const string &sk, DynConfEntry &n, DynConfEntry &s, int maxlen) { // Is this doc already in list ? If it is we remove the old entry list names = m_data.getNames(sk); list::const_iterator it; bool changed = false; for (it = names.begin(); it != names.end(); it++) { string oval; if (!m_data.get(*it, oval, sk)) { LOGDEB(("No data for %s\n", (*it).c_str())); continue; } s.decode(oval); if (s.equal(n)) { LOGDEB(("Erasing old entry\n")); m_data.erase(*it, sk); changed = true; } } // Maybe reget list if (changed) names = m_data.getNames(sk); // Need to prune ? if (maxlen > 0 && names.size() >= (unsigned int)maxlen) { // Need to erase entries until we're back to size. Note that // we don't ever reset numbers. Problems will arise when // history is 4 billion entries old it = names.begin(); for (unsigned int i = 0; i < names.size() - maxlen + 1; i++, it++) { m_data.erase(*it, sk); } } // Increment highest number unsigned int hi = names.empty() ? 0 : (unsigned int)atoi(names.back().c_str()); hi++; char nname[20]; sprintf(nname, "%010u", hi); string value; n.encode(value); LOGDEB1(("Encoded value [%s] (%d)\n", value.c_str(), value.size())); if (!m_data.set(string(nname), value, sk)) { LOGERR(("RclDHistory::insertNew: set failed\n")); return false; } return true; } bool RclDynConf::eraseAll(const string &sk) { list names = m_data.getNames(sk); list::const_iterator it; for (it = names.begin(); it != names.end(); it++) { m_data.erase(*it, sk); } return true; } // Generic string list specialization /////////////////////////////////// // Encode/decode simple string. base64 used to avoid problems with // strange chars bool RclSListEntry::encode(string& enc) { base64_encode(value, enc); return true; } bool RclSListEntry::decode(const string &enc) { base64_decode(enc, value); return true; } bool RclSListEntry::equal(const DynConfEntry& other) { const RclSListEntry& e = dynamic_cast(other); return e.value == value; } bool RclDynConf::enterString(const string sk, const string value, int maxlen) { RclSListEntry ne(value); RclSListEntry scratch; return insertNew(sk, ne, scratch, maxlen); } list RclDynConf::getStringList(const string sk) { list el = getList(sk); list sl; for (list::const_iterator it = el.begin(); it != el.end(); it++) sl.push_back(it->value); return sl; } #else #include #include #include "history.h" #include "debuglog.h" #ifndef NO_NAMESPACES using namespace std; #endif static string thisprog; static string usage = "trhist [opts] \n" " [-s ]: specify subkey (default: RclDynConf::docHistSubKey)\n" " [-e] : erase all\n" " [-a ] enter string (needs -s, no good for history entries\n" "\n" ; static void Usage(void) { cerr << thisprog << ": usage:\n" << usage; exit(1); } static int op_flags; #define OPT_e 0x2 #define OPT_s 0x4 #define OPT_a 0x8 int main(int argc, char **argv) { string sk = "docs"; string value; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'a': op_flags |= OPT_a; if (argc < 2) Usage(); value = *(++argv); argc--; goto b1; case 's': op_flags |= OPT_s; if (argc < 2) Usage(); sk = *(++argv); argc--; goto b1; case 'e': op_flags |= OPT_e; break; default: Usage(); break; } b1: argc--; argv++; } if (argc != 1) Usage(); string filename = *argv++;argc--; RclDynConf hist(filename, 5); DebugLog::getdbl()->setloglevel(DEBDEB1); DebugLog::setfilename("stderr"); if (op_flags & OPT_e) { hist.eraseAll(sk); } else if (op_flags & OPT_a) { if (!(op_flags & OPT_s)) Usage(); hist.enterString(sk, value); } else { for (int i = 0; i < 10; i++) { char docname[100]; sprintf(docname, "A very long document document name" "is very long indeed and this is the end of " "it here and exactly here:\n%d", i); hist.enterDoc(string(docname), "ipathx"); } list hlist = hist.getDocHistory(); for (list::const_iterator it = hlist.begin(); it != hlist.end(); it++) { printf("[%ld] [%s] [%s]\n", it->unixtime, it->fn.c_str(), it->ipath.c_str()); } } } #endif recoll-1.17.3/query/dynconf.h000644 001750 000000 00000007076 11740755063 016464 0ustar00dockeswheel000000 000000 /* 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 _DYNCONF_H_INCLUDED_ #define _DYNCONF_H_INCLUDED_ /** * Dynamic configuration storage * * This used to be called "history" because of the initial usage. * Used to store some parameters which would fit neither in recoll.conf, * basically because they change a lot, nor in the QT preferences file, mostly * because they are specific to a configuration directory. * Examples: * - History of documents selected for preview * - Active and inactive external databases (depend on the * configuration directory) * - ... * * The storage is performed in a ConfSimple file, with subkeys and * encodings which depend on the data stored. Under each section, the keys * are sequential numeric, so this basically manages a set of lists. * */ #include #include #include #include "conftree.h" #ifndef NO_NAMESPACES using namespace std; #endif // Entry interface. class DynConfEntry { public: virtual ~DynConfEntry() {} virtual bool decode(const string &value) = 0; virtual bool encode(string& value) = 0; virtual bool equal(const DynConfEntry &other) = 0; }; /** String storage generic object */ class RclSListEntry : public DynConfEntry { public: RclSListEntry() {} RclSListEntry(const string& v) : value(v) {} virtual ~RclSListEntry() {} virtual bool decode(const string &enc); virtual bool encode(string& enc); virtual bool equal(const DynConfEntry& other); string value; }; /** The dynamic configuration class */ class RclDynConf { public: RclDynConf(const string &fn) : m_data(fn.c_str()) {} bool ok() {return m_data.getStatus() == ConfSimple::STATUS_RW;} string getFilename() {return m_data.getFilename();} // Generic methods bool eraseAll(const string& sk); bool insertNew(const string& sk, DynConfEntry &n, DynConfEntry &s, int maxlen = -1); template list getList(const string& sk); // Specialized methods for simple string lists, designated by the // subkey value bool enterString(const string sk, const string value, int maxlen = -1); list getStringList(const string sk); private: unsigned int m_mlen; ConfSimple m_data; }; template list RclDynConf::getList(const string &sk) { list mlist; Tp entry; list names = m_data.getNames(sk); for (list::const_iterator it = names.begin(); it != names.end(); it++) { string value; if (m_data.get(*it, value, sk)) { if (!entry.decode(value)) continue; mlist.push_front(entry); } } return mlist; } // Defined subkeys. Values in dynconf.cpp // History extern const string docHistSubKey; // All external indexes extern const string allEdbsSk; // Active external indexes extern const string actEdbsSk; #endif /* _DYNCONF_H_INCLUDED_ */ recoll-1.17.3/query/filtseq.cpp000644 001750 000000 00000007232 11740755063 017020 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 "debuglog.h" #include "filtseq.h" #include "rclconfig.h" using std::string; static bool filter(const DocSeqFiltSpec& fs, const Rcl::Doc *x) { LOGDEB2((" Filter: ncrits %d\n", fs.crits.size())); // Compare using each criterion in term. We're doing an or: // 1st ok ends for (unsigned int i = 0; i < fs.crits.size(); i++) { switch (fs.crits[i]) { case DocSeqFiltSpec::DSFS_MIMETYPE: LOGDEB2((" filter: MIMETYPE: me [%s] doc [%s]\n", fs.values[i].c_str(), x->mimetype.c_str())); if (x->mimetype == fs.values[i]) return true; break; case DocSeqFiltSpec::DSFS_QLANG: { LOGDEB((" filter: QLANG [%s]!!\n", fs.values[i].c_str())); } break; case DocSeqFiltSpec::DSFS_PASSALL: return true; } } // Did all comparisons return false; } DocSeqFiltered::DocSeqFiltered(RclConfig *conf, RefCntr iseq, DocSeqFiltSpec &filtspec) : DocSeqModifier(iseq), m_config(conf) { setFiltSpec(filtspec); } bool DocSeqFiltered::setFiltSpec(DocSeqFiltSpec &filtspec) { LOGDEB0(("DocSeqFiltered::setFiltSpec\n")); for (unsigned int i = 0; i < filtspec.crits.size(); i++) { switch (filtspec.crits[i]) { case DocSeqFiltSpec::DSFS_MIMETYPE: m_spec.orCrit(filtspec.crits[i], filtspec.values[i]); break; case DocSeqFiltSpec::DSFS_QLANG: { // There are very few lang constructs that we can // interpret. The default config uses rclcat:value // only. That will be all for now... string val = filtspec.values[i]; if (val.find("rclcat:") == 0) { string catg = val.substr(7); list tps; m_config->getMimeCatTypes(catg, tps); for (list::const_iterator it = tps.begin(); it != tps.end(); it++) { LOGDEB2(("Adding mime: [%s]\n", it->c_str())); m_spec.orCrit(DocSeqFiltSpec::DSFS_MIMETYPE, *it); } } } break; default: break; } } // If m_spec ends up empty, pass everything, better than filtering all. if (m_spec.crits.empty()) { m_spec.orCrit(DocSeqFiltSpec::DSFS_PASSALL, ""); } m_dbindices.clear(); return true; } bool DocSeqFiltered::getDoc(int idx, Rcl::Doc &doc, string *) { LOGDEB2(("DocSeqFiltered::getDoc() fetching %d\n", idx)); if (idx >= (int)m_dbindices.size()) { // Have to fetch docs and filter until we get enough or // fail m_dbindices.reserve(idx+1); // First backend seq doc we fetch is the one after last stored int backend_idx = m_dbindices.size() > 0 ? m_dbindices.back() + 1 : 0; // Loop until we get enough docs Rcl::Doc tdoc; int i = 0; while (idx >= (int)m_dbindices.size()) { if (!m_seq->getDoc(backend_idx, tdoc)) return false; if (filter(m_spec, &tdoc)) { m_dbindices.push_back(backend_idx); } backend_idx++; } doc = tdoc; } else { // The corresponding backend indice is already known if (!m_seq->getDoc(m_dbindices[idx], doc)) return false; } return true; } recoll-1.17.3/query/filtseq.h000644 001750 000000 00000003144 11740755063 016463 0ustar00dockeswheel000000 000000 /* 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 _FILTSEQ_H_INCLUDED_ #define _FILTSEQ_H_INCLUDED_ #include #include using std::string; using std::vector; #include "refcntr.h" #include "docseq.h" class RclConfig; /** * A filtered sequence is created from another one by selecting entries * according to the given criteria. */ class DocSeqFiltered : public DocSeqModifier { public: DocSeqFiltered(RclConfig *conf, RefCntr iseq, DocSeqFiltSpec &filtspec); virtual ~DocSeqFiltered() {} virtual bool canFilter() {return true;} virtual bool setFiltSpec(DocSeqFiltSpec &filtspec); virtual bool getDoc(int num, Rcl::Doc &doc, string *sh = 0); virtual int getResCnt() {return m_seq->getResCnt();} private: RclConfig *m_config; DocSeqFiltSpec m_spec; vector m_dbindices; }; #endif /* _FILTSEQ_H_INCLUDED_ */ recoll-1.17.3/query/plaintorich.cpp000644 001750 000000 00000037415 11740755063 017673 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #include #include #include #ifndef NO_NAMESPACES using std::vector; using std::list; using std::pair; using std::set; #endif /* NO_NAMESPACES */ #include "rcldb.h" #include "rclconfig.h" #include "debuglog.h" #include "textsplit.h" #include "utf8iter.h" #include "smallut.h" #include "plaintorich.h" #include "cancelcheck.h" #include "unacpp.h" // For debug printing static string vecStringToString(const vector& t) { string sterms; for (vector::const_iterator it = t.begin(); it != t.end(); it++) { sterms += "[" + *it + "] "; } return sterms; } // Text splitter callback used to take note of the position of query terms // inside the result text. This is then used to insert highlight tags. class TextSplitPTR : public TextSplit { public: // Out: begin and end byte positions of query terms/groups in text vector > tboffs; TextSplitPTR(const vector& its, const vector >&groups, const vector& slacks) : m_wcount(0), m_groups(groups), m_slacks(slacks) { for (vector::const_iterator it = its.begin(); it != its.end(); it++) { m_terms.insert(*it); } for (vector >::const_iterator vit = m_groups.begin(); vit != m_groups.end(); vit++) { for (vector::const_iterator it = (*vit).begin(); it != (*vit).end(); it++) { m_gterms.insert(*it); } } } // Callback called by the text-to-words breaker for each word virtual bool takeword(const std::string& term, int pos, int bts, int bte) { string dumb; if (!unacmaybefold(term, dumb, "UTF-8", true)) { LOGINFO(("PlainToRich::splitter::takeword: unac failed for [%s]\n", term.c_str())); return true; } //LOGDEB2(("Input dumbbed term: '%s' %d %d %d\n", dumb.c_str(), // pos, bts, bte)); // If this word is a search term, remember its byte-offset span. if (m_terms.find(dumb) != m_terms.end()) { tboffs.push_back(pair(bts, bte)); } if (m_gterms.find(dumb) != m_gterms.end()) { // Term group (phrase/near) handling m_plists[dumb].push_back(pos); m_gpostobytes[pos] = pair(bts, bte); //LOGDEB2(("Recorded bpos for %d: %d %d\n", pos, bts, bte)); } if ((m_wcount++ & 0xfff) == 0) CancelCheck::instance().checkCancel(); return true; } // Must be called after the split to find the phrase/near match positions virtual bool matchGroups(); private: virtual bool matchGroup(const vector& terms, int dist); int m_wcount; // In: user query terms set m_terms; // In: user query groups, for near/phrase searches. const vector >& m_groups; const vector& m_slacks; set m_gterms; // group/near terms word positions. map > m_plists; map > m_gpostobytes; }; /** Sort by shorter comparison class */ class VecIntCmpShorter { public: /** Return true if and only if a is strictly shorter than b. */ bool operator()(const vector *a, const vector *b) { return a->size() < b->size(); } }; #define SETMINMAX(POS, STA, STO) {if ((POS) < (STA)) (STA) = (POS); \ if ((POS) > (STO)) (STO) = (POS);} // Recursively check that each term is inside the window (which is // readjusted as the successive terms are found). i is the index for // the next position list to use (initially 1) static bool do_proximity_test(int window, vector* >& plists, unsigned int i, int min, int max, int *sp, int *ep) { int tmp = max + 1; // take care to avoid underflow if (window <= tmp) tmp -= window; else tmp = 0; vector::iterator it = plists[i]->begin(); // Find 1st position bigger than window start while (it != plists[i]->end() && *it < tmp) it++; // Try each position inside window in turn for match with other lists while (it != plists[i]->end()) { int pos = *it; if (pos > min + window - 1) return false; if (i + 1 == plists.size()) { SETMINMAX(pos, *sp, *ep); return true; } if (pos < min) { min = pos; } else if (pos > max) { max = pos; } if (do_proximity_test(window, plists, i + 1, min, max, sp, ep)) { SETMINMAX(pos, *sp, *ep); return true; } it++; } return false; } // Check if there is a NEAR match for the group of terms bool TextSplitPTR::matchGroup(const vector& terms, int window) { LOGDEB0(("TextSplitPTR::matchGroup:d %d: %s\n", window, vecStringToString(terms).c_str())); // The position lists we are going to work with. We extract them from the // (string->plist) map vector* > plists; // A revert plist->term map. This is so that we can find who is who after // sorting the plists by length. map*, string> plistToTerm; // For traces vector realgroup; // Find the position list for each term in the group. Not all // necessarily exist (esp for NEAR where terms have been // stem-expanded: we don't know which matched) for (vector::const_iterator it = terms.begin(); it != terms.end(); it++) { map >::iterator pl = m_plists.find(*it); if (pl == m_plists.end()) { LOGDEB0(("TextSplitPTR::matchGroup: [%s] not found in m_plists\n", (*it).c_str())); continue; } plists.push_back(&(pl->second)); plistToTerm[&(pl->second)] = *it; realgroup.push_back(*it); } LOGDEB0(("TextSplitPTR::matchGroup:d %d:real group after expansion %s\n", window, vecStringToString(realgroup).c_str())); if (plists.size() < 2) { LOGDEB0(("TextSplitPTR::matchGroup: no actual groups found\n")); return false; } // Sort the positions lists so that the shorter is first std::sort(plists.begin(), plists.end(), VecIntCmpShorter()); { // Debug map*, string>::iterator it; it = plistToTerm.find(plists[0]); if (it == plistToTerm.end()) { // SuperWeird LOGERR(("matchGroup: term for first list not found !?!\n")); return false; } LOGDEB0(("matchGroup: walking the shortest plist. Term [%s], len %d\n", it->second.c_str(), plists[0]->size())); } // Walk the shortest plist and look for matches for (vector::iterator it = plists[0]->begin(); it != plists[0]->end(); it++) { int pos = *it; int sta = int(10E9), sto = 0; LOGDEB0(("MatchGroup: Testing at pos %d\n", pos)); if (do_proximity_test(window, plists, 1, pos, pos, &sta, &sto)) { LOGDEB0(("TextSplitPTR::matchGroup: MATCH termpos [%d,%d]\n", sta, sto)); // Maybe extend the window by 1st term position, this was not // done by do_prox.. SETMINMAX(pos, sta, sto); // Translate the position window into a byte offset window int bs = 0; map >::iterator i1 = m_gpostobytes.find(sta); map >::iterator i2 = m_gpostobytes.find(sto); if (i1 != m_gpostobytes.end() && i2 != m_gpostobytes.end()) { LOGDEB0(("TextSplitPTR::matchGroup: pushing bpos %d %d\n", i1->second.first, i2->second.second)); tboffs.push_back(pair(i1->second.first, i2->second.second)); bs = i1->second.first; } else { LOGDEB(("matchGroup: no bpos found for %d or %d\n", sta, sto)); } } } return true; } /** Sort integer pairs by increasing first value and decreasing width */ class PairIntCmpFirst { public: bool operator()(pair a, pairb) { if (a.first != b.first) return a.first < b.first; return a.second > b.second; } }; // Do the phrase match thing, then merge the highlight lists bool TextSplitPTR::matchGroups() { vector >::const_iterator vit = m_groups.begin(); vector::const_iterator sit = m_slacks.begin(); for (; vit != m_groups.end() && sit != m_slacks.end(); vit++, sit++) { matchGroup(*vit, *sit + (*vit).size()); } // Sort by start and end offsets. The merging of overlapping entries // will be handled during output. std::sort(tboffs.begin(), tboffs.end(), PairIntCmpFirst()); return true; } // Fix result text for display inside the gui text window. // // To compute the term character positions in the output text, we used // to emulate how qt's textedit counts chars (ignoring tags and // duplicate whitespace etc...). This was tricky business, dependant // on qtextedit internals, and we don't do it any more, so we finally // don't know the term par/car positions in the editor text. // Instead, we now mark the search term positions with html anchors // // We output the result in chunks, arranging not to cut in the middle of // a tag, which would confuse qtextedit. bool PlainToRich::plaintorich(const string& in, list& out, // Output chunk list const HiliteData& hdata, int chunksize) { Chrono chron; const vector& terms(hdata.terms); const vector >& groups(hdata.groups); const vector& slacks(hdata.gslks); if (0 && DebugLog::getdbl()->getlevel() >= DEBDEB0) { LOGDEB0(("plaintorich: terms: \n")); string sterms = vecStringToString(terms); LOGDEB0((" %s\n", sterms.c_str())); sterms = "\n"; LOGDEB0(("plaintorich: groups: \n")); for (vector >::const_iterator vit = groups.begin(); vit != groups.end(); vit++) { sterms += "GROUP: "; sterms += vecStringToString(*vit); sterms += "\n"; } LOGDEB0((" %s", sterms.c_str())); LOGDEB2((" TEXT:[%s]\n", in.c_str())); } // Compute the positions for the query terms. We use the text // splitter to break the text into words, and compare the words to // the search terms, TextSplitPTR splitter(terms, groups, slacks); // Note: the splitter returns the term locations in byte, not // character, offsets. splitter.text_to_words(in); LOGDEB2(("plaintorich: split done %d mS\n", chron.millis())); // Compute the positions for NEAR and PHRASE groups. splitter.matchGroups(); out.clear(); out.push_back(""); list::iterator olit = out.begin(); // Rich text output *olit = header(); // Iterator for the list of input term positions. We use it to // output highlight tags and to compute term positions in the // output text vector >::iterator tPosIt = splitter.tboffs.begin(); vector >::iterator tPosEnd = splitter.tboffs.end(); #if 0 for (vector >::const_iterator it = splitter.tboffs.begin(); it != splitter.tboffs.end(); it++) { LOGDEB2(("plaintorich: region: %d %d\n", it->first, it->second)); } #endif // Input character iterator Utf8Iter chariter(in); // State variables used to limit the number of consecutive empty lines, // convert all eol to '\n', and preserve some indentation int eol = 0; int hadcr = 0; int inindent = 1; // Value for numbered anchors at each term match int anchoridx = 1; // HTML state bool intag = false, inparamvalue = false; // My tag state int inrcltag = 0; string::size_type headend = 0; if (m_inputhtml) { headend = in.find(""); if (headend == string::npos) headend = in.find(""); if (headend != string::npos) headend += 7; } for (string::size_type pos = 0; pos != string::npos; pos = chariter++) { // Check from time to time if we need to stop if ((pos & 0xfff) == 0) { CancelCheck::instance().checkCancel(); } // If we still have terms positions, check (byte) position. If // we are at or after a term match, mark. if (tPosIt != tPosEnd) { int ibyteidx = chariter.getBpos(); if (ibyteidx == tPosIt->first) { if (!intag && ibyteidx > (int)headend) { *olit += startAnchor(anchoridx); *olit += startMatch(); } anchoridx++; inrcltag = 1; } else if (ibyteidx == tPosIt->second) { // Output end of match region tags if (!intag && ibyteidx > (int)headend) { *olit += endMatch(); *olit += endAnchor(); } // Skip all highlight areas that would overlap this one int crend = tPosIt->second; while (tPosIt != splitter.tboffs.end() && tPosIt->first < crend) tPosIt++; inrcltag = 0; } } unsigned int car = *chariter; if (car == '\n') { if (!hadcr) eol++; hadcr = 0; continue; } else if (car == '\r') { hadcr++; eol++; continue; } else if (eol) { // Got non eol char in line break state. Do line break; inindent = 1; hadcr = 0; if (eol > 2) eol = 2; while (eol) { if (!m_inputhtml && m_eolbr) *olit += "
"; *olit += "\n"; eol--; } // Maybe end this chunk, begin next. Don't do it on html // there is just no way to do it right (qtextedit cant grok // chunks cut in the middle of
for example). if (!m_inputhtml && !inrcltag && olit->size() > (unsigned int)chunksize) { out.push_back(string(startChunk())); olit++; } } switch (car) { case '<': inindent = 0; if (m_inputhtml) { if (!inparamvalue) intag = true; chariter.appendchartostring(*olit); } else { *olit += "<"; } break; case '>': inindent = 0; if (m_inputhtml) { if (!inparamvalue) intag = false; } chariter.appendchartostring(*olit); break; case '&': inindent = 0; if (m_inputhtml) { chariter.appendchartostring(*olit); } else { *olit += "&"; } break; case '"': inindent = 0; if (m_inputhtml && intag) { inparamvalue = !inparamvalue; } chariter.appendchartostring(*olit); break; case ' ': if (m_eolbr && inindent) { *olit += " "; } else { chariter.appendchartostring(*olit); } break; case '\t': if (m_eolbr && inindent) { *olit += "    "; } else { chariter.appendchartostring(*olit); } break; default: inindent = 0; chariter.appendchartostring(*olit); } } // End chariter loop #if 0 { FILE *fp = fopen("/tmp/debugplaintorich", "a"); fprintf(fp, "BEGINOFPLAINTORICHOUTPUT\n"); for (list::iterator it = out.begin(); it != out.end(); it++) { fprintf(fp, "BEGINOFPLAINTORICHCHUNK\n"); fprintf(fp, "%s", it->c_str()); fprintf(fp, "ENDOFPLAINTORICHCHUNK\n"); } fprintf(fp, "ENDOFPLAINTORICHOUTPUT\n"); fclose(fp); } #endif LOGDEB2(("plaintorich: done %d mS\n", chron.millis())); return true; } recoll-1.17.3/query/plaintorich.h000644 001750 000000 00000006554 11740755063 017340 0ustar00dockeswheel000000 000000 /* 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 _PLAINTORICH_H_INCLUDED_ #define _PLAINTORICH_H_INCLUDED_ #include #include using std::list; using std::string; /// Holder for plaintorich() input data: words and groups of words to /// be highlighted struct HiliteData { // Single terms vector terms; // NEAR and PHRASE elements vector > groups; // Group slacks (number of permitted non-matched words). // Parallel vector to the above 'groups' vector gslks; void reset() { terms.clear(); groups.clear(); gslks.clear(); } }; /** * A class for highlighting search results. Overridable methods allow * for different styles. We can handle plain text or html input. In the latter * case, we may fail to highligt term groups if they are mixed with html tags. */ class PlainToRich { public: PlainToRich() : m_inputhtml(false) {} virtual ~PlainToRich() {} void set_inputhtml(bool v) {m_inputhtml = v;} /** * Transform plain text for highlighting search terms, ie in the * preview window or result list entries. * * The actual tags used for highlighting and anchoring are * determined by deriving from this class which handles the searching for * terms and groups, but there is an assumption that the output will be * html-like: we escape characters like < or & * * Finding the search terms is relatively complicated because of * phrase/near searches, which need group highlights. As a matter * of simplification, we handle "phrase" as "near", not filtering * on word order. * * @param in raw text out of internfile. * @param out rich text output, divided in chunks (to help our caller * avoid inserting half tags into textedit which doesnt like it) * @param hdata terms and groups to be highlighted. These are * lowercase and unaccented. * @param chunksize max size of chunks in output list */ virtual bool plaintorich(const string &in, list &out, const HiliteData& hdata, int chunksize = 50000 ); /* Methods to ouput headers, highlighting and marking tags */ virtual string header() {return snull;} virtual string startMatch() {return snull;} virtual string endMatch() {return snull;} virtual string startAnchor(int) {return snull;} virtual string endAnchor() {return snull;} virtual string startChunk() {return snull;} protected: const string snull; bool m_inputhtml; // Use
to break plain text lines (else caller has used a

 tag)
    bool m_eolbr; 
};

#endif /* _PLAINTORICH_H_INCLUDED_ */
recoll-1.17.3/query/recollq.cpp000644 001750 000000 00000027601 11740755063 017014 0ustar00dockeswheel000000 000000 /* 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.
 */
// Takes a query and run it, no gui, results to stdout

#ifndef TEST_RECOLLQ
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
using namespace std;

#include "rcldb.h"
#include "rclquery.h"
#include "rclconfig.h"
#include "pathut.h"
#include "rclinit.h"
#include "debuglog.h"
#include "wasastringtoquery.h"
#include "wasatorcl.h"
#include "internfile.h"
#include "wipedir.h"
#include "transcode.h"
#include "textsplit.h"
#include "smallut.h"
#include "base64.h"

bool dump_contents(RclConfig *rclconfig, TempDir& tmpdir, Rcl::Doc& idoc)
{
    FileInterner interner(idoc, rclconfig, tmpdir,
                          FileInterner::FIF_forPreview);
    Rcl::Doc fdoc;
    string ipath = idoc.ipath;
    if (interner.internfile(fdoc, ipath)) {
	cout << fdoc.text << endl;
    } else {
	cout << "Cant turn to text:" << idoc.url << " | " << idoc.ipath << endl;
    }
    return true;
}

void output_fields(const vectorfields, Rcl::Doc& doc,
		   Rcl::Query& query, Rcl::Db& rcldb)
{
    for (vector::const_iterator it = fields.begin();
	 it != fields.end(); it++) {
	string out;
	if (!it->compare("abstract")) {
	    string abstract;
	    rcldb.makeDocAbstract(doc, &query, abstract);
	    base64_encode(abstract, out);
	} else {
	    base64_encode(doc.meta[*it], out);
	}
	cout << out << " ";
    }
    cout << endl;
}

static char *thisprog;
static char usage [] =
" -P: Show the date span for all the documents present in the index\n"
" [-o|-a|-f] [-q] \n"
" Runs a recoll query and displays result lines. \n"
"  Default: will interpret the argument(s) as a xesam query string\n"
"    query may be like: \n"
"    implicit AND, Exclusion, field spec:    t1 -t2 title:t3\n"
"    OR has priority: t1 OR t2 t3 OR t4 means (t1 OR t2) AND (t3 OR t4)\n"
"    Phrase: \"t1 t2\" (needs additional quoting on cmd line)\n"
"  -o Emulate the GUI simple search in ANY TERM mode\n"
"  -a Emulate the GUI simple search in ALL TERMS mode\n"
"  -f Emulate the GUI simple search in filename mode\n"
"  -q is just ignored (compatibility with the recoll GUI command line)\n"
"Common options:\n"
"    -c  : specify config directory, overriding $RECOLL_CONFDIR\n"
"    -d also dump file contents\n"
"    -n [first-] define the result slice. The default value for [first]\n"
"       is 0. Without the option, the default max count is 2000.\n"
"       Use n=0 for no limit\n"
"    -b : basic. Just output urls, no mime types or titles\n"
"    -Q : no result lines, just the processed query and result count\n"
"    -m : dump the whole document meta[] array for each result\n"
"    -A : output the document abstracts\n"
"    -S fld : sort by field \n"
"    -D : sort descending\n"
"    -i  : additional index, several can be given\n"
"    -e use url encoding (%xx) for urls\n"
"    -F  : output exactly these fields for each result.\n"
"       The field values are encoded in base64, output in one line and \n"
"       separated by one space character. This is the recommended format \n"
"       for use by other programs. Use a normal query with option -m to \n"
"       see the field names.\n"
;
static void
Usage(void)
{
    cerr << thisprog <<  ": usage:" << endl << usage;
    exit(1);
}

// ATTENTION A LA COMPATIBILITE AVEC LES OPTIONS DE recoll
// -q, -t and -l are accepted and ignored
// -a/f/o -c have the same meaning
// -h is not used

static int     op_flags;
#define OPT_A     0x1
#define OPT_a     0x2
#define OPT_b     0x4
#define OPT_c     0x8
#define OPT_D     0x10
#define OPT_d     0x20
#define OPT_f     0x40
#define OPT_i     0x80
#define OPT_l     0x100
#define OPT_m     0x200
#define OPT_n     0x400
#define OPT_o     0x800
#define OPT_P     0x1000
#define OPT_Q     0x2000
#define OPT_q     0x4000
#define OPT_S     0x8000
#define OPT_s     0x10000
#define OPT_t     0x20000
#define OPT_e     0x40000
#define OPT_F     0x80000

int recollq(RclConfig **cfp, int argc, char **argv)
{
    string a_config;
    string sortfield;
    string stemlang("english");
    list extra_dbs;
    string sf;
    vector fields;

    int firstres = 0;
    int maxcount = 2000;
    thisprog = argv[0];
    argc--; argv++;

    while (argc > 0 && **argv == '-') {
        (*argv)++;
        if (!(**argv))
            /* Cas du "adb - core" */
            Usage();
        while (**argv)
            switch (*(*argv)++) {
            case 'A':   op_flags |= OPT_A; break;
            case 'a':   op_flags |= OPT_a; break;
            case 'b':   op_flags |= OPT_b; break;
	    case 'c':	op_flags |= OPT_c; if (argc < 2)  Usage();
		a_config = *(++argv);
		argc--; goto b1;
            case 'd':   op_flags |= OPT_d; break;
            case 'D':   op_flags |= OPT_D; break;
            case 'e':   op_flags |= OPT_e; break;
            case 'f':   op_flags |= OPT_f; break;
	    case 'F':	op_flags |= OPT_F; if (argc < 2)  Usage();
		sf = *(++argv);
		argc--; goto b1;
	    case 'i':	op_flags |= OPT_i; if (argc < 2)  Usage();
		extra_dbs.push_back(*(++argv));
		argc--; goto b1;
            case 'l':   op_flags |= OPT_l; break;
            case 'm':   op_flags |= OPT_m; break;
	    case 'n':	op_flags |= OPT_n; if (argc < 2)  Usage();
	    {
		string rescnt = *(++argv);
		string::size_type dash = rescnt.find("-");
		if (dash != string::npos) {
		    firstres = atoi(rescnt.substr(0, dash).c_str());
		    if (dash < rescnt.size()-1) {
			maxcount = atoi(rescnt.substr(dash+1).c_str());
		    }
		} else {
		    maxcount = atoi(rescnt.c_str());
		}
		if (maxcount <= 0) maxcount = INT_MAX;
	    }
	    argc--; goto b1;
            case 'o':   op_flags |= OPT_o; break;
            case 'P':   op_flags |= OPT_P; break;
            case 'q':   op_flags |= OPT_q; break;
            case 'Q':   op_flags |= OPT_Q; break;
	    case 'S':	op_flags |= OPT_S; if (argc < 2)  Usage();
		sortfield = *(++argv);
		argc--; goto b1;
	    case 's':	op_flags |= OPT_s; if (argc < 2)  Usage();
		stemlang = *(++argv);
		argc--; goto b1;
            case 't':   op_flags |= OPT_t; break;
            default: Usage();   break;
            }
    b1: argc--; argv++;
    }

    string reason;
    *cfp = recollinit(0, 0, reason, &a_config);
    RclConfig *rclconfig = *cfp;
    if (!rclconfig || !rclconfig->ok()) {
	fprintf(stderr, "Recoll init failed: %s\n", reason.c_str());
	exit(1);
    }

    if (argc < 1 && !(op_flags & OPT_P)) {
	Usage();
    }
    if (op_flags & OPT_F) {
	if (op_flags & (OPT_b|OPT_d|OPT_b|OPT_Q|OPT_m|OPT_A))
	    Usage();
	stringToStrings(sf, fields);
    }
    Rcl::Db rcldb(rclconfig);
    if (!extra_dbs.empty()) {
        for (list::iterator it = extra_dbs.begin();
             it != extra_dbs.end(); it++) {
            if (!rcldb.addQueryDb(*it)) {
                cerr << "Can't add index: " << *it << endl;
                exit(1);
            }
        }
    }

    if (!rcldb.open(Rcl::Db::DbRO)) {
	cerr << "Cant open database in " << rclconfig->getDbDir() << 
	    " reason: " << rcldb.getReason() << endl;
	exit(1);
    }

    if (op_flags & OPT_P) {
        int minyear, maxyear;
        if (!rcldb.maxYearSpan(&minyear, &maxyear)) {
            cerr << "maxYearSpan failed: " << rcldb.getReason() << endl;
            exit(1);
        } else {
            cout << "Min year " << minyear << " Max year " << maxyear << endl;
            exit(0);
        }
    }

    if (argc < 1) {
	Usage();
    }
    string qs = *argv++;argc--;
    while (argc > 0) {
	qs += string(" ") + *argv++;argc--;
    }

    {
	string uq;
	string charset = rclconfig->getDefCharset(true);
	int ercnt;
	if (!transcode(qs, uq, charset, "UTF-8", &ercnt)) {
	    fprintf(stderr, "Can't convert command line args to utf-8\n");
	    exit(1);
	} else if (ercnt) {
	    fprintf(stderr, "%d errors while converting arguments from %s "
		    "to utf-8\n", ercnt, charset.c_str());
	}
	qs = uq;
    }

    Rcl::SearchData *sd = 0;

    if (op_flags & (OPT_a|OPT_o|OPT_f)) {
	sd = new Rcl::SearchData(Rcl::SCLT_OR);
	Rcl::SearchDataClause *clp = 0;
	if (op_flags & OPT_f) {
	    clp = new Rcl::SearchDataClauseFilename(qs);
	} else {
	    // If there is no white space inside the query, then the user
	    // certainly means it as a phrase.
	    bool isreallyaphrase = false;
	    if (!TextSplit::hasVisibleWhite(qs))
		isreallyaphrase = true;
	    clp = isreallyaphrase ? 
		new Rcl::SearchDataClauseDist(Rcl::SCLT_PHRASE, qs, 0) :
		new Rcl::SearchDataClauseSimple((op_flags & OPT_o)?
						Rcl::SCLT_OR : Rcl::SCLT_AND, 
						qs);
	}
	if (sd)
	    sd->addClause(clp);
    } else {
	sd = wasaStringToRcl(rclconfig, qs, reason);
    }

    if (!sd) {
	cerr << "Query string interpretation failed: " << reason << endl;
	return 1;
    }
    sd->setStemlang(stemlang);

    RefCntr rq(sd);
    Rcl::Query query(&rcldb);
    if (op_flags & OPT_S) {
	query.setSortBy(sortfield, (op_flags & OPT_D) ? false : true);
    }
    Chrono chron;
    query.setQuery(rq);
    int cnt = query.getResCnt();
    if (!(op_flags & OPT_b)) {
	cout << "Recoll query: " << rq->getDescription() << endl;
	if (firstres == 0) {
	    if (cnt <= maxcount)
		cout << cnt << " results" << endl;
	    else
		cout << cnt << " results (printing  " << maxcount << " max):" 
		     << endl;
	} else {
	    cout << "Printing at most " << cnt - (firstres+maxcount) <<
		" results from first " << firstres << endl;
	}
    }
    if (op_flags & OPT_Q)
	cout << "Query setup took " << chron.millis() << " mS" << endl;

    if (op_flags & OPT_Q)
	return(0);

    for (int i = firstres; i < firstres + maxcount; i++) {
	Rcl::Doc doc;
	if (!query.getDoc(i, doc))
	    break;

	if (op_flags & OPT_F) {
	    output_fields(fields, doc, query, rcldb);
	    continue;
	}

	if (op_flags & OPT_e) 
	    doc.url = url_encode(doc.url);

	if (op_flags & OPT_b) {
		cout << doc.url << endl;
	} else {
	    string titleorfn = doc.meta[Rcl::Doc::keytt];
	    if (titleorfn.empty())
		titleorfn = doc.meta[Rcl::Doc::keyfn];

	    char cpc[20];
	    sprintf(cpc, "%d", doc.pc);
	    cout 
		<< doc.mimetype << "\t"
		<< "[" << doc.url << "]" << "\t" 
		<< "[" << titleorfn << "]" << "\t"
		<< doc.fbytes << "\tbytes" << "\t"
		<<  endl;
	    if (op_flags & OPT_m) {
		for (map::const_iterator it = doc.meta.begin();
		     it != doc.meta.end(); it++) {
		    cout << it->first << " = " << it->second << endl;
		}
	    }
            if (op_flags & OPT_A) {
                string abstract;
                if (rcldb.makeDocAbstract(doc, &query, abstract)) {
                    cout << "ABSTRACT" << endl;
                    cout << abstract << endl;
                    cout << "/ABSTRACT" << endl;
                }
            }
        }
        if (op_flags & OPT_d) {
	    static TempDir tmpdir;
	    if (!tmpdir.ok()) {
		cerr << "Can't create temporary directory: " << 
		    tmpdir.getreason() << endl;
		return(1);
	    }
            dump_contents(rclconfig, tmpdir, doc);
        }	
    }

    return 0;
}

#else // TEST_RECOLLQ The test driver is actually the useful program...
#include 

#include "rclconfig.h"
#include "recollq.h"

static RclConfig *rclconfig;

int main(int argc, char **argv)
{
    return(recollq(&rclconfig, argc, argv));
}
#endif // TEST_RECOLLQ
recoll-1.17.3/query/recollq.h000644 001750 000000 00000002040 11740755063 016447 0ustar00dockeswheel000000 000000 /* Copyright (C) 2007 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 _recollq_h_included_
#define _recollq_h_included_

/// Execute query, print results to stdout. This is just an api to the
/// recollq command line program.
class RclConfig;
extern int recollq(RclConfig **cfp, int argc, char **argv);

#endif /* _recollq_h_included_ */
recoll-1.17.3/query/reslistpager.cpp000644 001750 000000 00000031251 11757431572 020057 0ustar00dockeswheel000000 000000 /* Copyright (C) 2007 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

#include 
#include 
#include 
#include 

#include 
using std::ostringstream;
using std::endl;

#include "cstr.h"
#include "reslistpager.h"
#include "debuglog.h"
#include "rclconfig.h"
#include "smallut.h"
#include "plaintorich.h"
#include "mimehandler.h"

// Default highlighter. No need for locking, this is query-only.
static const string cstr_hlfontcolor("");
static const string cstr_hlendfont("");
class PlainToRichHtReslist : public PlainToRich {
public:
    virtual ~PlainToRichHtReslist() {}
    virtual string startMatch() {return cstr_hlfontcolor;}
    virtual string endMatch() {return cstr_hlendfont;}
};
static PlainToRichHtReslist g_hiliter;

ResListPager::ResListPager(int pagesize) 
    : m_pagesize(pagesize),
      m_newpagesize(pagesize),
      m_resultsInCurrentPage(0),
      m_winfirst(-1),
      m_hasNext(true),
      m_hiliter(&g_hiliter)
{
}

void ResListPager::resultPageNext()
{
    if (m_docSource.isNull()) {
	LOGDEB(("ResListPager::resultPageNext: null source\n"));
	return;
    }

    int resCnt = m_docSource->getResCnt();
    LOGDEB(("ResListPager::resultPageNext: rescnt %d, winfirst %d\n", 
	    resCnt, m_winfirst));

    if (m_winfirst < 0) {
	m_winfirst = 0;
    } else {
	m_winfirst += m_respage.size();
    }
    // Get the next page of results. Note that we look ahead by one to
    // determine if there is actually a next page
    vector npage;
    int pagelen = m_docSource->getSeqSlice(m_winfirst, m_pagesize + 1, npage);

    // If page was truncated, there is no next
    m_hasNext = (pagelen == m_pagesize + 1);

    // Get rid of the possible excess result
    if (pagelen == m_pagesize + 1) {
	npage.resize(m_pagesize);
	pagelen--;
    }

    if (pagelen <= 0) {
	// No results ? This can only happen on the first page or if the
	// actual result list size is a multiple of the page pref (else
	// there would have been no Next on the last page)
	if (m_winfirst > 0) {
	    // Have already results. Let them show, just disable the
	    // Next button. We'd need to remove the Next link from the page
	    // too.
	    // Restore the m_winfirst value, let the current result vector alone
	    m_winfirst -= m_respage.size();
	} else {
	    // No results at all (on first page)
	    m_winfirst = -1;
	}
	return;
    }
    m_resultsInCurrentPage = pagelen;
    m_respage = npage;
}

void ResListPager::resultPageFor(int docnum)
{
    if (m_docSource.isNull()) {
	LOGDEB(("ResListPager::resultPageFor: null source\n"));
	return;
    }

    int resCnt = m_docSource->getResCnt();
    LOGDEB(("ResListPager::resultPageFor(%d): rescnt %d, winfirst %d\n", 
	    docnum, resCnt, m_winfirst));
    m_winfirst = (docnum / m_pagesize) * m_pagesize;

    // Get the next page of results.
    vector npage;
    int pagelen = m_docSource->getSeqSlice(m_winfirst, m_pagesize, npage);

    // If page was truncated, there is no next
    m_hasNext = (pagelen == m_pagesize);

    if (pagelen <= 0) {
	m_winfirst = -1;
	return;
    }
    m_respage = npage;
}

void ResListPager::displayDoc(RclConfig *config,
			      int i, Rcl::Doc& doc, const HiliteData& hdata,
			      const string& sh)
{
    ostringstream chunk;
    int percent;
    if (doc.pc == -1) {
	percent = 0;
	// Document not available, maybe other further, will go on.
	doc.meta[Rcl::Doc::keyabs] = string(trans("Unavailable document"));
    } else {
	percent = doc.pc;
    }

    // Determine icon to display if any
    string iconurl = iconUrl(config, doc);

    // Printable url: either utf-8 if transcoding succeeds, or url-encoded
    string url;
    printableUrl(config->getDefCharset(), doc.url, url);

    // Make title out of file name if none yet
    string titleOrFilename;
    string utf8fn;
    doc.getmeta(Rcl::Doc::keytt, &titleOrFilename);
    doc.getmeta(Rcl::Doc::keyfn, &utf8fn);
    if (utf8fn.empty()) {
	utf8fn = path_getsimple(url);	
    }
    if (titleOrFilename.empty()) {
	titleOrFilename = utf8fn;
    }

    // Result number
    char numbuf[20];
    int docnumforlinks = m_winfirst + 1 + i;
    sprintf(numbuf, "%d", docnumforlinks);

    // Document date: either doc or file modification time
    char datebuf[100];
    datebuf[0] = 0;
    if (!doc.dmtime.empty() || !doc.fmtime.empty()) {
	time_t mtime = doc.dmtime.empty() ?
	    atol(doc.fmtime.c_str()) : atol(doc.dmtime.c_str());
	struct tm *tm = localtime(&mtime);
	strftime(datebuf, 99, dateFormat().c_str(), tm);
    }

    // Size information. We print both doc and file if they differ a lot
    off_t fsize = -1, dsize = -1;
    if (!doc.dbytes.empty())
	dsize = atol(doc.dbytes.c_str());
    if (!doc.fbytes.empty())
	fsize = atol(doc.fbytes.c_str());
    string sizebuf;
    if (dsize > 0) {
	sizebuf = displayableBytes(dsize);
	if (fsize > 10 * dsize && fsize - dsize > 1000)
	    sizebuf += string(" / ") + displayableBytes(fsize);
    } else if (fsize >= 0) {
	sizebuf = displayableBytes(fsize);
    }

    string richabst;
    bool needabstract = parFormat().find("%A") != string::npos;
    if (needabstract && m_docSource.isNotNull()) {
	vector vabs;
	m_docSource->getAbstract(doc, vabs);

	for (vector::const_iterator it = vabs.begin();
	     it != vabs.end(); it++) {
	    if (!it->empty()) {
		// No need to call escapeHtml(), plaintorich handles it
		list lr;
		m_hiliter->set_inputhtml(false);
		m_hiliter->plaintorich(*it, lr, hdata);
		richabst += lr.front();
		richabst += absSep();
	    }
	}
    }

    // Links;
    ostringstream linksbuf;
    if (canIntern(doc.mimetype, config)) { 
	linksbuf << "" 
		 << trans("Preview") << "  ";
    }

    string apptag;
    doc.getmeta(Rcl::Doc::keyapptg, &apptag);

    if (!config->getMimeViewerDef(doc.mimetype, apptag).empty()) {
	linksbuf << ""  
		 << trans("Open") << "";
    }

    // Build the result list paragraph:

    // Subheader: this is used by history
    if (!sh.empty())
	chunk << "

" << sh << "

\n

"; else chunk << "

"; // Configurable stuff map subs; subs["A"] = !richabst.empty() ? richabst : ""; subs["D"] = datebuf; subs["I"] = iconurl; subs["i"] = doc.ipath; subs["K"] = !doc.meta[Rcl::Doc::keykw].empty() ? string("[") + escapeHtml(doc.meta[Rcl::Doc::keykw]) + "]" : ""; subs["L"] = linksbuf.rdbuf()->str(); subs["N"] = numbuf; subs["M"] = doc.mimetype; subs["R"] = doc.meta[Rcl::Doc::keyrr]; subs["S"] = sizebuf; subs["T"] = escapeHtml(titleOrFilename); subs["t"] = escapeHtml(doc.meta[Rcl::Doc::keytt]); subs["U"] = url; // Let %(xx) access all metadata. subs.insert(doc.meta.begin(), doc.meta.end()); string formatted; pcSubst(parFormat(), formatted, subs); chunk << formatted; chunk << "

" << endl; // This was to force qt 4.x to clear the margins (which it should do // anyway because of the paragraph's style), but we finally took // the table approach for 1.15 for now (in guiutils.cpp) // chunk << "
" << endl; LOGDEB2(("Chunk: [%s]\n", (const char *)chunk.rdbuf()->str().c_str())); append(chunk.rdbuf()->str(), i, doc); } void ResListPager::displayPage(RclConfig *config) { LOGDEB(("ResListPager::displayPage\n")); if (m_docSource.isNull()) { LOGDEB(("ResListPager::displayPage: null source\n")); return; } if (m_winfirst < 0 && !pageEmpty()) { LOGDEB(("ResListPager::displayPage: sequence error: winfirst < 0\n")); return; } ostringstream chunk; // Display list header // We could use a but the textedit doesnt display // it prominently // Note: have to append text in chunks that make sense // html-wise. If we break things up too much, the editor // gets confused. Hence the use of the 'chunk' text // accumulator // Also note that there can be results beyond the estimated resCnt. chunk << "<html><head>" << endl << "<meta http-equiv=\"content-type\"" << " content=\"text/html; charset=utf-8\">" << endl << headerContent() << "</head><body>" << endl << pageTop() << "<p><font size=+1><b>" << m_docSource->title() << "</b></font>   "; if (pageEmpty()) { chunk << trans("<p><b>No results found</b><br>"); vector<string>uterms; m_docSource->getUTerms(uterms); if (!uterms.empty()) { map<string, vector<string> > spellings; suggest(uterms, spellings); if (!spellings.empty()) { chunk << trans("<p><i>Alternate spellings (accents suppressed): </i>") << "<br /><blockquote>"; for (map<string, vector<string> >::const_iterator it0 = spellings.begin(); it0 != spellings.end(); it0++) { chunk << "<b>" << it0->first << "</b> : "; for (vector<string>::const_iterator it = it0->second.begin(); it != it0->second.end(); it++) { chunk << *it << " "; } chunk << "<br />"; } chunk << "</blockquote></p>"; } } } else { unsigned int resCnt = m_docSource->getResCnt(); if (m_winfirst + m_respage.size() < resCnt) { chunk << trans("Documents") << " <b>" << m_winfirst + 1 << "-" << m_winfirst + m_respage.size() << "</b> " << trans("out of at least") << " " << resCnt << " " << trans("for") << " " ; } else { chunk << trans("Documents") << " <b>" << m_winfirst + 1 << "-" << m_winfirst + m_respage.size() << "</b> " << trans("for") << " "; } } chunk << detailsLink(); if (hasPrev() || hasNext()) { chunk << "  "; if (hasPrev()) { chunk << "<a href=\"" + prevUrl() + "\"><b>" << trans("Previous") << "</b></a>   "; } if (hasNext()) { chunk << "<a href=\""+ nextUrl() + "\"><b>" << trans("Next") << "</b></a>"; } } chunk << "</p>" << endl; append(chunk.rdbuf()->str()); chunk.rdbuf()->str(""); if (pageEmpty()) return; HiliteData hdata; m_docSource->getTerms(hdata.terms, hdata.groups, hdata.gslks); // Emit data for result entry paragraph. Do it in chunks that make sense // html-wise, else our client may get confused for (int i = 0; i < (int)m_respage.size(); i++) { Rcl::Doc &doc(m_respage[i].doc); string& sh(m_respage[i].subHeader); displayDoc(config, i, doc, hdata, sh); } // Footer chunk << "<p align=\"center\">"; if (hasPrev() || hasNext()) { if (hasPrev()) { chunk << "<a href=\"" + prevUrl() + "\"><b>" << trans("Previous") << "</b></a>   "; } if (hasNext()) { chunk << "<a href=\""+ nextUrl() + "\"><b>" << trans("Next") << "</b></a>"; } } chunk << "</p>" << endl; chunk << "</body></html>" << endl; append(chunk.rdbuf()->str()); } // Default implementations for things that should be implemented by // specializations string ResListPager::nextUrl() { return "n-1"; } string ResListPager::prevUrl() { return "p-1"; } string ResListPager::iconUrl(RclConfig *config, Rcl::Doc& doc) { string iconurl; config->getMimeIconName(doc.mimetype, &iconurl); iconurl = cstr_fileu + iconurl; return iconurl; } bool ResListPager::append(const string& data) { fprintf(stderr, "%s", data.c_str()); return true; } string ResListPager::trans(const string& in) { return in; } string ResListPager::detailsLink() { string chunk = "<a href=\"H-1\">"; chunk += trans("(show query)") + "</a>"; return chunk; } const string &ResListPager::parFormat() { static const string cstr_format("<img src=\"%I\" align=\"left\">" "%R %S %L   <b>%T</b><br>" "%M %D   <i>%U</i><br>" "%A %K"); return cstr_format; } const string &ResListPager::dateFormat() { static const string cstr_format(" %Y-%m-%d %H:%M:%S %z"); return cstr_format; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/query/reslistpager.h������������������������������������������������������������������000644 �001750 �000000 �00000010064 11757431601 017514� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2007 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 _reslistpager_h_included_ #define _reslistpager_h_included_ #include <vector> using std::vector; #include "refcntr.h" #include "docseq.h" class RclConfig; class PlainToRich; class HiliteData; /** * Manage a paged HTML result list. */ class ResListPager { public: ResListPager(int pagesize=10); virtual ~ResListPager() {} void setHighLighter(PlainToRich *ptr) { m_hiliter = ptr; } void setDocSource(RefCntr<DocSequence> src, int winfirst = -1) { m_pagesize = m_newpagesize; m_winfirst = winfirst; m_hasNext = true; m_docSource = src; m_respage.clear(); } void setPageSize(int ps) { m_newpagesize = ps; } int pageNumber() { if (m_winfirst < 0 || m_pagesize <= 0) return -1; return m_winfirst / m_pagesize; } int pageFirstDocNum() { return m_winfirst; } int pageLastDocNum() { if (m_winfirst < 0 || m_respage.size() == 0) return -1; return m_winfirst + m_respage.size() - 1; } virtual int pageSize() const {return m_pagesize;} void pageNext(); bool hasNext() {return m_hasNext;} bool hasPrev() {return m_winfirst > 0;} bool atBot() {return m_winfirst <= 0;} void resultPageFirst() { m_winfirst = -1; m_pagesize = m_newpagesize; resultPageNext(); } void resultPageBack() { if (m_winfirst <= 0) return; m_winfirst -= m_resultsInCurrentPage + m_pagesize; resultPageNext(); } void resultPageNext(); void resultPageFor(int docnum); void displayPage(RclConfig *); void displayDoc(RclConfig *, int idx, Rcl::Doc& doc, const HiliteData& hdata, const string& sh = ""); bool pageEmpty() {return m_respage.size() == 0;} string queryDescription() {return m_docSource.isNull() ? "" : m_docSource->getDescription();} // Things that need to be reimplemented in the subclass: virtual bool append(const string& data); virtual bool append(const string& data, int, const Rcl::Doc&) { return append(data); } // Translation function. This is reimplemented in the qt reslist // object For this to work, the strings must be duplicated inside // reslist.cpp (see the QT_TR_NOOP in there). Very very unwieldy. // To repeat: any change to a string used with trans() inside // reslistpager.cpp must be reflected in the string table inside // reslist.cpp for translation to work. virtual string trans(const string& in); virtual string detailsLink(); virtual const string &parFormat(); virtual const string &dateFormat(); virtual string nextUrl(); virtual string prevUrl(); virtual string pageTop() {return string();} virtual string headerContent() {return string();} virtual string iconUrl(RclConfig *, Rcl::Doc& doc); virtual void suggest(const vector<string>, map<string, vector<string> >& sugg) { sugg.clear(); } virtual string absSep() {return "…";} private: int m_pagesize; int m_newpagesize; int m_resultsInCurrentPage; // First docnum (from docseq) in current page int m_winfirst; bool m_hasNext; PlainToRich *m_hiliter; RefCntr<DocSequence> m_docSource; vector<ResListEntry> m_respage; }; #endif /* _reslistpager_h_included_ */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/query/sortseq.cpp���������������������������������������������������������������������000644 �001750 �000000 �00000004362 11740755063 017052� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2005 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 <algorithm> #include "debuglog.h" #include "sortseq.h" using std::string; class CompareDocs { DocSeqSortSpec ss; public: CompareDocs(const DocSeqSortSpec &sortspec) : ss(sortspec) {} // It's not too clear in the std::sort doc what this should do. This // behaves as operator< int operator()(const Rcl::Doc *x, const Rcl::Doc *y) { LOGDEB1(("Comparing .. \n")); map<string,string>::const_iterator xit, yit; xit = x->meta.find(ss.field); yit = y->meta.find(ss.field); if (xit == x->meta.end() || yit == y->meta.end()) return 0; return ss.desc ? yit->second < xit->second : xit->second < yit->second; } }; bool DocSeqSorted::setSortSpec(DocSeqSortSpec &sortspec) { LOGDEB(("DocSeqSorted::setSortSpec\n")); m_spec = sortspec; int count = m_seq->getResCnt(); LOGDEB(("DocSeqSorted:: count %d\n", count)); m_docs.resize(count); int i; for (i = 0; i < count; i++) { if (!m_seq->getDoc(i, m_docs[i])) { LOGERR(("DocSeqSorted: getDoc failed for doc %d\n", i)); count = i; break; } } m_docs.resize(count); m_docsp.resize(count); for (i = 0; i < count; i++) m_docsp[i] = &m_docs[i]; CompareDocs cmp(sortspec); sort(m_docsp.begin(), m_docsp.end(), cmp); return true; } bool DocSeqSorted::getDoc(int num, Rcl::Doc &doc, string *) { LOGDEB(("DocSeqSorted::getDoc(%d)\n", num)); if (num < 0 || num >= int(m_docsp.size())) return false; doc = *m_docsp[num]; return true; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/query/sortseq.h�����������������������������������������������������������������������000644 �001750 �000000 �00000003152 11740755063 016513� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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 _SORTSEQ_H_INCLUDED_ #define _SORTSEQ_H_INCLUDED_ #include <vector> #include <string> #include "refcntr.h" #include "docseq.h" /** * A sorted sequence is created from the first N documents of another one, * and sorts them according to the given criteria. */ class DocSeqSorted : public DocSeqModifier { public: DocSeqSorted(RefCntr<DocSequence> iseq, DocSeqSortSpec &sortspec) : DocSeqModifier(iseq) { setSortSpec(sortspec); } virtual ~DocSeqSorted() {} virtual bool canSort() {return true;} virtual bool setSortSpec(DocSeqSortSpec &sortspec); virtual bool getDoc(int num, Rcl::Doc &doc, string *sh = 0); virtual int getResCnt() {return m_docsp.size();} private: DocSeqSortSpec m_spec; std::vector<Rcl::Doc> m_docs; std::vector<Rcl::Doc *> m_docsp; }; #endif /* _SORTSEQ_H_INCLUDED_ */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/query/wasastringtoquery.cpp�����������������������������������������������������������000644 �001750 �000000 �00000033723 11740755063 021170� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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 TEST_WASASTRINGTOQUERY #include <stdio.h> #include <stdlib.h> #include <string.h> #include <regex.h> #include "smallut.h" #include "wasastringtoquery.h" #undef DEB_WASASTRINGTOQ #ifdef DEB_WASASTRINGTOQ #define DPRINT(X) fprintf X #define DUMPQ(Q) {string D;Q->describe(D);fprintf(stderr, "%s\n", D.c_str());} #else #define DPRINT(X) #define DUMPQ(Q) #endif WasaQuery::~WasaQuery() { for (vector<WasaQuery*>::iterator it = m_subs.begin(); it != m_subs.end(); it++) { delete *it; } m_subs.clear(); } static const char* reltosrel(WasaQuery::Rel rel) { switch (rel) { case WasaQuery::REL_EQUALS: return "="; case WasaQuery::REL_CONTAINS: return ":"; case WasaQuery::REL_LT: return "<"; case WasaQuery::REL_LTE: return "<="; case WasaQuery::REL_GT: return ">"; case WasaQuery::REL_GTE: return ">="; default: return "?"; } } void WasaQuery::describe(string &desc) const { desc += "("; string fieldspec = m_fieldspec.empty() ? string() : m_fieldspec + reltosrel(m_rel); switch (m_op) { case OP_NULL: desc += "NULL"; break; case OP_LEAF: desc += fieldspec + m_value; break; case OP_EXCL: desc += string("NOT (" ) + fieldspec + m_value + ") "; break; case OP_OR: case OP_AND: for (vector<WasaQuery *>::const_iterator it = m_subs.begin(); it != m_subs.end(); it++) { (*it)->describe(desc); vector<WasaQuery *>::const_iterator it1 = it; it1++; if (it1 != m_subs.end()) desc += m_op == OP_OR ? "OR ": "AND "; } break; } if (desc[desc.length() - 1] == ' ') desc.erase(desc.length() - 1); desc += ")"; if (m_modifiers != 0) { if (m_modifiers & WQM_BOOST) desc += "BOOST|"; if (m_modifiers & WQM_CASESENS) desc += "CASESENS|"; if (m_modifiers & WQM_DIACSENS) desc += "DIACSENS|"; if (m_modifiers & WQM_FUZZY) desc += "FUZZY|"; if (m_modifiers & WQM_NOSTEM) desc += "NOSTEM|"; if (m_modifiers & WQM_PHRASESLACK) { char buf[100]; sprintf(buf, "%d", m_slack); desc += "PHRASESLACK(" + string(buf) + string(")|"); } if (m_modifiers & WQM_PROX) desc += "PROX|"; if (m_modifiers & WQM_REGEX) desc += "REGEX|"; if (m_modifiers & WQM_SLOPPY) desc += "SLOPPY|"; if (m_modifiers & WQM_WORDS) desc += "WORDS|"; if (desc.length() > 0 && desc[desc.length()-1] == '|') desc.erase(desc.length()-1); } desc += " "; } // The string query parser code: /* Shamelessly lifted from Beagle: * This is our regular Expression Pattern: * we expect something like this: * -key:"Value String"modifiers * key:Value * or * Value */ /* The master regular expression used to parse a query string * Sub-expressions in parenthesis are numbered from 1. Each opening * parenthesis increases the index, but we're not interested in all * Deviations from standard: * Relation: the standard-conformant line read as (release<1.16): "(:|=|<|>|<=|>=)" //7 Relation but we are not actually making use of the relation type (interpreting all as ":"), and this can product unexpected results as a (ie pasted) search for nonexfield=value will silently drop the nonexfield part, while the user probably was not aware of triggering a field search (expecting just ':' to do this). */ static const char * parserExpr = "(OR|\\|\\|)[[:space:]]*" //1 OR,|| "|" "(AND|&&)[[:space:]]*" // 2 AND,&& (ignored, default) "|" "(" //3 "([+-])?" //4 Force or exclude indicator "(" //5 "([[:alpha:]][[:alnum:]:]*)" //6 Field spec: ie: "dc:title:letitre" "[[:space:]]*" "(:|=|>|<)" //7 Relation "[[:space:]]*)?" "(" //8 "(\"" //9 "([^\"]+)" //10 "A quoted term" "\")" "([bcCdDeflLoprsw.0-9]*)" //11 modifiers "|" "([^[:space:]\"]+)" //12 ANormalTerm ")" ")[[:space:]]*" ; // For debugging the parser. But see also NMATCH static const char *matchNames[] = { /* 0*/ "", /* 1*/ "OR", /* 2*/ "AND", /* 3*/ "", /* 4*/ "+-", /* 5*/ "", /* 6*/ "FIELD", /* 7*/ "RELATION", /* 8*/ "", /* 9*/ "", /*10*/ "QUOTEDTERM", /*11*/ "MODIFIERS", /*12*/ "TERM", }; #define NMATCH (sizeof(matchNames) / sizeof(char *)) // Symbolic names for the interesting submatch indices enum SbMatchIdx {SMI_OR=1, SMI_AND=2, SMI_PM=4, SMI_FIELD=6, SMI_REL=7, SMI_QUOTED=10, SMI_MODIF=11, SMI_TERM=12}; static const int maxmatchlen = 1024; static const int errbuflen = 300; class StringToWasaQuery::Internal { public: Internal() : m_rxneedsfree(false) {} ~Internal() { if (m_rxneedsfree) regfree(&m_rx); } bool checkSubMatch(int i, char *match, string& reason) { if (i < 0 || i >= int(NMATCH) || m_pmatch[i].rm_so == -1) { //DPRINT((stderr, "checkSubMatch: no match: i %d rm_so %d\n", //i, m_pmatch[i].rm_so)); return false; } if (m_pmatch[i].rm_eo - m_pmatch[i].rm_so <= 0) { // weird and fatal reason = "Internal regular expression handling error"; return false; } //DPRINT((stderr, "checkSubMatch: so %d eo %d\n", m_pmatch[i].rm_so, //m_pmatch[i].rm_eo)); memcpy(match, m_cp + m_pmatch[i].rm_so, m_pmatch[i].rm_eo - m_pmatch[i].rm_so); match[m_pmatch[i].rm_eo - m_pmatch[i].rm_so] = 0; return true; } WasaQuery *stringToQuery(const string& str, string& reason); friend class StringToWasaQuery; private: const char *m_cp; regex_t m_rx; bool m_rxneedsfree; regmatch_t m_pmatch[NMATCH]; }; StringToWasaQuery::StringToWasaQuery() : internal(new Internal) { } StringToWasaQuery::~StringToWasaQuery() { delete internal; } WasaQuery * StringToWasaQuery::stringToQuery(const string& str, string& reason) { if (internal == 0) return 0; WasaQuery *wq = internal->stringToQuery(str, reason); DUMPQ(wq); return wq; } WasaQuery * StringToWasaQuery::Internal::stringToQuery(const string& str, string& reason) { if (m_rxneedsfree) regfree(&m_rx); char errbuf[errbuflen+1]; int errcode; if ((errcode = regcomp(&m_rx, parserExpr, REG_EXTENDED)) != 0) { regerror(errcode, &m_rx, errbuf, errbuflen); reason = errbuf; return 0; } m_rxneedsfree = true; const char *cpe; m_cp = str.c_str(); cpe = str.c_str() + str.length(); WasaQuery *query = new WasaQuery; query->m_op = WasaQuery::OP_AND; WasaQuery *orChain = 0; bool prev_or = false; // Loop on repeated regexp matches on the main string. for (int loop = 0;;loop++) { if ((errcode = regexec(&m_rx, m_cp, NMATCH, m_pmatch, 0))) { regerror(errcode, &m_rx, errbuf, errbuflen); reason = errbuf; return 0; } if (m_pmatch[0].rm_eo <= 0) { // weird and fatal reason = "Internal regular expression handling error"; return 0; } #ifdef DEB_WASASTRINGTOQ DPRINT((stderr, "Next part:\n")); for (unsigned int i = 0; i < NMATCH; i++) { if (m_pmatch[i].rm_so == -1) continue; char match[maxmatchlen+1]; memcpy(match, m_cp + m_pmatch[i].rm_so, m_pmatch[i].rm_eo - m_pmatch[i].rm_so); match[m_pmatch[i].rm_eo - m_pmatch[i].rm_so] = 0; if (matchNames[i][0]) DPRINT((stderr, "%10s: [%s] (%d->%d)\n", matchNames[i], match, (int)m_pmatch[i].rm_so, (int)m_pmatch[i].rm_eo)); } #endif char match[maxmatchlen+1]; if (checkSubMatch(SMI_OR, match, reason)) { if (prev_or) { // Bad syntax reason = "Bad syntax: consecutive OR"; return 0; } if (orChain == 0) { // Fist OR seen: start OR subclause. if ((orChain = new WasaQuery()) == 0) { reason = "Out of memory"; return 0; } orChain->m_op = WasaQuery::OP_OR; } // For the first OR, we need to transfer the previous // query from the main vector to the OR subquery if (orChain->m_subs.empty() && !query->m_subs.empty()) { orChain->m_subs.push_back(query->m_subs.back()); query->m_subs.pop_back(); } prev_or = true; } else if (checkSubMatch(SMI_AND, match, reason)) { // Do nothing, AND is the default. We might want to check for // errors like consecutive ANDs, or OR AND } else { WasaQuery *nclause = new WasaQuery; if (nclause == 0) { reason = "Out of memory"; return 0; } // Check for quoted or unquoted value unsigned int mods = 0; if (checkSubMatch(SMI_QUOTED, match, reason)) { nclause->m_value = match; } else if (checkSubMatch(SMI_TERM, match, reason)) { nclause->m_value = match; } if (nclause->m_value.empty()) { // Isolated +- or fieldname: without a value. Ignore until // told otherwise. DPRINT((stderr, "Clause with empty value, skipping\n")); delete nclause; goto nextfield; } if (checkSubMatch(SMI_MODIF, match, reason)) { DPRINT((stderr, "Got modifiers: [%s]\n", match)); for (unsigned int i = 0; i < strlen(match); i++) { switch (match[i]) { case 'b': mods |= WasaQuery::WQM_BOOST; nclause->m_weight = 10.0; break; case 'c': break; case 'C': mods |= WasaQuery::WQM_CASESENS; break; case 'd': break; case 'D': mods |= WasaQuery::WQM_DIACSENS; break; case 'e': mods |= WasaQuery::WQM_CASESENS | WasaQuery::WQM_DIACSENS | WasaQuery::WQM_NOSTEM; break; case 'f': mods |= WasaQuery::WQM_FUZZY; break; case 'l': mods |= WasaQuery::WQM_NOSTEM; break; case 'L': break; case 'o': mods |= WasaQuery::WQM_PHRASESLACK; // Default slack if specified only by 'o' is 10. nclause->m_slack = 10; if (i < strlen(match) - 1) { char *endptr; int slack = strtol(match+i+1, &endptr, 10); if (endptr != match+i+1) { i += endptr - (match+i+1); nclause->m_slack = slack; } } break; case 'p': mods |= WasaQuery::WQM_PROX; nclause->m_slack = 10; break; case 'r': mods |= WasaQuery::WQM_REGEX; break; case 's': mods |= WasaQuery::WQM_SLOPPY; break; case 'w': mods |= WasaQuery::WQM_WORDS; break; case '.':case '0':case '1':case '2':case '3':case '4': case '5':case '6':case '7':case '8':case '9': { int n; float factor; if (sscanf(match+i, "%f %n", &factor, &n)) { nclause->m_weight = factor; DPRINT((stderr, "Got factor %.2f len %d\n", factor, n)); } if (n) i += n-1; } } } } nclause->m_modifiers = WasaQuery::Modifier(mods); // Field indicator ? if (checkSubMatch(SMI_FIELD, match, reason)) { // We used Check for special fields indicating sorting // etc. here but this went away from the spec. See 1.4 // if it comes back nclause->m_fieldspec = match; if (checkSubMatch(SMI_REL, match, reason)) { switch (match[0]) { case '=':nclause->m_rel = WasaQuery::REL_EQUALS;break; case ':':nclause->m_rel = WasaQuery::REL_CONTAINS;break; case '<': if (match[1] == '=') nclause->m_rel = WasaQuery::REL_LTE; else nclause->m_rel = WasaQuery::REL_LT; break; case '>': if (match[1] == '=') nclause->m_rel = WasaQuery::REL_GTE; else nclause->m_rel = WasaQuery::REL_GT; break; default: nclause->m_rel = WasaQuery::REL_CONTAINS; } } else { // ?? If field matched we should have a relation nclause->m_rel = WasaQuery::REL_CONTAINS; } } // +- indicator ? if (checkSubMatch(SMI_PM, match, reason) && match[0] == '-') { nclause->m_op = WasaQuery::OP_EXCL; } else { nclause->m_op = WasaQuery::OP_LEAF; } if (prev_or) { // The precedent token was an OR, add new clause to or chain //DPRINT((stderr, "Adding to OR chain\n")); orChain->m_subs.push_back(nclause); } else { if (orChain) { // Getting out of OR. Add the OR subquery to the main one //DPRINT((stderr, "Adding OR chain to main\n")); query->m_subs.push_back(orChain); orChain = 0; } //DPRINT((stderr, "Adding to main chain\n")); // Add new clause to main query query->m_subs.push_back(nclause); } prev_or = false; } nextfield: // Advance current string position. We checked earlier that // the increment is strictly positive, so we won't loop // forever m_cp += m_pmatch[0].rm_eo; if (m_cp >= cpe) break; } if (orChain) { // Getting out of OR. Add the OR subquery to the main one DPRINT((stderr, "Adding OR chain to main.Before: \n")); DUMPQ(query); DUMPQ(orChain); query->m_subs.push_back(orChain); } regfree(&m_rx); m_rxneedsfree = false; return query; } #else // TEST #include <stdio.h> #include "wasastringtoquery.h" static char *thisprog; int main(int argc, char **argv) { thisprog = argv[0]; argc--; argv++; if (argc != 1) { fprintf(stderr, "need one arg\n"); exit(1); } const string str = *argv++;argc--; string reason; StringToWasaQuery qparser; WasaQuery *q = qparser.stringToQuery(str, reason); if (q == 0) { fprintf(stderr, "stringToQuery failed: %s\n", reason.c_str()); exit(1); } string desc; q->describe(desc); fprintf(stderr, "Finally: %s\n", desc.c_str()); exit(0); } #endif // TEST_WASASTRINGTOQUERY ���������������������������������������������recoll-1.17.3/query/wasastringtoquery.h�������������������������������������������������������������000644 �001750 �000000 �00000007473 11740755063 020640� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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 _WASASTRINGTOQUERY_H_INCLUDED_ #define _WASASTRINGTOQUERY_H_INCLUDED_ #include <string> #include <vector> using std::string; using std::vector; /* Note: Xesam used to be named wasabi. We changed the references to wasabi in the comments, but not the code */ /** * A simple class to represent a parsed Xesam user language element. * Can hold one leaf element or an array of subqueries to be joined by AND/OR * * The complete query is represented by a top WasaQuery holding a * chain of ANDed subclauses. Some of the subclauses may be themselves * OR'ed lists (it doesn't go deeper). Entries in the AND list may be * negated (AND NOT). * * For LEAF elements, the value can hold one or several words. In the * latter case, it should be interpreted as a phrase (comes from a * user-entered "quoted string"), except if the modifier flags say otherwise. * * Some fields only make sense either for compound or LEAF queries. This * is commented for each. We should subclass really. * * Note that wasaStringToQuery supposedly parses the whole Xesam * User Search Language v 0.95, but that some elements are dropped or * ignored during the translation to a native Recoll query in wasaToRcl */ class WasaQuery { public: /** Type of this element: leaf or AND/OR chain */ enum Op {OP_NULL, OP_LEAF, OP_EXCL, OP_OR, OP_AND}; /** Relation to be searched between field and value. Recoll actually only supports "contain" except for a size field */ enum Rel {REL_NULL, REL_EQUALS, REL_CONTAINS, REL_LT, REL_LTE, REL_GT, REL_GTE}; /** Modifiers for term handling: case/diacritics handling, stemming control */ enum Modifier {WQM_CASESENS = 1, WQM_DIACSENS = 2, WQM_NOSTEM = 4, WQM_BOOST = 8, WQM_PROX = 0x10, WQM_SLOPPY = 0x20, WQM_WORDS = 0x40, WQM_PHRASESLACK = 0x80, WQM_REGEX = 0x100, WQM_FUZZY = 0x200}; typedef vector<WasaQuery*> subqlist_t; WasaQuery() : m_op(OP_NULL), m_modifiers(0), m_slack(0), m_weight(1.0) {} ~WasaQuery(); /** Get string describing the query tree from this point */ void describe(string &desc) const; /** Op to be performed on either value (may be LEAF or EXCL, or subqs */ WasaQuery::Op m_op; /** Field specification if any (ie: title, author ...) Only OPT_LEAF */ string m_fieldspec; /** Relation between field and value: =, :, <,>,<=, >= */ WasaQuery::Rel m_rel; /* String value. Valid for op == OP_LEAF or EXCL */ string m_value; /** Subqueries. Valid for conjunctions */ vector<WasaQuery*> m_subs; unsigned int m_modifiers; int m_slack; float m_weight; }; /** * Wasabi query string parser class. Could be a simple function * really, but there might be some parser initialization work done in * the constructor. */ class StringToWasaQuery { public: StringToWasaQuery(); ~StringToWasaQuery(); WasaQuery *stringToQuery(const string& str, string& reason); class Internal; private: Internal *internal; }; #endif /* _WASASTRINGTOQUERY_H_INCLUDED_ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/query/wasatorcl.cpp�������������������������������������������������������������������000644 �001750 �000000 �00000022115 11740755063 017345� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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 <cstdio> #include <string> #include <list> #include <algorithm> using std::string; using std::list; #include "rclconfig.h" #include "wasastringtoquery.h" #include "rcldb.h" #include "searchdata.h" #include "wasatorcl.h" #include "debuglog.h" #include "smallut.h" #include "rclconfig.h" #include "refcntr.h" #include "textsplit.h" static Rcl::SearchData *wasaQueryToRcl(RclConfig *config, WasaQuery *wasa, const string& autosuffs, string& reason) { if (wasa == 0) { reason = "NULL query"; return 0; } if (wasa->m_op != WasaQuery::OP_AND && wasa->m_op != WasaQuery::OP_OR) { reason = "Top query neither AND nor OR ?"; LOGERR(("wasaQueryToRcl: top query neither AND nor OR!\n")); return 0; } Rcl::SearchData *sdata = new Rcl::SearchData(wasa->m_op == WasaQuery::OP_AND ? Rcl::SCLT_AND : Rcl::SCLT_OR); LOGDEB2(("wasaQueryToRcl: %s chain\n", wasa->m_op == WasaQuery::OP_AND ? "AND" : "OR")); WasaQuery::subqlist_t::iterator it; Rcl::SearchDataClause *nclause; // Walk the list of clauses. Some pseudo-field types need special // processing, which results in setting data in the top struct // instead of adding a clause. We check for these first for (it = wasa->m_subs.begin(); it != wasa->m_subs.end(); it++) { if (!stringicmp("mime", (*it)->m_fieldspec) || !stringicmp("format", (*it)->m_fieldspec)) { if ((*it)->m_op == WasaQuery::OP_LEAF) { sdata->addFiletype((*it)->m_value); } else if ((*it)->m_op == WasaQuery::OP_EXCL) { sdata->remFiletype((*it)->m_value); } else { reason = "internal error: mime clause neither leaf not excl??"; return 0; } continue; } // Xesam uses "type", we also support "rclcat", for broad // categories like "audio", "presentation", etc. if (!stringicmp("rclcat", (*it)->m_fieldspec) || !stringicmp("type", (*it)->m_fieldspec)) { if ((*it)->m_op != WasaQuery::OP_LEAF && (*it)->m_op != WasaQuery::OP_EXCL) { reason = "internal error: rclcat/type clause neither leaf" "nor excl??"; return 0; } list<string> mtypes; if (config && config->getMimeCatTypes((*it)->m_value, mtypes) && !mtypes.empty()) { for (list<string>::iterator mit = mtypes.begin(); mit != mtypes.end(); mit++) { if ((*it)->m_op == WasaQuery::OP_LEAF) sdata->addFiletype(*mit); else sdata->remFiletype(*mit); } } else { reason = "Unknown rclcat/type value: no mime types found"; return 0; } continue; } // Filtering on location if (!stringicmp("dir", (*it)->m_fieldspec)) { string dir = path_tildexpand((*it)->m_value); sdata->setTopdir(dir, (*it)->m_op == WasaQuery::OP_EXCL, (*it)->m_weight); continue; } // Handle "date" spec if (!stringicmp("date", (*it)->m_fieldspec)) { if ((*it)->m_op != WasaQuery::OP_LEAF) { reason = "Negative date filtering not supported"; return 0; } DateInterval di; if (!parsedateinterval((*it)->m_value, &di)) { LOGERR(("wasaQueryToRcl: bad date interval format\n")); reason = "Bad date interval format"; return 0; } LOGDEB(("wasaQueryToRcl:: date span: %d-%d-%d/%d-%d-%d\n", di.y1,di.m1,di.d1, di.y2,di.m2,di.d2)); sdata->setDateSpan(&di); continue; } // Handle "size" spec if (!stringicmp("size", (*it)->m_fieldspec)) { if ((*it)->m_op != WasaQuery::OP_LEAF) { reason = "Negative size filtering not supported"; return 0; } char *cp; size_t size = strtoll((*it)->m_value.c_str(), &cp, 10); if (*cp != 0) { switch (*cp) { case 'k': case 'K': size *= 1E3;break; case 'm': case 'M': size *= 1E6;break; case 'g': case 'G': size *= 1E9;break; case 't': case 'T': size *= 1E12;break; default: reason = string("Bad multiplier suffix: ") + *cp; return 0; } } switch ((*it)->m_rel) { case WasaQuery::REL_EQUALS: sdata->setMaxSize(size); sdata->setMinSize(size); break; case WasaQuery::REL_LT: case WasaQuery::REL_LTE: sdata->setMaxSize(size); break; case WasaQuery::REL_GT: case WasaQuery::REL_GTE: sdata->setMinSize(size); break; default: reason = "Bad relation operator with size query. Use > < or ="; return 0; } continue; } // "Regular" processing follows: switch ((*it)->m_op) { case WasaQuery::OP_NULL: case WasaQuery::OP_AND: default: reason = "Found bad NULL or AND query type in list"; LOGERR(("wasaQueryToRcl: found bad NULL or AND q type in list\n")); continue; case WasaQuery::OP_LEAF: { LOGDEB(("wasaQueryToRcl: leaf clause [%s]:[%s] slack %d\n", (*it)->m_fieldspec.c_str(), (*it)->m_value.c_str(), (*it)->m_slack)); // Change terms found in the "autosuffs" list into "ext" // field queries if ((*it)->m_fieldspec.empty() && !autosuffs.empty()) { vector<string> asfv; if (stringToStrings(autosuffs, asfv)) { if (find_if(asfv.begin(), asfv.end(), StringIcmpPred((*it)->m_value)) != asfv.end()) { (*it)->m_fieldspec = "ext"; (*it)->m_modifiers |= WasaQuery::WQM_NOSTEM; } } } unsigned int mods = (unsigned int)(*it)->m_modifiers; // I'm not sure I understand the phrase/near detection // thereafter anymore, maybe it would be better to have an // explicit flag. Mods can only be set after a double // quote. if (TextSplit::hasVisibleWhite((*it)->m_value) || mods) { Rcl::SClType tp = Rcl::SCLT_PHRASE; if (mods & WasaQuery::WQM_PROX) { tp = Rcl::SCLT_NEAR; } nclause = new Rcl::SearchDataClauseDist(tp, (*it)->m_value, (*it)->m_slack, (*it)->m_fieldspec); } else { nclause = new Rcl::SearchDataClauseSimple(Rcl::SCLT_AND, (*it)->m_value, (*it)->m_fieldspec); } if (nclause == 0) { reason = "Out of memory"; LOGERR(("wasaQueryToRcl: out of memory\n")); return 0; } if (mods & WasaQuery::WQM_NOSTEM) { nclause->addModifier(Rcl::SearchDataClause::SDCM_NOSTEMMING); } if ((*it)->m_weight != 1.0) nclause->setWeight((*it)->m_weight); sdata->addClause(nclause); } break; case WasaQuery::OP_EXCL: LOGDEB2(("wasaQueryToRcl: excl clause [%s]:[%s]\n", (*it)->m_fieldspec.c_str(), (*it)->m_value.c_str())); if (wasa->m_op != WasaQuery::OP_AND) { LOGERR(("wasaQueryToRcl: negative clause inside OR list!\n")); continue; } // Note: have to add dquotes which will be translated to // phrase if there are several words in there. Not pretty // but should work. If there is actually a single // word, it will not be taken as a phrase, and // stem-expansion will work normally // Have to do this because searchdata has nothing like and_not nclause = new Rcl::SearchDataClauseSimple(Rcl::SCLT_EXCL, string("\"") + (*it)->m_value + "\"", (*it)->m_fieldspec); if (nclause == 0) { reason = "Out of memory"; LOGERR(("wasaQueryToRcl: out of memory\n")); return 0; } if ((*it)->m_modifiers & WasaQuery::WQM_NOSTEM) nclause->setModifiers(Rcl::SearchDataClause::SDCM_NOSTEMMING); if ((*it)->m_weight != 1.0) nclause->setWeight((*it)->m_weight); sdata->addClause(nclause); break; case WasaQuery::OP_OR: LOGDEB2(("wasaQueryToRcl: OR clause [%s]:[%s]\n", (*it)->m_fieldspec.c_str(), (*it)->m_value.c_str())); // Create a subquery. Rcl::SearchData *sub = wasaQueryToRcl(config, *it, autosuffs, reason); if (sub == 0) { continue; } nclause = new Rcl::SearchDataClauseSub(Rcl::SCLT_SUB, RefCntr<Rcl::SearchData>(sub)); if (nclause == 0) { LOGERR(("wasaQueryToRcl: out of memory\n")); reason = "Out of memory"; return 0; } if ((*it)->m_modifiers & WasaQuery::WQM_NOSTEM) nclause->setModifiers(Rcl::SearchDataClause::SDCM_NOSTEMMING); sdata->addClause(nclause); } } return sdata; } Rcl::SearchData *wasaStringToRcl(RclConfig *config, const string &qs, string &reason, const string& autosuffs) { StringToWasaQuery parser; WasaQuery *wq = parser.stringToQuery(qs, reason); if (wq == 0) return 0; return wasaQueryToRcl(config, wq, autosuffs, reason); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/query/wasatorcl.h���������������������������������������������������������������������000644 �001750 �000000 �00000002134 11740755063 017011� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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 _WASATORCL_H_INCLUDED_ #define _WASATORCL_H_INCLUDED_ #include <string> using std::string; #include "rcldb.h" #include "searchdata.h" class RclConfig; extern Rcl::SearchData *wasaStringToRcl(RclConfig *, const string& query, string &reason, const string& autosuffs = string()); #endif /* _WASATORCL_H_INCLUDED_ */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/query/xadump.cpp����������������������������������������������������������������������000644 �001750 �000000 �00000021717 11740755063 016653� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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 <stdio.h> #include <stdlib.h> #include <signal.h> #include <strings.h> #include <iostream> #include <string> #include <vector> #include "pathut.h" #ifndef NO_NAMESPACES using namespace std; #endif /* NO_NAMESPACES */ #include "utf8iter.h" #include "xapian.h" static string thisprog; static string usage = " -d <dbdir> -e <output encoding>\n" " -i docid -D : get document data for docid\n" " -i docid -X : delete document docid\n" " -i docid -b : 'rebuild' document from term positions\n" " -i docid -T : term list for doc docid\n" " -t term -E : term existence test\n" " -t term -F : retrieve term frequency data for given term\n" " -t term -P : retrieve postings for term\n" " -T : list all terms\n" " -f : precede each term in the list with its occurrence counts\n" " -n : raw data (no [])\n" " -l : don't list prefixed terms\n" " -x : separate each output char with a space\n" " -s : special mode to dump recoll stem db\n" " -q term [term ...] : perform AND query\n" " \n\n" ; static void Usage(void) { cerr << thisprog << ": usage:\n" << usage; exit(1); } static int op_flags; #define OPT_D 0x1 #define OPT_E 0x2 #define OPT_F 0x4 #define OPT_P 0x8 #define OPT_T 0x10 #define OPT_X 0x20 #define OPT_b 0x40 #define OPT_d 0x80 #define OPT_e 0x100 #define OPT_f 0x200 #define OPT_i 0x400 #define OPT_n 0x800 #define OPT_q 0x1000 #define OPT_s 0x2000 #define OPT_t 0x4000 #define OPT_x 0x8000 #define OPT_l 0x10000 // Compute an exploded version of string, inserting a space between each char. // (no character combining possible) static string detailstring(const string& in) { if (!(op_flags & OPT_x)) return in; string out; Utf8Iter it(in); for (; !it.eof(); it++) { it.appendchartostring(out); out += ' '; } // Strip last space if (!out.empty()) out.resize(out.size()-1); return out; } Xapian::Database *db; static void cleanup() { delete db; } static void sigcleanup(int sig) { fprintf(stderr, "sigcleanup\n"); cleanup(); exit(1); } int main(int argc, char **argv) { string dbdir = path_cat(path_home(), ".recoll/xapiandb"); string outencoding = "ISO8859-1"; int docid = 1; string aterm; 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 'D': op_flags |= OPT_D; break; case 'd': op_flags |= OPT_d; if (argc < 2) Usage(); dbdir = *(++argv); argc--; goto b1; case 'E': op_flags |= OPT_E; break; case 'e': op_flags |= OPT_d; if (argc < 2) Usage(); outencoding = *(++argv); argc--; goto b1; case 'F': op_flags |= OPT_F; break; case 'f': op_flags |= OPT_f; break; case 'i': op_flags |= OPT_i; if (argc < 2) Usage(); if (sscanf(*(++argv), "%d", &docid) != 1) Usage(); argc--; goto b1; case 'l': op_flags |= OPT_l; 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 'T': op_flags |= OPT_T; break; case 't': op_flags |= OPT_t; if (argc < 2) Usage(); aterm = *(++argv); argc--; goto b1; case 'X': op_flags |= OPT_X; break; case 'x': op_flags |= OPT_x; break; default: Usage(); break; } b1: argc--; argv++; } vector<string> qterms; if (op_flags & OPT_q) { fprintf(stderr, "q argc %d\n", argc); if (argc < 1) Usage(); while (argc > 0) { qterms.push_back(*argv++); argc--; } } if (argc != 0) Usage(); atexit(cleanup); if (signal(SIGHUP, SIG_IGN) != SIG_IGN) signal(SIGHUP, sigcleanup); if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, sigcleanup); if (signal(SIGQUIT, SIG_IGN) != SIG_IGN) signal(SIGQUIT, sigcleanup); if (signal(SIGTERM, SIG_IGN) != SIG_IGN) signal(SIGTERM, sigcleanup); try { db = new Xapian::Database(dbdir); cout << "DB: ndocs " << db->get_doccount() << " lastdocid " << db->get_lastdocid() << " avglength " << db->get_avlength() << endl; if (op_flags & OPT_T) { Xapian::TermIterator term; string printable; string op = (op_flags & OPT_n) ? string(): "["; string cl = (op_flags & OPT_n) ? string(): "]"; if (op_flags & OPT_i) { for (term = db->termlist_begin(docid); term != db->termlist_end(docid);term++) { const string& s = *term; if ((op_flags&OPT_l) && !s.empty() && s[0] >= 'A' && s[0] <= 'Z') continue; cout << op << detailstring(s) << cl << endl; } } else { for (term = db->allterms_begin(); term != db->allterms_end();term++) { const string& s = *term; if ((op_flags&OPT_l) && !s.empty() && s[0] >= 'A' && s[0] <= 'Z') continue; if (op_flags & OPT_f) cout << db->get_collection_freq(*term) << " " << term.get_termfreq() << " "; cout << op << detailstring(s) << cl << endl; } } } else if (op_flags & OPT_s) { for (unsigned int docid = 1; docid < db->get_lastdocid(); docid++) { // cout << docid << ": "; Xapian::TermIterator term; for (term = db->termlist_begin(docid); term != db->termlist_end(docid);term++) { cout << detailstring(*term) << " "; Xapian::Document doc = db->get_document(docid); string data = doc.get_data(); cout << data; } } } else if (op_flags & OPT_D) { Xapian::Document doc = db->get_document(docid); string data = doc.get_data(); cout << data << endl; } else if (op_flags & OPT_X) { Xapian::Document doc = db->get_document(docid); string data = doc.get_data(); cout << data << endl; cout << "Really delete xapian document ?" << endl; string rep; cin >> rep; if (!rep.empty() && (rep[0] == 'y' || rep[0] == 'Y')) { Xapian::WritableDatabase wdb(dbdir, Xapian::DB_OPEN); cout << "Deleting" << endl; wdb.delete_document(docid); } } else if (op_flags & OPT_b) { if (!(op_flags & OPT_i)) Usage(); vector<string> buf; Xapian::TermIterator term; for (term = db->termlist_begin(docid); term != db->termlist_end(docid); term++) { Xapian::PositionIterator pos; for (pos = db->positionlist_begin(docid, *term); pos != db->positionlist_end(docid, *term); pos++) { if (buf.size() <= *pos) buf.resize((*pos)+100); buf[(*pos)] = detailstring(*term); } } for (vector<string>::iterator it = buf.begin(); it != buf.end(); it++) { cout << *it << " "; } } else if (op_flags & OPT_P) { Xapian::PostingIterator doc; for (doc = db->postlist_begin(aterm); doc != db->postlist_end(aterm); doc++) { cout << *doc << "(" << doc.get_wdf() << ") : " ; Xapian::PositionIterator pos; for (pos = doc.positionlist_begin(); pos != doc.positionlist_end(); pos++) { cout << *pos << " " ; } cout << endl; } } else if (op_flags & OPT_F) { cout << "FreqFor " << aterm << " : " << db->get_termfreq(aterm) << endl; } else if (op_flags & OPT_E) { cout << "Exists [" << aterm << "] : " << db->term_exists(aterm) << endl; } else if (op_flags & OPT_q) { Xapian::Enquire enquire(*db); Xapian::Query query(Xapian::Query::OP_AND, qterms.begin(), qterms.end()); cout << "Performing query `" << query.get_description() << "'" << endl; enquire.set_query(query); Xapian::MSet matches = enquire.get_mset(0, 10); cout << "Estimated results: " << matches.get_matches_lower_bound() << endl; Xapian::MSetIterator i; for (i = matches.begin(); i != matches.end(); ++i) { cout << "Document ID " << *i << "\t"; cout << i.get_percent() << "% "; Xapian::Document doc = i.get_document(); cout << "[" << doc.get_data() << "]" << endl; } } } catch (const Xapian::Error &e) { cout << "Exception: " << e.get_msg() << endl; } catch (const string &s) { cout << "Exception: " << s << endl; } catch (const char *s) { cout << "Exception: " << s << endl; } catch (...) { cout << "Caught unknown exception" << endl; } exit(0); } �������������������������������������������������recoll-1.17.3/qtgui/advsearch.ui��������������������������������������������������������������������000644 �001750 �000000 �00000046542 11740755063 017137� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>AdvSearchBase</class> <widget class="QDialog" name="AdvSearchBase"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>544</width> <height>441</height> </rect> </property> <property name="windowTitle"> <string>Advanced search</string> </property> <property name="sizeGripEnabled"> <bool>true</bool> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QTabWidget" name="tabWidget"> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="tab_5"> <attribute name="title"> <string>Find</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QHBoxLayout"> <item> <layout class="QVBoxLayout"> <property name="spacing"> <number>2</number> </property> <item> <widget class="QLabel" name="textLabel2"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="toolTip"> <string>All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored.</string> </property> <property name="frameShape"> <enum>QFrame::NoFrame</enum> </property> <property name="frameShadow"> <enum>QFrame::Plain</enum> </property> <property name="text"> <string>Search for <br>documents<br>satisfying:</string> </property> <property name="wordWrap"> <bool>false</bool> </property> <property name="margin"> <number>4</number> </property> </widget> </item> <item> <widget class="QComboBox" name="conjunctCMB"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>8</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="toolTip"> <string>All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored.</string> </property> </widget> </item> <item> <spacer name="spacer2"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>0</width> <height>0</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="delClausePB"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Delete clause</string> </property> <property name="autoDefault"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QPushButton" name="addClausePB"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Add clause</string> </property> <property name="autoDefault"> <bool>false</bool> </property> </widget> </item> </layout> </item> <item> <widget class="QFrame" name="clauseFRM"> <property name="frameShape"> <enum>QFrame::StyledPanel</enum> </property> <property name="frameShadow"> <enum>QFrame::Plain</enum> </property> <layout class="QVBoxLayout"> <property name="spacing"> <number>1</number> </property> <property name="margin"> <number>0</number> </property> <item> <widget class="Line" name="clauseline"> <property name="frameShape"> <enum>QFrame::HLine</enum> </property> <property name="frameShadow"> <enum>QFrame::Plain</enum> </property> </widget> </item> </layout> </widget> </item> </layout> </item> </layout> </widget> <widget class="QWidget" name="tab_6"> <attribute name="title"> <string>Filter</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_5"> <item> <layout class="QVBoxLayout" name="verticalLayout_4"> <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QCheckBox" name="filterDatesCB"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>1</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="toolTip"> <string>Check this to enable filtering on dates</string> </property> <property name="text"> <string>Filter dates</string> </property> </widget> </item> <item> <widget class="QLabel" name="label"> <property name="text"> <string>From</string> </property> </widget> </item> <item> <widget class="QDateEdit" name="minDateDTE"> <property name="enabled"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QLabel" name="label_2"> <property name="text"> <string>To</string> </property> </widget> </item> <item> <widget class="QDateEdit" name="maxDateDTE"> <property name="enabled"> <bool>false</bool> </property> </widget> </item> </layout> </item> <item> <widget class="Line" name="line2"> <property name="frameShape"> <enum>QFrame::HLine</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QCheckBox" name="filterSizesCB"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>1</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="toolTip"> <string>Check this to enable filtering on sizes</string> </property> <property name="text"> <string>Filter sizes</string> </property> </widget> </item> <item> <widget class="QLabel" name="labelminsize"> <property name="toolTip"> <string>Minimum size. You can use k/K,m/M,g/G as multipliers</string> </property> <property name="text"> <string>Min. Size</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="minSizeLE"> <property name="enabled"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QLabel" name="labelmaxsize"> <property name="toolTip"> <string>Maximum size. You can use k/K,m/M,g/G as multipliers</string> </property> <property name="text"> <string>Max. Size</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="maxSizeLE"> <property name="enabled"> <bool>false</bool> </property> </widget> </item> </layout> </item> <item> <widget class="Line" name="line4"> <property name="frameShape"> <enum>QFrame::HLine</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> </widget> </item> <item> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <layout class="QHBoxLayout"> <item> <widget class="QCheckBox" name="restrictFtCB"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>1</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="toolTip"> <string>Check this to enable filtering on file types</string> </property> <property name="text"> <string>Restrict file types</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="restrictCtCB"> <property name="enabled"> <bool>false</bool> </property> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>1</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="toolTip"> <string>Check this to use file categories instead of raw mime types</string> </property> <property name="text"> <string>By categories</string> </property> </widget> </item> <item> <widget class="QPushButton" name="saveFileTypesPB"> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>Save as default</string> </property> <property name="autoDefault"> <bool>false</bool> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout"> <item> <layout class="QVBoxLayout"> <property name="spacing"> <number>0</number> </property> <item> <widget class="QLabel" name="textLabel2_2"> <property name="text"> <string>Searched file types</string> </property> <property name="wordWrap"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QListWidget" name="yesFiltypsLB"> <property name="enabled"> <bool>false</bool> </property> <property name="minimumSize"> <size> <width>200</width> <height>20</height> </size> </property> <property name="selectionMode"> <enum>QAbstractItemView::ExtendedSelection</enum> </property> </widget> </item> </layout> </item> <item> <layout class="QVBoxLayout"> <property name="spacing"> <number>0</number> </property> <item> <widget class="QPushButton" name="delAFiltypPB"> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>All ----></string> </property> <property name="autoDefault"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QPushButton" name="delFiltypPB"> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>Sel -----></string> </property> <property name="autoDefault"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QPushButton" name="addFiltypPB"> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string><----- Sel</string> </property> <property name="autoDefault"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QPushButton" name="addAFiltypPB"> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string><----- All</string> </property> <property name="autoDefault"> <bool>false</bool> </property> </widget> </item> </layout> </item> <item> <layout class="QVBoxLayout"> <property name="spacing"> <number>0</number> </property> <item> <widget class="QLabel" name="textLabel3"> <property name="text"> <string>Ignored file types</string> </property> <property name="wordWrap"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QListWidget" name="noFiltypsLB"> <property name="enabled"> <bool>false</bool> </property> <property name="minimumSize"> <size> <width>200</width> <height>20</height> </size> </property> <property name="selectionMode"> <enum>QAbstractItemView::ExtendedSelection</enum> </property> </widget> </item> </layout> </item> </layout> </item> </layout> </item> <item> <widget class="Line" name="line5"> <property name="frameShape"> <enum>QFrame::HLine</enum> </property> <property name="frameShadow"> <enum>QFrame::Sunken</enum> </property> </widget> </item> <item> <layout class="QGridLayout"> <item row="1" column="0"> <widget class="QComboBox" name="subtreeCMB"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <horstretch>8</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>300</width> <height>0</height> </size> </property> <property name="toolTip"> <string>Enter top directory for search</string> </property> <property name="editable"> <bool>true</bool> </property> <property name="maxCount"> <number>20</number> </property> <property name="insertPolicy"> <enum>QComboBox::NoInsert</enum> </property> <property name="duplicatesEnabled"> <bool>false</bool> </property> </widget> </item> <item row="1" column="1"> <widget class="QPushButton" name="browsePB"> <property name="text"> <string>Browse</string> </property> <property name="autoDefault"> <bool>false</bool> </property> </widget> </item> <item row="0" column="0"> <widget class="QLabel" name="textLabel1"> <property name="text"> <string>Restrict results to files in subtree:</string> </property> <property name="wordWrap"> <bool>false</bool> </property> </widget> </item> <item row="0" column="1"> <widget class="QCheckBox" name="direxclCB"> <property name="text"> <string>Invert</string> </property> </widget> </item> </layout> </item> </layout> </item> </layout> </widget> </widget> </item> <item> <layout class="QHBoxLayout"> <item> <widget class="QPushButton" name="searchPB"> <property name="text"> <string>Start Search</string> </property> </widget> </item> <item> <widget class="QPushButton" name="dismissPB"> <property name="text"> <string>Close</string> </property> <property name="autoDefault"> <bool>false</bool> </property> </widget> </item> </layout> </item> </layout> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/> </ui> ��������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/advsearch_w.cpp�����������������������������������������������������������������000644 �001750 �000000 �00000031661 11740755063 017626� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2005 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 "advsearch_w.h" #include <qvariant.h> #include <qpushbutton.h> #include <qlabel.h> #include <qlineedit.h> #include <qframe.h> #include <qcheckbox.h> #include <qevent.h> #include <qlayout.h> #include <qtooltip.h> #include <qwhatsthis.h> #include <qmessagebox.h> #include <list> #include <string> #include <map> #include <algorithm> #ifndef NO_NAMESPACES using std::list; using std::string; using std::map; using std::unique; #endif /* NO_NAMESPACES */ #include "recoll.h" #include "rclconfig.h" #include "debuglog.h" #include "searchdata.h" #include "guiutils.h" #include "rclhelp.h" static const int initclausetypes[] = {1, 3, 0, 2, 5}; static const unsigned int iclausescnt = sizeof(initclausetypes) / sizeof(int); static map<QString,QString> cat_translations; static map<QString,QString> cat_rtranslations; void AdvSearch::init() { (void)new HelpClient(this); HelpClient::installMap((const char *)objectName().toUtf8(), "RCL.SEARCH.COMPLEX"); // signals and slots connections connect(delFiltypPB, SIGNAL(clicked()), this, SLOT(delFiltypPB_clicked())); connect(searchPB, SIGNAL(clicked()), this, SLOT(runSearch())); connect(filterDatesCB, SIGNAL(toggled(bool)), this, SLOT(filterDatesCB_toggled(bool))); connect(filterSizesCB, SIGNAL(toggled(bool)), this, SLOT(filterSizesCB_toggled(bool))); connect(restrictFtCB, SIGNAL(toggled(bool)), this, SLOT(restrictFtCB_toggled(bool))); connect(restrictCtCB, SIGNAL(toggled(bool)), this, SLOT(restrictCtCB_toggled(bool))); connect(dismissPB, SIGNAL(clicked()), this, SLOT(close())); connect(browsePB, SIGNAL(clicked()), this, SLOT(browsePB_clicked())); connect(addFiltypPB, SIGNAL(clicked()), this, SLOT(addFiltypPB_clicked())); connect(delAFiltypPB, SIGNAL(clicked()), this, SLOT(delAFiltypPB_clicked())); connect(addAFiltypPB, SIGNAL(clicked()), this, SLOT(addAFiltypPB_clicked())); connect(saveFileTypesPB, SIGNAL(clicked()), this, SLOT(saveFileTypes())); connect(addClausePB, SIGNAL(clicked()), this, SLOT(addClause())); connect(delClausePB, SIGNAL(clicked()), this, SLOT(delClause())); conjunctCMB->insertItem(1, tr("All clauses")); conjunctCMB->insertItem(2, tr("Any clause")); // Create preconfigured clauses for (unsigned int i = 0; i < iclausescnt; i++) { addClause(initclausetypes[i]); } // Tune initial state according to last saved { std::list<SearchClauseW *>::iterator cit = m_clauseWins.begin(); for (vector<int>::iterator it = prefs.advSearchClauses.begin(); it != prefs.advSearchClauses.end(); it++) { if (cit != m_clauseWins.end()) { (*cit)->tpChange(*it); cit++; } else { addClause(*it); } } } (*m_clauseWins.begin())->wordsLE->setFocus(); // Initialize min/max mtime from extrem values in the index int minyear, maxyear; if (rcldb) { rcldb->maxYearSpan(&minyear, &maxyear); minDateDTE->setDate(QDate(minyear, 1, 1)); maxDateDTE->setDate(QDate(maxyear, 12, 31)); } // Initialize lists of accepted and ignored mime types from config // and settings m_ignTypes = prefs.asearchIgnFilTyps; m_ignByCats = prefs.fileTypesByCats; restrictCtCB->setEnabled(false); restrictCtCB->setChecked(m_ignByCats); fillFileTypes(); subtreeCMB->insertItems(0, prefs.asearchSubdirHist); subtreeCMB->setEditText(""); // The clauseline frame is needed to force designer to accept a // vbox to englobe the base clauses grid and 'something else' (the // vbox is so that we can then insert SearchClauseWs), but we // don't want to see it. clauseline->close(); bool calpop = 0; minDateDTE->setCalendarPopup(calpop); maxDateDTE->setCalendarPopup(calpop); // Translations for known categories cat_translations[QString::fromUtf8("texts")] = tr("texts"); cat_rtranslations[tr("texts")] = QString::fromUtf8("texts"); cat_translations[QString::fromUtf8("spreadsheets")] = tr("spreadsheets"); cat_rtranslations[tr("spreadsheets")] = QString::fromUtf8("spreadsheets"); cat_translations[QString::fromUtf8("presentations")] = tr("presentations"); cat_rtranslations[tr("presentations")] =QString::fromUtf8("presentations"); cat_translations[QString::fromUtf8("media")] = tr("media"); cat_rtranslations[tr("media")] = QString::fromUtf8("media"); cat_translations[QString::fromUtf8("messages")] = tr("messages"); cat_rtranslations[tr("messages")] = QString::fromUtf8("messages"); cat_translations[QString::fromUtf8("other")] = tr("other"); cat_rtranslations[tr("other")] = QString::fromUtf8("other"); } void AdvSearch::saveCnf() { // Save my state prefs.advSearchClauses.clear(); for (std::list<SearchClauseW *>::iterator cit = m_clauseWins.begin(); cit != m_clauseWins.end(); cit++) { prefs.advSearchClauses.push_back((*cit)->sTpCMB->currentIndex()); } } bool AdvSearch::close() { saveCnf(); return QWidget::close(); } void AdvSearch::delAFiltypPB_clicked() { yesFiltypsLB->selectAll(); delFiltypPB_clicked(); } void AdvSearch::addClause() { addClause(0); } void AdvSearch::addClause(int tp) { SearchClauseW *w = new SearchClauseW(clauseFRM); m_clauseWins.push_back(w); ((QVBoxLayout *)(clauseFRM->layout()))->addWidget(w); w->show(); w->tpChange(tp); if (m_clauseWins.size() > iclausescnt) { delClausePB->setEnabled(true); } else { delClausePB->setEnabled(false); } } void AdvSearch::delClause() { if (m_clauseWins.size() <= iclausescnt) return; delete m_clauseWins.back(); m_clauseWins.pop_back(); if (m_clauseWins.size() > iclausescnt) { delClausePB->setEnabled(true); } else { delClausePB->setEnabled(false); } } // Move selected file types from the searched to the ignored box void AdvSearch::delFiltypPB_clicked() { QList<QListWidgetItem *> items = yesFiltypsLB->selectedItems(); for (QList<QListWidgetItem *>::iterator it = items.begin(); it != items.end(); it++) { int row = yesFiltypsLB->row(*it); QListWidgetItem *item = yesFiltypsLB->takeItem(row); noFiltypsLB->insertItem(0, item); } guiListsToIgnTypes(); } // Move selected file types from the ignored to the searched box void AdvSearch::addFiltypPB_clicked() { QList<QListWidgetItem *> items = noFiltypsLB->selectedItems(); for (QList<QListWidgetItem *>::iterator it = items.begin(); it != items.end(); it++) { int row = noFiltypsLB->row(*it); QListWidgetItem *item = noFiltypsLB->takeItem(row); yesFiltypsLB->insertItem(0, item); } guiListsToIgnTypes(); } // Compute list of ignored mime type from widget lists void AdvSearch::guiListsToIgnTypes() { yesFiltypsLB->sortItems(); noFiltypsLB->sortItems(); m_ignTypes.clear(); for (int i = 0; i < noFiltypsLB->count();i++) { QListWidgetItem *item = noFiltypsLB->item(i); m_ignTypes.append(item->text()); } } void AdvSearch::addAFiltypPB_clicked() { noFiltypsLB->selectAll(); addFiltypPB_clicked(); } // Activate file type selection void AdvSearch::restrictFtCB_toggled(bool on) { restrictCtCB->setEnabled(on); yesFiltypsLB->setEnabled(on); delFiltypPB->setEnabled(on); addFiltypPB->setEnabled(on); delAFiltypPB->setEnabled(on); addAFiltypPB->setEnabled(on); noFiltypsLB->setEnabled(on); saveFileTypesPB->setEnabled(on); } // Activate file type selection void AdvSearch::filterSizesCB_toggled(bool on) { minSizeLE->setEnabled(on); maxSizeLE->setEnabled(on); } // Activate file type selection void AdvSearch::filterDatesCB_toggled(bool on) { minDateDTE->setEnabled(on); maxDateDTE->setEnabled(on); } void AdvSearch::restrictCtCB_toggled(bool on) { m_ignByCats = on; // Only reset the list if we're enabled. Else this is init from prefs if (restrictCtCB->isEnabled()) m_ignTypes.clear(); fillFileTypes(); } void AdvSearch::fillFileTypes() { noFiltypsLB->clear(); yesFiltypsLB->clear(); noFiltypsLB->insertItems(0, m_ignTypes); QStringList ql; if (m_ignByCats == false) { list<string> types = theconfig->getAllMimeTypes(); for (list<string>::iterator it = types.begin(); it != types.end(); it++) { QString qs = QString::fromUtf8(it->c_str()); if (m_ignTypes.indexOf(qs) < 0) ql.append(qs); } } else { list<string> cats; theconfig->getMimeCategories(cats); for (list<string>::const_iterator it = cats.begin(); it != cats.end(); it++) { map<QString, QString>::const_iterator it1; QString cat; if ((it1 = cat_translations.find(QString::fromUtf8(it->c_str()))) != cat_translations.end()) { cat = it1->second; } else { cat = QString::fromUtf8(it->c_str()); } if (m_ignTypes.indexOf(cat) < 0) ql.append(cat); } } yesFiltypsLB->insertItems(0, ql); } // Save current list of ignored file types to prefs void AdvSearch::saveFileTypes() { prefs.asearchIgnFilTyps = m_ignTypes; prefs.fileTypesByCats = m_ignByCats; rwSettings(true); } size_t AdvSearch::stringToSize(QString qsize) { size_t size = size_t(-1); qsize.replace(QRegExp("[\\s]+"), ""); if (!qsize.isEmpty()) { string csize((const char*)qsize.toAscii()); char *cp; size = strtoll(csize.c_str(), &cp, 10); if (*cp != 0) { switch (*cp) { case 'k': case 'K': size *= 1E3;break; case 'm': case 'M': size *= 1E6;break; case 'g': case 'G': size *= 1E9;break; case 't': case 'T': size *= 1E12;break; default: QMessageBox::warning(0, "Recoll", tr("Bad multiplier suffix in size filter")); size = size_t(-1); } } } return size; } using namespace Rcl; void AdvSearch::runSearch() { RefCntr<SearchData> sdata(new SearchData(conjunctCMB->currentIndex() == 0 ? SCLT_AND : SCLT_OR)); bool hasclause = false; for (list<SearchClauseW*>::iterator it = m_clauseWins.begin(); it != m_clauseWins.end(); it++) { SearchDataClause *cl; if ((cl = (*it)->getClause())) { sdata->addClause(cl); hasclause = true; } } if (!hasclause) return; if (restrictFtCB->isChecked() && noFiltypsLB->count() > 0) { for (int i = 0; i < yesFiltypsLB->count(); i++) { if (restrictCtCB->isChecked()) { QString qcat = yesFiltypsLB->item(i)->text(); map<QString,QString>::const_iterator qit; string cat; if ((qit = cat_rtranslations.find(qcat)) != cat_rtranslations.end()) { cat = (const char *)qit->second.toUtf8(); } else { cat = (const char *)qcat.toUtf8(); } list<string> types; theconfig->getMimeCatTypes(cat, types); for (list<string>::const_iterator it = types.begin(); it != types.end(); it++) { sdata->addFiletype(*it); } } else { sdata->addFiletype((const char *) yesFiltypsLB->item(i)->text().toUtf8()); } } } if (filterDatesCB->isChecked()) { QDate mindate = minDateDTE->date(); QDate maxdate = maxDateDTE->date(); DateInterval di; di.y1 = mindate.year(); di.m1 = mindate.month(); di.d1 = mindate.day(); di.y2 = maxdate.year(); di.m2 = maxdate.month(); di.d2 = maxdate.day(); sdata->setDateSpan(&di); } if (filterSizesCB->isChecked()) { size_t size = stringToSize(minSizeLE->text()); sdata->setMinSize(size); size = stringToSize(maxSizeLE->text()); sdata->setMaxSize(size); } if (!subtreeCMB->currentText().isEmpty()) { QString current = subtreeCMB->currentText(); sdata->setTopdir((const char*)subtreeCMB->currentText().toUtf8(), direxclCB->isChecked()); // Keep history list clean and sorted. Maybe there would be a // simpler way to do this list<QString> entries; for (int i = 0; i < subtreeCMB->count(); i++) { entries.push_back(subtreeCMB->itemText(i)); } entries.push_back(subtreeCMB->currentText()); entries.sort(); unique(entries.begin(), entries.end()); subtreeCMB->clear(); for (list<QString>::iterator it = entries.begin(); it != entries.end(); it++) { subtreeCMB->addItem(*it); } subtreeCMB->setCurrentIndex(subtreeCMB->findText(current)); prefs.asearchSubdirHist.clear(); for (int index = 0; index < subtreeCMB->count(); index++) prefs.asearchSubdirHist.push_back(subtreeCMB->itemText(index)); } saveCnf(); emit startSearch(sdata); } void AdvSearch::browsePB_clicked() { QString dir = myGetFileName(true); subtreeCMB->setEditText(dir); } �������������������������������������������������������������������������������recoll-1.17.3/qtgui/advsearch_w.h�������������������������������������������������������������������000644 �001750 �000000 �00000004232 11740755063 017265� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2005 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 _ADVSEARCH_W_H_INCLUDED_ #define _ADVSEARCH_W_H_INCLUDED_ #include <list> #include <qvariant.h> #include <qdialog.h> #include "searchclause_w.h" #include "recoll.h" #include "refcntr.h" #include "searchdata.h" class QDialog; #include "ui_advsearch.h" class AdvSearch : public QDialog, public Ui::AdvSearchBase { Q_OBJECT public: AdvSearch(QDialog* parent = 0) : QDialog(parent) { setupUi(this); init(); } ~AdvSearch(){} public slots: virtual void delFiltypPB_clicked(); virtual void delAFiltypPB_clicked(); virtual void addFiltypPB_clicked(); virtual void addAFiltypPB_clicked(); virtual void guiListsToIgnTypes(); virtual void filterDatesCB_toggled(bool); virtual void filterSizesCB_toggled(bool); virtual void restrictFtCB_toggled(bool); virtual void restrictCtCB_toggled(bool); virtual void runSearch(); virtual void browsePB_clicked(); virtual void saveFileTypes(); virtual void delClause(); virtual void addClause(); virtual void addClause(int); virtual bool close(); signals: void startSearch(RefCntr<Rcl::SearchData>); private: virtual void init(); std::list<SearchClauseW *> m_clauseWins; QStringList m_ignTypes; bool m_ignByCats; void saveCnf(); void fillFileTypes(); size_t stringToSize(QString); }; #endif /* _ADVSEARCH_W_H_INCLUDED_ */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/confgui/������������������������������������������������������������������������000755 �001750 �000000 �00000000000 11757434240 016256� 5����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/crontool.cpp��������������������������������������������������������������������000644 �001750 �000000 �00000005727 11740755063 017203� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2005 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 <stdio.h> #include <QPushButton> #include <QMessageBox> #include <QTimer> #include "recoll.h" #include "crontool.h" #include "ecrontab.h" #include "smallut.h" static string marker; static string idstring(const string& confdir) { // Quote conf dir, there may be spaces and whatelse in there return string("RECOLL_CONFDIR=") + escapeShell(confdir); } void CronToolW::init() { marker = "RCLCRON_RCLINDEX="; enableButton = new QPushButton(tr("Enable")); disableButton = new QPushButton(tr("Disable")); buttonBox->addButton(enableButton, QDialogButtonBox::ActionRole); buttonBox->addButton(disableButton, QDialogButtonBox::ActionRole); connect(enableButton, SIGNAL(clicked()), this, SLOT(enableCron())); connect(disableButton, SIGNAL(clicked()), this, SLOT(disableCron())); // Try to read the current values if (!theconfig) return; if (checkCrontabUnmanaged(marker, "recollindex")) { QMessageBox::warning(0, "Recoll", tr("It seems that manually edited entries exist for recollindex, cannot edit crontab")); QTimer::singleShot(0, this, SLOT(close())); } string id = idstring(theconfig->getConfDir()); vector<string> sched; if (getCrontabSched(marker, id, sched)) { minsLE->setText(QString::fromAscii(sched[0].c_str())); hoursLE->setText(QString::fromAscii(sched[1].c_str())); daysLE->setText(QString::fromAscii(sched[4].c_str())); } } void CronToolW::enableCron() { changeCron(true); } void CronToolW::disableCron() { changeCron(false); } void CronToolW::changeCron(bool enable) { if (!theconfig) return; string id = idstring(theconfig->getConfDir()); string cmd("recollindex"); string reason; if (!enable) { editCrontab(marker, id, "", "", reason); accept(); } else { string mins((const char *)minsLE->text().toAscii()); string hours((const char *)hoursLE->text().toAscii()); string days((const char *)daysLE->text().toAscii()); string sched = mins + " " + hours + " * * " + days; if (editCrontab(marker, id, sched, cmd, reason)) { accept(); } else { QMessageBox::warning(0, "Recoll", tr("Error installing cron entry. Bad syntax in fields ?")); } } } �����������������������������������������recoll-1.17.3/qtgui/crontool.h����������������������������������������������������������������������000644 �001750 �000000 �00000002435 11740755063 016641� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 _CRONTOOL_W_H_INCLUDED_ #define _CRONTOOL_W_H_INCLUDED_ #include "ui_crontool.h" class QPushButton; class CronToolW : public QDialog, public Ui::CronToolW { Q_OBJECT public: CronToolW(QWidget * parent = 0) : QDialog(parent), enableButton(0), disableButton(0) { setupUi(this); init(); } QPushButton *enableButton; QPushButton *disableButton; private slots: void enableCron(); void disableCron(); private: void init(); void changeCron(bool enable); }; #endif /* _CRONTOOL_W_H_INCLUDED_ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/crontool.ui���������������������������������������������������������������������000644 �001750 �000000 �00000015737 11740755063 017040� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>CronToolW</class> <widget class="QDialog" name="CronToolW"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>508</width> <height>416</height> </rect> </property> <property name="windowTitle"> <string>Cron Dialog</string> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QLabel" name="label"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>1</verstretch> </sizepolicy> </property> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html></string> </property> <property name="wordWrap"> <bool>true</bool> </property> </widget> </item> <item> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <widget class="QLabel" name="label_4"> <property name="text"> <string>Days of week (* or 0-7, 0 or 7 is Sunday)</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> <item row="0" column="1"> <widget class="QLineEdit" name="daysLE"/> </item> <item row="1" column="0"> <widget class="QLabel" name="label_3"> <property name="text"> <string>Hours (* or 0-23)</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> <item row="1" column="1"> <widget class="QLineEdit" name="hoursLE"/> </item> <item row="2" column="0"> <widget class="QLabel" name="label_2"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Minutes (0-59)</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> <item row="2" column="1"> <widget class="QLineEdit" name="minsLE"/> </item> </layout> </item> <item> <widget class="QLabel" name="label_5"> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html></string> </property> <property name="wordWrap"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="standardButtons"> <set>QDialogButtonBox::Cancel</set> </property> </widget> </item> </layout> </widget> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>CronToolW</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>248</x> <y>254</y> </hint> <hint type="destinationlabel"> <x>157</x> <y>274</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>CronToolW</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>316</x> <y>260</y> </hint> <hint type="destinationlabel"> <x>286</x> <y>274</y> </hint> </hints> </connection> </connections> </ui> ���������������������������������recoll-1.17.3/qtgui/editdialog.h��������������������������������������������������������������������000644 �001750 �000000 �00000002015 11740755063 017101� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 EDITDIALOG_H #define EDITDIALOG_H #include <QDialog> #include "ui_editdialog.h" class EditDialog : public QDialog, public Ui::EditDialog { Q_OBJECT public: EditDialog(QWidget * parent = 0) : QDialog(parent) { setupUi(this); } }; #endif // EDITDIALOG_H �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/editdialog.ui�������������������������������������������������������������������000644 �001750 �000000 �00000002715 11740755063 017276� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>EditDialog</class> <widget class="QDialog" name="Dialog"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>614</width> <height>509</height> </rect> </property> <property name="windowTitle"> <string>Dialog</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QPlainTextEdit" name="plainTextEdit"/> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> </layout> </widget> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>Dialog</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>248</x> <y>254</y> </hint> <hint type="destinationlabel"> <x>157</x> <y>274</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>Dialog</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>316</x> <y>260</y> </hint> <hint type="destinationlabel"> <x>286</x> <y>274</y> </hint> </hints> </connection> </connections> </ui> ���������������������������������������������������recoll-1.17.3/qtgui/firstidx.h����������������������������������������������������������������������000644 �001750 �000000 �00000002040 11740755063 016626� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 _FIRSTIDX_H_INCLUDED_ #define _FIRSTIDX_H_INCLUDED_ #include "ui_firstidx.h" class FirstIdxDialog : public QDialog, public Ui::FirstIdxDialog { Q_OBJECT public: FirstIdxDialog(QWidget * parent = 0) : QDialog(parent) { setupUi(this); } }; #endif /* _FIRSTIDX_H_INCLUDED_ */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/firstidx.ui���������������������������������������������������������������������000644 �001750 �000000 �00000012537 11740755063 017030� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>FirstIdxDialog</class> <widget class="QDialog" name="FirstIdxDialog"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>502</width> <height>503</height> </rect> </property> <property name="windowTitle"> <string>First indexing setup</string> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QLabel" name="label"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>1</verstretch> </sizepolicy> </property> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html></string> </property> <property name="textFormat"> <enum>Qt::RichText</enum> </property> <property name="wordWrap"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QCommandLinkButton" name="idxconfCLB"> <property name="text"> <string>Indexing configuration</string> </property> <property name="checkable"> <bool>false</bool> </property> <property name="autoDefault"> <bool>false</bool> </property> <property name="description"> <string>This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.</string> </property> </widget> </item> <item> <widget class="QCommandLinkButton" name="idxschedCLB"> <property name="text"> <string>Indexing schedule</string> </property> <property name="autoDefault"> <bool>false</bool> </property> <property name="description"> <string>This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron).</string> </property> </widget> </item> <item> <widget class="QPushButton" name="runidxPB"> <property name="text"> <string>Start indexing now</string> </property> </widget> </item> </layout> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="standardButtons"> <set>QDialogButtonBox::Close</set> </property> </widget> </item> </layout> </widget> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>FirstIdxDialog</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>248</x> <y>254</y> </hint> <hint type="destinationlabel"> <x>157</x> <y>274</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>FirstIdxDialog</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>316</x> <y>260</y> </hint> <hint type="destinationlabel"> <x>286</x> <y>274</y> </hint> </hints> </connection> <connection> <sender>runidxPB</sender> <signal>clicked()</signal> <receiver>FirstIdxDialog</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>215</x> <y>400</y> </hint> <hint type="destinationlabel"> <x>215</x> <y>228</y> </hint> </hints> </connection> </connections> </ui> �����������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/guiutils.cpp��������������������������������������������������������������������000644 �001750 �000000 �00000034262 11740755063 017205� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2005 Jean-Francois 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 <unistd.h> #include <algorithm> #include <cstdio> #include "recoll.h" #include "debuglog.h" #include "smallut.h" #include "guiutils.h" #include "pathut.h" #include "base64.h" #include <QSettings> #include <QStringList> #include <QFileDialog> RclDynConf *g_dynconf; // The table should not be necessary, but I found no css way to get // qt 4.6 qtextedit to clear the margins after the float img without // introducing blank space. const char *PrefsPack::dfltResListFormat = #if 1 "<table><tr><td><img src='%I' width='64'></td>" "<td>%R %S %L   <b>%T</b><br>" "%M %D   <i>%U</i> %i<br>" "%A %K</td></tr></table>" #elif 0 "<img src='%I' align='left'>" "%R %S %L   <b>%T</b><br>" "%M %D   <i>%U</i><br>" "%A %K" #endif ; const char* v162reslistformat="<table><tr><td><img src='%I'></td>" "<td>%R %S %L   <b>%T</b><br>" "%M %D   <i>%U</i><br>" "%A %K</td></tr></table>"; // The global preferences structure PrefsPack prefs; // Using the same macro to read/write a setting. insurance against typing // mistakes #define PARS(X) (X) #define SETTING_RW(var, nm, tp, def) \ if (writing) { \ settings.setValue(nm , var); \ } else { \ var = settings.value(nm, def).to##tp \ (); \ } /** * Saving and restoring user preferences. These are stored in a global * structure during program execution and saved to disk using the QT * settings mechanism */ void rwSettings(bool writing) { LOGDEB1(("rwSettings: write %d\n", int(writing))); QSettings settings("Recoll.org", "recoll"); SETTING_RW(prefs.mainwidth, "/Recoll/geometry/width", Int, 0); SETTING_RW(prefs.mainheight, "/Recoll/geometry/height", Int, 0); SETTING_RW(prefs.pvwidth, "/Recoll/geometry/pvwidth", Int, 0); SETTING_RW(prefs.pvheight, "/Recoll/geometry/pvheight", Int, 0); SETTING_RW(prefs.ssearchTyp, "/Recoll/prefs/simpleSearchTyp", Int, 3); SETTING_RW(prefs.startWithAdvSearchOpen, "/Recoll/prefs/startWithAdvSearchOpen", Bool, false); SETTING_RW(prefs.previewHtml, "/Recoll/prefs/previewHtml", Bool, true); QString advSearchClauses; QString ascdflt; if (writing) { for (vector<int>::iterator it = prefs.advSearchClauses.begin(); it != prefs.advSearchClauses.end(); it++) { char buf[20]; sprintf(buf, "%d ", *it); advSearchClauses += QString::fromAscii(buf); } } SETTING_RW(advSearchClauses, "/Recoll/prefs/adv/clauseList", String, ascdflt); if (!writing) { list<string> clauses; stringToStrings((const char *)advSearchClauses.toUtf8(), clauses); for (list<string>::iterator it = clauses.begin(); it != clauses.end(); it++) { prefs.advSearchClauses.push_back(atoi(it->c_str())); } } SETTING_RW(prefs.autoSearchOnWS, "/Recoll/prefs/reslist/autoSearchOnWS", Bool, false); SETTING_RW(prefs.catgToolBar, "/Recoll/prefs/catgToolBar", Bool, false); SETTING_RW(prefs.ssearchAutoPhrase, "/Recoll/prefs/ssearchAutoPhrase", Bool, true); SETTING_RW(prefs.ssearchAutoPhraseThreshPC, "/Recoll/prefs/ssearchAutoPhraseThreshPC", Double, 2.0); SETTING_RW(prefs.respagesize, "/Recoll/prefs/reslist/pagelen", Int, 8); SETTING_RW(prefs.collapseDuplicates, "/Recoll/prefs/reslist/collapseDuplicates", Bool, false); SETTING_RW(prefs.showResultsAsTable, "/Recoll/prefs/showResultsAsTable", Bool, false); SETTING_RW(prefs.maxhltextmbs, "/Recoll/prefs/preview/maxhltextmbs", Int, 3); // The default is true because I find it more often useful to keep // indentation than to fold lines. Mileage may vary. SETTING_RW(prefs.previewPlainPre, "/Recoll/prefs/preview/plainPre", Bool, true); SETTING_RW(prefs.qtermcolor, "/Recoll/prefs/qtermcolor", String, "blue"); if (!writing && prefs.qtermcolor == "") prefs.qtermcolor = "blue"; // Abstract snippet separator SETTING_RW(prefs.abssep, "/Recoll/prefs/reslist/abssep", String,"…"); if (!writing && prefs.abssep == "") prefs.abssep = "…"; SETTING_RW(prefs.reslistdateformat, "/Recoll/prefs/reslist/dateformat", String," %Y-%m-%d %H:%M:%S %z"); if (!writing && prefs.reslistdateformat == "") prefs.reslistdateformat = " %Y-%m-%d %H:%M:%S %z"; prefs.creslistdateformat = (const char*)prefs.reslistdateformat.toUtf8(); SETTING_RW(prefs.reslistfontfamily, "/Recoll/prefs/reslist/fontFamily", String, ""); SETTING_RW(prefs.reslistfontsize, "/Recoll/prefs/reslist/fontSize", Int, 10); QString rlfDflt = QString::fromAscii(prefs.dfltResListFormat); SETTING_RW(prefs.reslistformat, "/Recoll/prefs/reslist/format", String, rlfDflt); prefs.creslistformat = (const char*)prefs.reslistformat.toUtf8(); if (!writing) { // If the current value of the format is the default for the // previous version, replace it with the new default. We // should have a flag to say if it was changed instead if (!prefs.creslistformat.compare(v162reslistformat)) { LOGDEB(("Replacing old default format\n")); prefs.reslistformat = rlfDflt; prefs.creslistformat = (const char*)prefs.reslistformat.toUtf8(); } } SETTING_RW(prefs.reslistheadertext, "/Recoll/prefs/reslist/headertext", String, ""); SETTING_RW(prefs.stylesheetFile, "/Recoll/prefs/stylesheet", String, ""); SETTING_RW(prefs.queryStemLang, "/Recoll/prefs/query/stemLang", String, "english"); SETTING_RW(prefs.useDesktopOpen, "/Recoll/prefs/useDesktopOpen", Bool, true); SETTING_RW(prefs.keepSort, "/Recoll/prefs/keepSort", Bool, false); SETTING_RW(prefs.sortField, "/Recoll/prefs/sortField", String, ""); SETTING_RW(prefs.sortActive, "/Recoll/prefs/sortActive", Bool, false); SETTING_RW(prefs.sortDesc, "/Recoll/prefs/query/sortDesc", Bool, 0); if (!writing) { // Handle transition from older prefs which did not store sortColumn // (Active always meant sort by date). if (prefs.sortActive && prefs.sortField.isNull()) prefs.sortField = "mtime"; } SETTING_RW(prefs.queryBuildAbstract, "/Recoll/prefs/query/buildAbstract", Bool, true); SETTING_RW(prefs.queryReplaceAbstract, "/Recoll/prefs/query/replaceAbstract", Bool, false); SETTING_RW(prefs.syntAbsLen, "/Recoll/prefs/query/syntAbsLen", Int, 250); SETTING_RW(prefs.syntAbsCtx, "/Recoll/prefs/query/syntAbsCtx", Int, 4); SETTING_RW(prefs.autoSuffs, "/Recoll/prefs/query/autoSuffs", String, ""); SETTING_RW(prefs.autoSuffsEnable, "/Recoll/prefs/query/autoSuffsEnable", Bool, false); SETTING_RW(prefs.termMatchType, "/Recoll/prefs/query/termMatchType", Int, 0); // This is not really the current program version, just a value to // be used in case we have incompatible changes one day SETTING_RW(prefs.rclVersion, "/Recoll/prefs/rclVersion", Int, 1009); // Ssearch combobox history list if (writing) { settings.setValue("/Recoll/prefs/query/ssearchHistory", prefs.ssearchHistory); } else { prefs.ssearchHistory = settings.value("/Recoll/prefs/query/ssearchHistory").toStringList(); } // Ignored file types (advanced search) if (writing) { settings.setValue("/Recoll/prefs/query/asearchIgnFilTyps", prefs.asearchIgnFilTyps); } else { prefs.asearchIgnFilTyps = settings.value("/Recoll/prefs/query/asearchIgnFilTyps").toStringList(); } // Field list for the restable if (writing) { settings.setValue("/Recoll/prefs/query/restableFields", prefs.restableFields); } else { prefs.restableFields = settings.value("/Recoll/prefs/query/restableFields").toStringList(); if (prefs.restableFields.empty()) { prefs.restableFields.push_back("date"); prefs.restableFields.push_back("title"); prefs.restableFields.push_back("filename"); prefs.restableFields.push_back("author"); prefs.restableFields.push_back("url"); } } // restable col widths QString rtcw; if (writing) { for (vector<int>::iterator it = prefs.restableColWidths.begin(); it != prefs.restableColWidths.end(); it++) { char buf[20]; sprintf(buf, "%d ", *it); rtcw += QString::fromAscii(buf); } } SETTING_RW(rtcw, "/Recoll/prefs/query/restableWidths", String, "83 253 132 172 130 "); if (!writing) { vector<string> widths; stringToStrings((const char *)rtcw.toUtf8(), widths); for (vector<string>::iterator it = widths.begin(); it != widths.end(); it++) { prefs.restableColWidths.push_back(atoi(it->c_str())); } } SETTING_RW(prefs.fileTypesByCats, "/Recoll/prefs/query/asearchFilTypByCat", Bool, false); if (g_dynconf == 0) { // Happens return; } // The extra databases settings. These are stored as a list of // xapian directory names, encoded in base64 to avoid any // binary/charset conversion issues. There are 2 lists for all // known dbs and active (searched) ones. // When starting up, we also add from the RECOLL_EXTRA_DBS environment // variable. // This are stored inside the dynamic configuration file (aka: history), // as they are likely to depend on RECOLL_CONFDIR. if (writing) { g_dynconf->eraseAll(allEdbsSk); for (list<string>::const_iterator it = prefs.allExtraDbs.begin(); it != prefs.allExtraDbs.end(); it++) { g_dynconf->enterString(allEdbsSk, *it); } g_dynconf->eraseAll(actEdbsSk); for (list<string>::const_iterator it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end(); it++) { g_dynconf->enterString(actEdbsSk, *it); } } else { prefs.allExtraDbs = g_dynconf->getStringList(allEdbsSk); const char *cp; if ((cp = getenv("RECOLL_EXTRA_DBS")) != 0) { vector<string> dbl; stringToTokens(cp, dbl, ":"); for (vector<string>::iterator dit = dbl.begin(); dit != dbl.end(); dit++) { string dbdir = path_canon(*dit); path_catslash(dbdir); if (std::find(prefs.allExtraDbs.begin(), prefs.allExtraDbs.end(), dbdir) != prefs.allExtraDbs.end()) continue; if (!Rcl::Db::testDbDir(dbdir)) { LOGERR(("Not a xapian index: [%s]\n", dbdir.c_str())); continue; } prefs.allExtraDbs.push_back(dbdir); } } // Get the remembered "active external indexes": prefs.activeExtraDbs = g_dynconf->getStringList(actEdbsSk); // Clean up the list: remove directories which are not // actually there: useful for removable volumes. for (list<string>::iterator it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end();) { if (!Rcl::Db::testDbDir(*it)) { LOGINFO(("Not a xapian index: [%s]\n", it->c_str())); it = prefs.activeExtraDbs.erase(it); } else { it++; } } // Get active db directives from the environment. This can only add to // the remembered and cleaned up list const char *cp4Act; if ((cp4Act = getenv("RECOLL_ACTIVE_EXTRA_DBS")) != 0) { vector<string> dbl; stringToTokens(cp4Act, dbl, ":"); for (vector<string>::iterator dit = dbl.begin(); dit != dbl.end(); dit++) { string dbdir = path_canon(*dit); path_catslash(dbdir); if (std::find(prefs.activeExtraDbs.begin(), prefs.activeExtraDbs.end(), dbdir) != prefs.activeExtraDbs.end()) continue; if (!Rcl::Db::testDbDir(dbdir)) { LOGERR(("Not a xapian index: [%s]\n", dbdir.c_str())); continue; } prefs.activeExtraDbs.push_back(dbdir); } //for } //if } #if 0 { list<string>::const_iterator it; fprintf(stderr, "All extra Dbs:\n"); for (it = prefs.allExtraDbs.begin(); it != prefs.allExtraDbs.end(); it++) { fprintf(stderr, " [%s]\n", it->c_str()); } fprintf(stderr, "Active extra Dbs:\n"); for (it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end(); it++) { fprintf(stderr, " [%s]\n", it->c_str()); } } #endif const string asbdSk = "asearchSbd"; if (writing) { while (prefs.asearchSubdirHist.size() > 20) prefs.asearchSubdirHist.pop_back(); g_dynconf->eraseAll(asbdSk); for (QStringList::iterator it = prefs.asearchSubdirHist.begin(); it != prefs.asearchSubdirHist.end(); it++) { g_dynconf->enterString(asbdSk, (const char *)((*it).toUtf8())); } } else { list<string> tl = g_dynconf->getStringList(asbdSk); for (list<string>::iterator it = tl.begin(); it != tl.end(); it++) prefs.asearchSubdirHist.push_front(QString::fromUtf8(it->c_str())); } } QString myGetFileName(bool isdir, QString caption, bool filenosave) { LOGDEB1(("myFileDialog: isdir %d\n", isdir)); QFileDialog dialog(0, caption); if (isdir) { dialog.setFileMode(QFileDialog::Directory); dialog.setOptions(QFileDialog::ShowDirsOnly); } else { dialog.setFileMode(QFileDialog::AnyFile); if (filenosave) dialog.setAcceptMode(QFileDialog::AcceptOpen); else dialog.setAcceptMode(QFileDialog::AcceptSave); } dialog.setViewMode(QFileDialog::List); QFlags<QDir::Filter> flags = QDir::NoDotAndDotDot | QDir::Hidden; if (isdir) flags |= QDir::Dirs; else flags |= QDir::Dirs | QDir::Files; dialog.setFilter(flags); if (dialog.exec() == QDialog::Accepted) { return dialog.selectedFiles().value(0); } return QString(); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/guiutils.h����������������������������������������������������������������������000644 �001750 �000000 �00000011134 11740755063 016643� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2005 Jean-Francois 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 _GUIUTILS_H_INCLUDED_ #define _GUIUTILS_H_INCLUDED_ #include <string> #include <list> #include <vector> #include <qstring.h> #include <qstringlist.h> #include "dynconf.h" extern RclDynConf *g_dynconf; #ifndef NO_NAMESPACES using std::string; using std::list; using std::vector; #endif /** Holder for preferences (gets saved to user Qt prefs) */ class PrefsPack { public: bool autoSearchOnWS; // Decide if we display the doc category filter control as a // toolbar+combobox or as a button group under simple search bool catgToolBar; int respagesize; int maxhltextmbs; QString reslistfontfamily; QString qtermcolor; // Color for query terms in reslist and preview int reslistfontsize; // Result list format string QString reslistformat; string creslistformat; QString reslistheadertext; // Abstract snippet separator QString abssep; // Date strftime format QString reslistdateformat; string creslistdateformat; QString stylesheetFile; QString queryStemLang; int mainwidth; int mainheight; int pvwidth; // Preview window geom int pvheight; int ssearchTyp; // Use single app (default: xdg-open), instead of per-mime settings bool useDesktopOpen; // Remember sort state between invocations ? bool keepSort; QString sortField; bool sortActive; bool sortDesc; // Abstract preferences. Building abstracts can slow result display bool queryBuildAbstract; bool queryReplaceAbstract; bool startWithAdvSearchOpen; // Try to display html if it exists in the internfile stack. bool previewHtml; // Use <pre> tag to display highlighted text/plain inside html (else // we use <br> at end of lines, which lets textedit wrap lines). bool previewPlainPre; bool collapseDuplicates; bool showResultsAsTable; // Extra query indexes. This are stored in the history file, not qt prefs list<string> allExtraDbs; list<string> activeExtraDbs; // Advanced search subdir restriction: we don't activate the last value // but just remember previously entered values QStringList asearchSubdirHist; // Textual history of simple searches (this is just the combobox list) QStringList ssearchHistory; // Make phrase out of search terms and add to search in simple search bool ssearchAutoPhrase; double ssearchAutoPhraseThreshPC; // Ignored file types in adv search (startup default) QStringList asearchIgnFilTyps; bool fileTypesByCats; // Words that are automatically turned to ext:xx specs in the query // language entry. QString autoSuffs; bool autoSuffsEnable; QStringList restableFields; vector<int> restableColWidths; // Synthetized abstract length and word context size int syntAbsLen; int syntAbsCtx; // Remembered term match mode int termMatchType; // Program version that wrote this. Not used for now, in prevision // of the case where we might need an incompatible change int rclVersion; // Advanced search window clause list state vector<int> advSearchClauses; // Default paragraph format for result list static const char *dfltResListFormat; PrefsPack() : respagesize(8), reslistfontsize(10), ssearchTyp(0), queryBuildAbstract(true), queryReplaceAbstract(false), startWithAdvSearchOpen(false), termMatchType(0), rclVersion(1505) { } }; /** Global preferences record */ extern PrefsPack prefs; /** Read write settings from disk file */ extern void rwSettings(bool dowrite); extern QString g_stringAllStem, g_stringNoStem; /** Specialized version of the qt file dialog. Can't use getOpenFile() etc. cause they hide dot files... */ extern QString myGetFileName(bool isdir, QString caption = QString(), bool filenosave = false); #endif /* _GUIUTILS_H_INCLUDED_ */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/i18n/���������������������������������������������������������������������������000755 �001750 �000000 �00000000000 11754152350 015377� 5����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/idxsched.h����������������������������������������������������������������������000644 �001750 �000000 �00000002237 11740755063 016575� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 _IDXSCHED_H_INCLUDED_ #define _IDXSCHED_H_INCLUDED_ #include "ui_idxsched.h" #include "rclhelp.h" class IdxSchedW : public QDialog, public Ui::IdxSchedW { Q_OBJECT public: IdxSchedW(QWidget * parent = 0) : QDialog(parent) { setupUi(this); (void)new HelpClient(this); HelpClient::installMap((const char *)this->objectName().toUtf8(), "RCL.INDEXING"); } }; #endif /* _IDXSCHED_H_INCLUDED_ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/idxsched.ui���������������������������������������������������������������������000644 �001750 �000000 �00000010446 11740755063 016764� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>IdxSchedW</class> <widget class="QDialog" name="IdxSchedW"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>504</width> <height>403</height> </rect> </property> <property name="windowTitle"> <string>Index scheduling setup</string> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QLabel" name="label"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>1</verstretch> </sizepolicy> </property> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html></string> </property> <property name="textFormat"> <enum>Qt::AutoText</enum> </property> <property name="wordWrap"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QCommandLinkButton" name="cronCLB"> <property name="text"> <string>Cron scheduling</string> </property> <property name="autoDefault"> <bool>false</bool> </property> <property name="description"> <string>The tool will let you decide at what time indexing should run and will install a crontab entry.</string> </property> </widget> </item> <item> <widget class="QCommandLinkButton" name="rtidxCLB"> <property name="text"> <string>Real time indexing start up</string> </property> <property name="autoDefault"> <bool>false</bool> </property> <property name="description"> <string>Decide if real time indexing will be started when you log in (only for the default index).</string> </property> </widget> </item> </layout> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="standardButtons"> <set>QDialogButtonBox::Close</set> </property> </widget> </item> </layout> </widget> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>IdxSchedW</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>248</x> <y>254</y> </hint> <hint type="destinationlabel"> <x>157</x> <y>274</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>IdxSchedW</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>316</x> <y>260</y> </hint> <hint type="destinationlabel"> <x>286</x> <y>274</y> </hint> </hints> </connection> </connections> </ui> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/images/�������������������������������������������������������������������������000755 �001750 �000000 �00000000000 11740755063 016072� 5����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/listdialog.h��������������������������������������������������������������������000644 �001750 �000000 �00000001770 11740755063 017136� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * 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 LISTDIALOG_H #define LISTDIALOG_H #include "ui_listdialog.h" class ListDialog : public QDialog, public Ui::ListDialog { Q_OBJECT public: ListDialog(QWidget * parent = 0) : QDialog(parent) { setupUi(this); } }; #endif // LISTDIALOG_H ��������recoll-1.17.3/qtgui/listdialog.ui�������������������������������������������������������������������000644 �001750 �000000 �00000003372 11740755063 017324� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>ListDialog</class> <widget class="QDialog" name="ListDialog"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>300</height> </rect> </property> <property name="windowTitle"> <string>Dialog</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>GroupBox</string> </property> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QListWidget" name="listWidget"/> </item> </layout> </widget> </item> <item> <widget class="QDialogButtonBox" name="buttonBox"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="standardButtons"> <set>QDialogButtonBox::Ok</set> </property> <property name="centerButtons"> <bool>true</bool> </property> </widget> </item> </layout> </widget> <resources/> <connections> <connection> <sender>buttonBox</sender> <signal>accepted()</signal> <receiver>ListDialog</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> <x>248</x> <y>254</y> </hint> <hint type="destinationlabel"> <x>157</x> <y>274</y> </hint> </hints> </connection> <connection> <sender>buttonBox</sender> <signal>rejected()</signal> <receiver>ListDialog</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> <x>316</x> <y>260</y> </hint> <hint type="destinationlabel"> <x>286</x> <y>274</y> </hint> </hints> </connection> </connections> </ui> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/main.cpp������������������������������������������������������������������������000644 �001750 �000000 �00000026012 11740755063 016256� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2005 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 <unistd.h> #include <cstdlib> #include <qapplication.h> #include <qtranslator.h> #include <qtextcodec.h> #include <qtimer.h> #include <qthread.h> #include <qmessagebox.h> #include <qcheckbox.h> #include <qcombobox.h> #include <QLocale> #include "rcldb.h" #include "rclconfig.h" #include "pathut.h" #include "recoll.h" #include "smallut.h" #include "rclinit.h" #include "debuglog.h" #include "rclmain_w.h" #include "ssearch_w.h" #include "guiutils.h" #ifdef RCL_USE_ASPELL #include "rclaspell.h" #endif #include "smallut.h" #include "readfile.h" #include "recollq.h" RclConfig *theconfig; RclConfig *thestableconfig; PTMutexInit thestableconfiglock; // To avoid writing settings if we stopped before reading them (else // some kinds of errors would reset the qt/recoll settings to // defaults) static bool havereadsettings; void snapshotConfig() { PTMutexLocker locker(thestableconfiglock); thestableconfig = new RclConfig(*theconfig); } PTMutexInit thetempfileslock; static vector<TempFile> o_tempfiles; /* Keep an array of temporary files for deletion at exit. It happens that we erase some of them before exiting (ie: when closing a preview tab), we don't reuse the array holes for now */ void rememberTempFile(TempFile temp) { PTMutexLocker locker(thetempfileslock); o_tempfiles.push_back(temp); } void forgetTempFile(string &fn) { if (fn.empty()) return; PTMutexLocker locker(thetempfileslock); for (vector<TempFile>::iterator it = o_tempfiles.begin(); it != o_tempfiles.end(); it++) { if ((*it).isNotNull() && !fn.compare((*it)->filename())) { it->release(); } } fn.erase(); } Rcl::Db *rcldb; #ifdef RCL_USE_ASPELL Aspell *aspell; #endif int recollNeedsExit; RclMain *mainWindow; void startManual(const string& helpindex) { if (mainWindow) mainWindow->startManual(helpindex); } bool maybeOpenDb(string &reason, bool force, bool *maindberror) { if (!rcldb) { reason = "Internal error: db not created"; return false; } if (force) rcldb->close(); rcldb->rmQueryDb(""); for (list<string>::const_iterator it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end(); it++) { LOGDEB(("main: adding [%s]\n", it->c_str())); rcldb->addQueryDb(*it); } Rcl::Db::OpenError error; if (!rcldb->isopen() && !rcldb->open(Rcl::Db::DbRO, &error)) { reason = "Could not open database in " + theconfig->getDbDir() + " wait for indexing to complete?"; if (maindberror) { *maindberror = (error == Rcl::Db::DbOpenMainDb) ? true : false; } return false; } rcldb->setAbstractParams(-1, prefs.syntAbsLen, prefs.syntAbsCtx); return true; } bool getStemLangs(list<string>& langs) { string reason; if (!maybeOpenDb(reason)) { LOGERR(("getStemLangs: %s\n", reason.c_str())); return false; } langs = rcldb->getStemLangs(); return true; } static void recollCleanup() { if (havereadsettings) { LOGDEB(("recollCleanup: writing settings\n")); rwSettings(true); } LOGDEB2(("recollCleanup: closing database\n")); deleteZ(rcldb); deleteZ(theconfig); // deleteZ(thestableconfig); PTMutexLocker locker(thetempfileslock); o_tempfiles.clear(); #ifdef RCL_USE_ASPELL deleteZ(aspell); #endif LOGDEB2(("recollCleanup: done\n")); } static void sigcleanup(int) { // We used to not call exit from here, because of the idxthread, but // this is now gone, so... recollNeedsExit = 1; exit(1); } void applyStyleSheet(const QString& ssfname) { const char *cfname = (const char *)ssfname.toLocal8Bit(); LOGDEB0(("Applying style sheet: [%s]\n", cfname)); if (cfname && *cfname) { string stylesheet; file_to_string(cfname, stylesheet); qApp->setStyleSheet(QString::fromAscii(stylesheet.c_str())); } else { qApp->setStyleSheet(QString()); } } extern void qInitImages_recoll(); static const char *thisprog; // ATTENTION A LA COMPATIBILITE AVEC LES OPTIONS DE recollq static int op_flags; #define OPT_h 0x4 #define OPT_c 0x20 #define OPT_q 0x40 #define OPT_o 0x80 #define OPT_l 0x100 #define OPT_f 0x200 #define OPT_a 0x400 #define OPT_t 0x800 static const char usage [] = "\n" "recoll [-h] [-c <configdir>] [-q query]\n" " -h : Print help and exit\n" " -c <configdir> : specify config directory, overriding $RECOLL_CONFDIR\n" " [-o|l|f|a] [-t] -q 'query' : search query to be executed as if entered\n" " into simple search. The default is to interpret the argument as a \n" " query language string (but see modifier options)\n" " In most cases, the query string should be quoted with single-quotes to\n" " avoid shell interpretation\n" " -a : the query will be interpreted as an AND query.\n" " -o : the query will be interpreted as an OR query.\n" " -f : the query will be interpreted as a filename search\n" " -l : the query will be interpreted as a query language string (default)\n" " -t : terminal display: no gui. Results go to stdout. MUST be given\n" " explicitly as -t (not ie, -at), and -q <query> MUST\n" " be last on the command line if this is used.\n" " Use -t -h to see the additional non-gui options\n" "recoll <url>\n" " This is used to open a recoll url (including an ipath), and called\n" " typically from another search interface like the Unity Dash\n" ; static void Usage(void) { FILE *fp = (op_flags & OPT_h) ? stdout : stderr; fprintf(fp, "%s: Usage: %s", thisprog, usage); exit((op_flags & OPT_h)==0); } int main(int argc, char **argv) { // If "-t" is present at all, we don't do the GUI thing and pass the // whole to recollq for command line / pipe usage. for (int i = 0; i < argc; i++) { if (!strcmp(argv[i], "-t")) { exit(recollq(&theconfig, argc, argv)); } } QApplication app(argc, argv); QCoreApplication::setOrganizationName("Recoll.org"); QCoreApplication::setApplicationName("recoll"); string a_config; string question; string urltoview; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) Usage(); while (**argv) switch (*(*argv)++) { case 'a': op_flags |= OPT_a; break; case 'c': op_flags |= OPT_c; if (argc < 2) Usage(); a_config = *(++argv); argc--; goto b1; case 'f': op_flags |= OPT_f; break; case 'h': op_flags |= OPT_h; Usage();break; case 'l': op_flags |= OPT_l; break; case 'o': op_flags |= OPT_o; break; case 'q': op_flags |= OPT_q; if (argc < 2) Usage(); question = *(++argv); argc--; goto b1; case 't': op_flags |= OPT_t; break; default: Usage(); } b1: argc--; argv++; } // If -q was given, all remaining non-option args are concatenated // to the query. This is for the common case recoll -q x y z to // avoid needing quoting "x y z" if (op_flags & OPT_q) while (argc > 0) { question += " "; question += *argv++; argc--; } // Else the remaining argument should be an URL to be opened if (argc == 1) { urltoview = *argv++;argc--; if (urltoview.compare(0, 7, cstr_fileu)) { Usage(); } } else if (argc > 0) Usage(); // Translation file for Qt QString slang = QLocale::system().name().left(2); QTranslator qt(0); qt.load(QString("qt_") + slang, "." ); app.installTranslator( &qt ); string reason; theconfig = recollinit(recollCleanup, sigcleanup, reason, &a_config); if (!theconfig || !theconfig->ok()) { QString msg = "Configuration problem: "; msg += QString::fromUtf8(reason.c_str()); QMessageBox::critical(0, "Recoll", msg); exit(1); } snapshotConfig(); // fprintf(stderr, "recollinit done\n"); // Translations for Recoll string translatdir = path_cat(theconfig->getDatadir(), "translations"); QTranslator translator(0); translator.load( QString("recoll_") + slang, translatdir.c_str() ); app.installTranslator( &translator ); // fprintf(stderr, "Translations installed\n"); #ifdef RCL_USE_ASPELL aspell = new Aspell(theconfig); aspell->init(reason); if (!aspell || !aspell->ok()) { LOGDEB(("Aspell speller creation failed %s\n", reason.c_str())); aspell = 0; } #endif string historyfile = path_cat(theconfig->getConfDir(), "history"); g_dynconf = new RclDynConf(historyfile); if (!g_dynconf || !g_dynconf->ok()) { QString msg = app.translate("Main", "\"history\" file is damaged or un(read)writeable, please check or remove it: ") + QString::fromLocal8Bit(historyfile.c_str()); QMessageBox::critical(0, "Recoll", msg); exit(1); } // fprintf(stderr, "History done\n"); rwSettings(false); havereadsettings = true; // fprintf(stderr, "Settings done\n"); if (!prefs.stylesheetFile.isEmpty()) { applyStyleSheet(prefs.stylesheetFile); } // Create main window and set its size to previous session's RclMain w; mainWindow = &w; if (prefs.mainwidth > 100) { QSize s(prefs.mainwidth, prefs.mainheight); mainWindow->resize(s); } string dbdir = theconfig->getDbDir(); if (dbdir.empty()) { QMessageBox::critical(0, "Recoll", app.translate("Main", "No db directory in configuration")); exit(1); } rcldb = new Rcl::Db(theconfig); mainWindow->show(); QTimer::singleShot(0, mainWindow, SLOT(initDbOpen())); // Connect exit handlers etc.. Beware, apparently this must come // after mainWindow->show()? app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit())); app.connect(&app, SIGNAL(aboutToQuit()), mainWindow, SLOT(close())); mainWindow->sSearch->searchTypCMB->setCurrentIndex(prefs.ssearchTyp); mainWindow->sSearch->searchTypeChanged(prefs.ssearchTyp); if (op_flags & OPT_q) { SSearch::SSearchType stype; if (op_flags & OPT_o) { stype = SSearch::SST_ANY; } else if (op_flags & OPT_f) { stype = SSearch::SST_FNM; } else if (op_flags & OPT_a) { stype = SSearch::SST_ALL; } else { stype = SSearch::SST_LANG; } mainWindow->sSearch->searchTypCMB->setCurrentIndex(int(stype)); mainWindow-> sSearch->setSearchString(QString::fromLocal8Bit(question.c_str())); } else if (!urltoview.empty()) { LOGDEB(("MAIN: got urltoview [%s]\n", urltoview.c_str())); mainWindow->setUrlToView(QString::fromLocal8Bit(urltoview.c_str())); } return app.exec(); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/mtpics/�������������������������������������������������������������������������000755 �001750 �000000 �00000000000 11740755063 016124� 5����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������recoll-1.17.3/qtgui/preview_w.cpp�������������������������������������������������������������������000644 �001750 �000000 �00000103127 11740755063 017344� 0����������������������������������������������������������������������������������������������������ustar�00dockes��������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2005 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 <unistd.h> #include <stdlib.h> #include <time.h> #include <sys/stat.h> #include <list> #include <utility> #ifndef NO_NAMESPACES using std::pair; #endif /* NO_NAMESPACES */ #include <qmessagebox.h> #include <qthread.h> #include <qvariant.h> #include <qpushbutton.h> #include <qtabwidget.h> #include <qprinter.h> #include <qprintdialog.h> #include <qscrollbar.h> #include <qmenu.h> #include <qtextedit.h> #include <qprogressdialog.h> #include <qevent.h> #include <qlabel.h> #include <qlineedit.h> #include <qcheckbox.h> #include <qlayout.h> #include <qtooltip.h> #include <qwhatsthis.h> #include <qapplication.h> #include <qclipboard.h> #include <qimage.h> #include <qurl.h> #include "debuglog.h" #include "pathut.h" #include "internfile.h" #include "recoll.h" #include "plaintorich.h" #include "smallut.h" #include "wipedir.h" #include "cancelcheck.h" #include "preview_w.h" #include "guiutils.h" #include "docseqhist.h" #include "rclhelp.h" #ifndef MIN #define MIN(A,B) ((A)<(B)?(A):(B)) #endif // Subclass plainToRich to add <termtag>s and anchors to the preview text class PlainToRichQtPreview : public PlainToRich { public: int lastanchor; PlainToRichQtPreview() { lastanchor = 0; } virtual ~PlainToRichQtPreview() {} virtual string header() { if (m_inputhtml) { return snull; } else { if (prefs.previewPlainPre) { m_eolbr = false; return string("<qt><head><title>" "
");
// Note we could also use the following for line-folding instead of 
s // This would be possible without recomputing the whole text, much better perfs // for toggling wrap/no-wrap // "
");
	    } else {
		m_eolbr = true;
		return string("");
	    }
	}
    }
    virtual string startMatch() 
    {
	return string("");
    }
    virtual string endMatch() {return string("");}
    virtual string termAnchorName(int i) {
	static const char *termAnchorNameBase = "TRM";
	char acname[sizeof(termAnchorNameBase) + 20];
	sprintf(acname, "%s%d", termAnchorNameBase, i);
	if (i > lastanchor)
	    lastanchor = i;
	return string(acname);
    }

    virtual string startAnchor(int i) {
	return string("";
    }
    virtual string endAnchor() {
	return string("");
    }
    virtual string startChunk() { return "
";}
};

void Preview::init()
{
    setObjectName("Preview");
    QVBoxLayout* previewLayout = new QVBoxLayout(this);

    pvTab = new QTabWidget(this);

    // Create the first tab. Should be possible to use addEditorTab
    // but this causes a pb with the sizeing
    QWidget *unnamed = new QWidget(pvTab);
    QVBoxLayout *unnamedLayout = new QVBoxLayout(unnamed);
    PreviewTextEdit *pvEdit = new PreviewTextEdit(unnamed, "pvEdit", this);
    pvEdit->setReadOnly(TRUE);
    pvEdit->setUndoRedoEnabled(FALSE);
    unnamedLayout->addWidget(pvEdit);
    pvTab->addTab(unnamed, "");

    previewLayout->addWidget(pvTab);

    // Create the buttons and entry field
    QHBoxLayout *layout3 = new QHBoxLayout(0); 
    searchLabel = new QLabel(this);
    layout3->addWidget(searchLabel);
    searchTextLine = new QLineEdit(this);
    layout3->addWidget(searchTextLine);
    nextButton = new QPushButton(this);
    nextButton->setEnabled(TRUE);
    layout3->addWidget(nextButton);
    prevButton = new QPushButton(this);
    prevButton->setEnabled(TRUE);
    layout3->addWidget(prevButton);
    clearPB = new QPushButton(this);
    clearPB->setEnabled(FALSE);
    layout3->addWidget(clearPB);
    matchCheck = new QCheckBox(this);
    layout3->addWidget(matchCheck);

    previewLayout->addLayout(layout3);

    resize(QSize(640, 480).expandedTo(minimumSizeHint()));

    // buddies
    searchLabel->setBuddy(searchTextLine);

    searchLabel->setText(tr("&Search for:"));
    nextButton->setText(tr("&Next"));
    prevButton->setText(tr("&Previous"));
    clearPB->setText(tr("Clear"));
    matchCheck->setText(tr("Match &Case"));

    QPushButton * bt = new QPushButton(tr("Close Tab"), this);
    pvTab->setCornerWidget(bt);

    (void)new HelpClient(this);
    HelpClient::installMap((const char *)objectName().toUtf8(), 
			   "RCL.SEARCH.PREVIEW");

    // signals and slots connections
    connect(searchTextLine, SIGNAL(textChanged(const QString&)), 
	    this, SLOT(searchTextLine_textChanged(const QString&)));
    connect(nextButton, SIGNAL(clicked()), this, SLOT(nextPressed()));
    connect(prevButton, SIGNAL(clicked()), this, SLOT(prevPressed()));
    connect(clearPB, SIGNAL(clicked()), searchTextLine, SLOT(clear()));
    connect(pvTab, SIGNAL(currentChanged(QWidget *)), 
	    this, SLOT(currentChanged(QWidget *)));
    connect(bt, SIGNAL(clicked()), this, SLOT(closeCurrentTab()));

    m_dynSearchActive = false;
    m_canBeep = true;
    m_currentW = 0;
    if (prefs.pvwidth > 100) {
	resize(prefs.pvwidth, prefs.pvheight);
    }
    m_loading = false;
    currentChanged(pvTab->currentWidget());
    m_justCreated = true;
    m_haveAnchors = false;
    m_curAnchor = 1;
}

void Preview::closeEvent(QCloseEvent *e)
{
    LOGDEB(("Preview::closeEvent. m_loading %d\n", m_loading));
    if (m_loading) {
	CancelCheck::instance().setCancel();
	e->ignore();
	return;
    }
    prefs.pvwidth = width();
    prefs.pvheight = height();

    /* Release all temporary files (but maybe none is actually set) */
    for (int i = 0; i < pvTab->count(); i++) {
        QWidget *tw = pvTab->widget(i);
        if (tw) {
	    PreviewTextEdit *edit = 
		tw->findChild("pvEdit");
            if (edit) {
		forgetTempFile(edit->m_tmpfilename);
            }
        }
    }
    emit previewExposed(this, m_searchId, -1);
    emit previewClosed(this);
    QWidget::closeEvent(e);
}

extern const char *eventTypeToStr(int tp);

bool Preview::eventFilter(QObject *target, QEvent *event)
{
    if (event->type() != QEvent::KeyPress) {
#if 0
    LOGDEB(("Preview::eventFilter(): %s\n", eventTypeToStr(event->type())));
	if (event->type() == QEvent::MouseButtonRelease) {
	    QMouseEvent *mev = (QMouseEvent *)event;
	    LOGDEB(("Mouse: GlobalY %d y %d\n", mev->globalY(),
		    mev->y()));
	}
#endif
	return false;
    }
    
    LOGDEB2(("Preview::eventFilter: keyEvent\n"));

    PreviewTextEdit *edit = currentEditor();
    QKeyEvent *keyEvent = (QKeyEvent *)event;
    if (keyEvent->key() == Qt::Key_Escape) {
	close();
	return true;
    } else if (keyEvent->key() == Qt::Key_Down &&
	       (keyEvent->modifiers() & Qt::ShiftModifier)) {
	LOGDEB2(("Preview::eventFilter: got Shift-Up\n"));
	if (edit) 
	    emit(showNext(this, m_searchId, edit->m_docnum));
	return true;
    } else if (keyEvent->key() == Qt::Key_Up &&
	       (keyEvent->modifiers() & Qt::ShiftModifier)) {
	LOGDEB2(("Preview::eventFilter: got Shift-Down\n"));
	if (edit) 
	    emit(showPrev(this, m_searchId, edit->m_docnum));
	return true;
    } else if (keyEvent->key() == Qt::Key_W &&
	       (keyEvent->modifiers() & Qt::ControlModifier)) {
	LOGDEB2(("Preview::eventFilter: got ^W\n"));
	closeCurrentTab();
	return true;
    } else if (keyEvent->key() == Qt::Key_P &&
	       (keyEvent->modifiers() & Qt::ControlModifier)) {
	LOGDEB2(("Preview::eventFilter: got ^P\n"));
	emit(printCurrentPreviewRequest());
	return true;
    } else if (m_dynSearchActive) {
	if (keyEvent->key() == Qt::Key_F3) {
	    LOGDEB2(("Preview::eventFilter: got F3\n"));
	    doSearch(searchTextLine->text(), true, false);
	    return true;
	}
	if (target != searchTextLine)
	    return QApplication::sendEvent(searchTextLine, event);
    } else {
	if (edit && 
	    (target == edit || target == edit->viewport())) {
	    if (keyEvent->key() == Qt::Key_Slash ||
		(keyEvent->key() == Qt::Key_F &&
		 (keyEvent->modifiers() & Qt::ControlModifier))) {
		LOGDEB2(("Preview::eventFilter: got / or C-F\n"));
		searchTextLine->setFocus();
		m_dynSearchActive = true;
		return true;
	    } else if (keyEvent->key() == Qt::Key_Space) {
		LOGDEB2(("Preview::eventFilter: got Space\n"));
		int value = edit->verticalScrollBar()->value();
		value += edit->verticalScrollBar()->pageStep();
		edit->verticalScrollBar()->setValue(value);
		return true;
	    } else if (keyEvent->key() == Qt::Key_Backspace) {
		LOGDEB2(("Preview::eventFilter: got Backspace\n"));
		int value = edit->verticalScrollBar()->value();
		value -= edit->verticalScrollBar()->pageStep();
		edit->verticalScrollBar()->setValue(value);
		return true;
	    }
	}
    }

    return false;
}

void Preview::searchTextLine_textChanged(const QString & text)
{
    LOGDEB2(("search line text changed. text: '%s'\n", text.ascii()));
    if (text.isEmpty()) {
	m_dynSearchActive = false;
	//	nextButton->setEnabled(false);
	//	prevButton->setEnabled(false);
	clearPB->setEnabled(false);
    } else {
	m_dynSearchActive = true;
	//	nextButton->setEnabled(true);
	//	prevButton->setEnabled(true);
	clearPB->setEnabled(true);
	doSearch(text, false, false);
    }
}

PreviewTextEdit *Preview::currentEditor()
{
    LOGDEB2(("Preview::currentEditor()\n"));
    QWidget *tw = pvTab->currentWidget();
    PreviewTextEdit *edit = 0;
    if (tw) {
	edit = tw->findChild("pvEdit");
    }
    return edit;
}

// Save current document to file
void Preview::emitSaveDocToFile()
{
    PreviewTextEdit *ce = currentEditor();
    if (ce && !ce->m_dbdoc.url.empty()) {
	emit saveDocToFile(ce->m_dbdoc);
    }
}

// Perform text search. If next is true, we look for the next match of the
// current search, trying to advance and possibly wrapping around. If next is
// false, the search string has been modified, we search for the new string, 
// starting from the current position
void Preview::doSearch(const QString &_text, bool next, bool reverse, 
		       bool wordOnly)
{
    LOGDEB(("Preview::doSearch: text [%s] txtlen %d next %d rev %d word %d\n", 
             (const char *)_text.toUtf8(), _text.length(), int(next), 
             int(reverse), int(wordOnly)));
    QString text = _text;

    bool matchCase = matchCheck->isChecked();
    PreviewTextEdit *edit = currentEditor();
    if (edit == 0) {
	// ??
	return;
    }

    if (text.isEmpty()) {
	if (m_haveAnchors == false) {
	    LOGDEB(("NO ANCHORS\n"));
	    return;
	}
	if (reverse) {
	    if (m_curAnchor == 1)
		m_curAnchor = edit->m_plaintorich->lastanchor;
	    else
		m_curAnchor--;
	} else {
	    if (m_curAnchor == edit->m_plaintorich->lastanchor)
		m_curAnchor = 1;
	    else
		m_curAnchor++;
	}
	LOGDEB(("m_curAnchor: %d\n", m_curAnchor));
	QString aname = 
	   QString::fromUtf8(edit->m_plaintorich->termAnchorName(m_curAnchor).c_str());
	LOGDEB(("Calling scrollToAnchor(%s)\n", (const char *)aname.toUtf8()));
	edit->scrollToAnchor(aname);
	// Position the cursor approximately at the anchor (top of
	// viewport) so that searches start from here
	QTextCursor cursor = edit->cursorForPosition(QPoint(0, 0));
	edit->setTextCursor(cursor);
	return;
    }

    // If next is false, the user added characters to the current
    // search string.  We need to reset the cursor position to the
    // start of the previous match, else incremental search is going
    // to look for the next occurrence instead of trying to lenghten
    // the current match
    if (!next) {
	QTextCursor cursor = edit->textCursor();
	cursor.setPosition(cursor.anchor(), QTextCursor::KeepAnchor);
	edit->setTextCursor(cursor);
    }
    Chrono chron;
    LOGDEB(("Preview::doSearch: first find call\n"));
    QTextDocument::FindFlags flags = 0;
    if (reverse)
	flags |= QTextDocument::FindBackward;
    if (wordOnly)
	flags |= QTextDocument::FindWholeWords;
    if (matchCase)
	flags |= QTextDocument::FindCaseSensitively;
    bool found = edit->find(text, flags);
    LOGDEB(("Preview::doSearch: first find call return: found %d %.2f S\n", 
            found, chron.secs()));
    // If not found, try to wrap around. 
    if (!found) { 
	LOGDEB(("Preview::doSearch: wrapping around\n"));
	if (reverse) {
	    edit->moveCursor (QTextCursor::End);
	} else {
	    edit->moveCursor (QTextCursor::Start);
	}
	LOGDEB(("Preview::doSearch: 2nd find call\n"));
        chron.restart();
	found = edit->find(text, flags);
	LOGDEB(("Preview::doSearch: 2nd find call return found %d %.2f S\n",
                found, chron.secs()));
    }

    if (found) {
	m_canBeep = true;
    } else {
	if (m_canBeep)
	    QApplication::beep();
	m_canBeep = false;
    }
    LOGDEB(("Preview::doSearch: return\n"));
}

void Preview::nextPressed()
{
    LOGDEB2(("PreviewTextEdit::nextPressed\n"));
    doSearch(searchTextLine->text(), true, false);
}

void Preview::prevPressed()
{
    LOGDEB2(("PreviewTextEdit::prevPressed\n"));
    doSearch(searchTextLine->text(), true, true);
}

// Called when user clicks on tab
void Preview::currentChanged(QWidget * tw)
{
    LOGDEB2(("PreviewTextEdit::currentChanged\n"));
    PreviewTextEdit *edit = 
	tw->findChild("pvEdit");
    m_currentW = tw;
    LOGDEB1(("Preview::currentChanged(). Editor: %p\n", edit));
    
    if (edit == 0) {
	LOGERR(("Editor child not found\n"));
	return;
    }
    edit->setFocus();
    // Disconnect the print signal and reconnect it to the current editor
    LOGDEB(("Disconnecting reconnecting print signal\n"));
    disconnect(this, SIGNAL(printCurrentPreviewRequest()), 0, 0);
    connect(this, SIGNAL(printCurrentPreviewRequest()), edit, SLOT(print()));
    edit->installEventFilter(this);
    edit->viewport()->installEventFilter(this);
    searchTextLine->installEventFilter(this);
    emit(previewExposed(this, m_searchId, edit->m_docnum));
}

void Preview::closeCurrentTab()
{
    LOGDEB1(("Preview::closeCurrentTab: m_loading %d\n", m_loading));
    if (m_loading) {
	CancelCheck::instance().setCancel();
	return;
    }
    PreviewTextEdit *e = currentEditor();
    if (e)
	forgetTempFile(e->m_tmpfilename);
    if (pvTab->count() > 1) {
	pvTab->removeTab(pvTab->currentIndex());
    } else {
	close();
    }
}

PreviewTextEdit *Preview::addEditorTab()
{
    LOGDEB1(("PreviewTextEdit::addEditorTab()\n"));
    QWidget *anon = new QWidget((QWidget *)pvTab);
    QVBoxLayout *anonLayout = new QVBoxLayout(anon); 
    PreviewTextEdit *editor = new PreviewTextEdit(anon, "pvEdit", this);
    editor->setReadOnly(TRUE);
    editor->setUndoRedoEnabled(FALSE );
    anonLayout->addWidget(editor);
    pvTab->addTab(anon, "Tab");
    pvTab->setCurrentIndex(pvTab->count() -1);
    return editor;
}

void Preview::setCurTabProps(const Rcl::Doc &doc, int docnum)
{
    LOGDEB1(("PreviewTextEdit::setCurTabProps\n"));
    QString title;
    string ctitle;
    if (doc.getmeta(Rcl::Doc::keytt, &ctitle) && !ctitle.empty()) {
	title = QString::fromUtf8(ctitle.c_str(), ctitle.length());
    } else {
        title = QString::fromLocal8Bit(path_getsimple(doc.url).c_str());
    }
    if (title.length() > 20) {
	title = title.left(10) + "..." + title.right(10);
    }
    int curidx = pvTab->currentIndex();
    pvTab->setTabText(curidx, title);

    char datebuf[100];
    datebuf[0] = 0;
    if (!doc.fmtime.empty() || !doc.dmtime.empty()) {
	time_t mtime = doc.dmtime.empty() ? 
	    atol(doc.fmtime.c_str()) : atol(doc.dmtime.c_str());
	struct tm *tm = localtime(&mtime);
	strftime(datebuf, 99, "%Y-%m-%d %H:%M:%S", tm);
    }
    LOGDEB(("Doc.url: [%s]\n", doc.url.c_str()));
    string url;
    printableUrl(theconfig->getDefCharset(), doc.url, url);
    string tiptxt = url + string("\n");
    tiptxt += doc.mimetype + " " + string(datebuf) + "\n";
    if (!ctitle.empty())
	tiptxt += ctitle + "\n";
    pvTab->setTabToolTip(curidx,
			 QString::fromUtf8(tiptxt.c_str(), tiptxt.length()));

    PreviewTextEdit *e = currentEditor();
    if (e) {
	e->m_url = doc.url;
	e->m_ipath = doc.ipath;
	e->m_docnum = docnum;
    }
}

bool Preview::makeDocCurrent(const Rcl::Doc& doc, int docnum, bool sametab)
{
    LOGDEB(("Preview::makeDocCurrent: %s\n", doc.url.c_str()));

    if (m_loading) {
	LOGERR(("Already loading\n"));
	return false;
    }

    /* Check if we already have this page */
    for (int i = 0; i < pvTab->count(); i++) {
        QWidget *tw = pvTab->widget(i);
        if (tw) {
	    PreviewTextEdit *edit = 
		tw->findChild("pvEdit");
            if (edit && !edit->m_url.compare(doc.url) && 
                !edit->m_ipath.compare(doc.ipath)) {
                pvTab->setCurrentIndex(i);
                return true;
            }
        }
    }

    // if just created the first tab was created during init
    if (!sametab && !m_justCreated && !addEditorTab()) {
	return false;
    }
    m_justCreated = false;
    if (!loadDocInCurrentTab(doc, docnum)) {
	closeCurrentTab();
	return false;
    }
    raise();
    return true;
}
void Preview::togglePlainPre()
{
    prefs.previewPlainPre = !prefs.previewPlainPre;
    
    PreviewTextEdit *editor = currentEditor();
    if (editor)
	loadDocInCurrentTab(editor->m_dbdoc, editor->m_docnum);
}

void Preview::emitWordSelect(QString word)
{
    emit(wordSelect(word));
}

/*
  Code for loading a file into an editor window. The operations that
  we call have no provision to indicate progression, and it would be
  complicated or impossible to modify them to do so (Ie: for external 
  format converters).

  We implement a complicated and ugly mechanism based on threads to indicate 
  to the user that the app is doing things: lengthy operations are done in 
  threads and we update a progress indicator while they proceed (but we have 
  no estimate of their total duration).
  
  It might be possible, but complicated (need modifications in
  handler) to implement a kind of bucket brigade, to have the
  beginning of the text displayed faster
*/

/* A thread to to the file reading / format conversion */
class LoadThread : public QThread {
    int *statusp;
    Rcl::Doc& out;
    const Rcl::Doc& idoc;
    TempDir tmpdir;
    int loglevel;
 public: 
    string missing;
    TempFile imgtmp;
    string tdirreason;

    LoadThread(int *stp, Rcl::Doc& odoc, const Rcl::Doc& idc) 
	: statusp(stp), out(odoc), idoc(idc)
	{
	    loglevel = DebugLog::getdbl()->getlevel();
	}
    ~LoadThread() {
    }
    virtual void run() {
	DebugLog::getdbl()->setloglevel(loglevel);
	if (!tmpdir.ok()) {
	    tdirreason = tmpdir.getreason();
	    LOGERR(("Preview: %s\n", tdirreason.c_str()));
	    *statusp = -1;
	    return;
	}

	FileInterner interner(idoc, theconfig, tmpdir, 
                              FileInterner::FIF_forPreview);
	FIMissingStore mst;
	interner.setMissingStore(&mst);
	// We don't set the interner's target mtype to html because we
	// do want the html filter to do its work: we won't use the
	// text, but we need the conversion to utf-8
	// interner.setTargetMType("text/html");
	try {
            string ipath = idoc.ipath;
	    FileInterner::Status ret = interner.internfile(out, ipath);
	    if (ret == FileInterner::FIDone || ret == FileInterner::FIAgain) {
		// FIAgain is actually not nice here. It means that the record
		// for the *file* of a multidoc was selected. Actually this
		// shouldn't have had a preview link at all, but we don't know
		// how to handle it now. Better to show the first doc than
		// a mysterious error. Happens when the file name matches a
		// a search term.
		*statusp = 0;
		// If we prefer html and it is available, replace the
		// text/plain document text
		if (prefs.previewHtml && !interner.get_html().empty()) {
		    out.text = interner.get_html();
		    out.mimetype = "text/html";
		}
		imgtmp = interner.get_imgtmp();
	    } else {
		out.mimetype = interner.getMimetype();
		interner.getMissingExternal(&mst, missing);
		*statusp = -1;
	    }
	} catch (CancelExcept) {
	    *statusp = -1;
	}
    }
};


// Insert into editor by chunks so that the top becomes visible
// earlier for big texts. This provokes some artifacts (adds empty line),
// so we can't set it too low.
#define CHUNKL 500*1000

/* A thread to convert to rich text (mark search terms) */
class ToRichThread : public QThread {
    string ∈
    const HiliteData &hdata;
    list &out;
    int loglevel;
    PlainToRichQtPreview *ptr;
 public:
    ToRichThread(string &i, const HiliteData& hd, list &o, 
		 PlainToRichQtPreview *_ptr)
	: in(i), hdata(hd), out(o), ptr(_ptr)
    {
	    loglevel = DebugLog::getdbl()->getlevel();
    }
    virtual void run()
    {
	DebugLog::getdbl()->setloglevel(loglevel);
	try {
	    ptr->plaintorich(in, out, hdata, CHUNKL);
	} catch (CancelExcept) {
	}
    }
};

class LoadGuard {
    bool *m_bp;
public:
    LoadGuard(bool *bp) {m_bp = bp ; *m_bp = true;}
    ~LoadGuard() {*m_bp = false; CancelCheck::instance().setCancel(false);}
};

bool Preview::loadDocInCurrentTab(const Rcl::Doc &idoc, int docnum)
{
    LOGDEB1(("Preview::loadDocInCurrentTab()\n"));

    LoadGuard guard(&m_loading);
    CancelCheck::instance().setCancel(false);

    m_haveAnchors = false;

    setCurTabProps(idoc, docnum);

    QString msg = QString("Loading: %1 (size %2 bytes)")
	.arg(QString::fromLocal8Bit(idoc.url.c_str()))
	.arg(QString::fromAscii(idoc.fbytes.c_str()));

    // Create progress dialog and aux objects
    const int nsteps = 20;
    QProgressDialog progress(msg, tr("Cancel"), 0, nsteps, this);
    progress.setMinimumDuration(2000);

    ////////////////////////////////////////////////////////////////////////
    // Load and convert document
    // idoc came out of the index data (main text and other fields missing). 
    // foc is the complete one what we are going to extract from storage.
    Rcl::Doc fdoc;
    int status = 1;
    LoadThread lthr(&status, fdoc, idoc);
    lthr.start();
    int prog;
    for (prog = 1;;prog++) {
	if (lthr.wait(100))
	    break;
	progress.setValue(prog);
	qApp->processEvents();
	if (progress.wasCanceled()) {
	    CancelCheck::instance().setCancel();
	}
	if (prog >= 5)
	    sleep(1);
    }

    LOGDEB(("LoadFileInCurrentTab: after file load: cancel %d status %d"
	    " text length %d\n", 
	    CancelCheck::instance().cancelState(), status, fdoc.text.length()));

    if (CancelCheck::instance().cancelState())
	return false;
    if (status != 0) {
        QString explain;
	if (!lthr.tdirreason.empty()) {
            explain = tr("Cannot create temporary directory: ") +
                QString::fromLocal8Bit(lthr.tdirreason.c_str());
	    QMessageBox::critical(0, "Recoll", explain);
	} else if (!lthr.missing.empty()) {
            explain = QString::fromAscii("
") + tr("Missing helper program: ") + QString::fromLocal8Bit(lthr.missing.c_str()); QMessageBox::warning(0, "Recoll", tr("Can't turn doc into internal " "representation for ") + fdoc.mimetype.c_str() + explain); } else { QMessageBox::warning(0, "Recoll", tr("Error while loading file")); } return false; } // Reset config just in case. theconfig->setKeyDir(""); //////////////////////////////////////////////////////////////////////// // Create preview text: highlight search terms // We don't do the highlighting for very big texts: too long. We // should at least do special char escaping, in case a '&' or '<' // somehow slipped through previous processing. bool highlightTerms = fdoc.text.length() < (unsigned long)prefs.maxhltextmbs * 1024 * 1024; // Final text is produced in chunks so that we can display the top // while still inserting at bottom list qrichlst; PreviewTextEdit *editor = currentEditor(); editor->setHtml(""); editor->m_format = Qt::RichText; bool inputishtml = !fdoc.mimetype.compare("text/html"); #if 0 // For testing qtextedit bugs... highlightTerms = true; const char *textlist[] = { "Du plain text avec un\n termtag fin de ligne:", "texte apres le tag\n", }; const int listl = sizeof(textlist) / sizeof(char*); for (int i = 0 ; i < listl ; i++) qrichlst.push_back(QString::fromUtf8(textlist[i])); #else if (highlightTerms) { progress.setLabelText(tr("Creating preview text")); qApp->processEvents(); if (inputishtml) { LOGDEB1(("Preview: got html %s\n", fdoc.text.c_str())); editor->m_plaintorich->set_inputhtml(true); } else { LOGDEB1(("Preview: got plain %s\n", fdoc.text.c_str())); editor->m_plaintorich->set_inputhtml(false); } list richlst; ToRichThread rthr(fdoc.text, m_hData, richlst, editor->m_plaintorich); rthr.start(); for (;;prog++) { if (rthr.wait(100)) break; progress.setValue(nsteps); qApp->processEvents(); if (progress.wasCanceled()) { CancelCheck::instance().setCancel(); } if (prog >= 5) sleep(1); } // Conversion to rich text done if (CancelCheck::instance().cancelState()) { if (richlst.size() == 0 || richlst.front().length() == 0) { // We can't call closeCurrentTab here as it might delete // the object which would be a nasty surprise to our // caller. return false; } else { richlst.back() += "Cancelled !"; } } // Convert C++ string list to QString list for (list::iterator it = richlst.begin(); it != richlst.end(); it++) { qrichlst.push_back(QString::fromUtf8(it->c_str(), it->length())); } } else { LOGDEB(("Preview: no hilighting\n")); // No plaintorich() call. In this case, either the text is // html and the html quoting is hopefully correct, or it's // plain-text and there is no need to escape special // characters. We'd still want to split in chunks (so that the // top is displayed faster), but we must not cut tags, and // it's too difficult on html. For text we do the splitting on // a QString to avoid utf8 issues. QString qr = QString::fromUtf8(fdoc.text.c_str(), fdoc.text.length()); int l = 0; if (inputishtml) { qrichlst.push_back(qr); } else { editor->setPlainText(""); editor->m_format = Qt::PlainText; for (int pos = 0; pos < (int)qr.length(); pos += l) { l = MIN(CHUNKL, qr.length() - pos); qrichlst.push_back(qr.mid(pos, l)); } } } #endif /////////////////////////////////////////////////////////// // Load text into editor window. prog = 2 * nsteps / 3; progress.setLabelText(tr("Loading preview text into editor")); qApp->processEvents(); int instep = 0; for (list::iterator it = qrichlst.begin(); it != qrichlst.end(); it++, prog++, instep++) { progress.setValue(prog); qApp->processEvents(); editor->append(*it); // We need to save the rich text for printing, the editor does // not do it consistently for us. editor->m_richtxt.append(*it); if (progress.wasCanceled()) { editor->append("Cancelled !"); LOGDEB(("LoadFileInCurrentTab: cancelled in editor load\n")); break; } } progress.close(); editor->m_curdsp = PreviewTextEdit::PTE_DSPTXT; //////////////////////////////////////////////////////////////////////// // Finishing steps // Maybe the text was actually empty ? Switch to fields then. Else free-up // the text memory in the loaded document. We still have a copy of the text // in editor->m_richtxt bool textempty = fdoc.text.empty(); if (!textempty) fdoc.text.clear(); editor->m_fdoc = fdoc; editor->m_dbdoc = idoc; if (textempty) editor->displayFields(); // If this is an image, display it instead of the text. if (!idoc.mimetype.compare(0, 6, "image/")) { string fn = fileurltolocalpath(idoc.url); // If the command wants a file but this is not a file url, or // there is an ipath that it won't understand, we need a temp file: theconfig->setKeyDir(path_getfather(fn)); if (fn.empty() || !idoc.ipath.empty()) { TempFile temp = lthr.imgtmp; if (temp.isNotNull()) { LOGDEB1(("Preview: load: got temp file from internfile\n")); } else if (!FileInterner::idocToFile(temp, string(), theconfig, idoc)) { temp.release(); // just in case. } if (temp.isNotNull()) { rememberTempFile(temp); fn = temp->filename(); editor->m_tmpfilename = fn; } else { editor->m_tmpfilename.erase(); fn.erase(); } } if (!fn.empty()) { editor->m_image = QImage(fn.c_str()); if (!editor->m_image.isNull()) editor->displayImage(); } } // Position the editor so that the first search term is visible m_haveAnchors = editor->m_plaintorich->lastanchor != 0; if (searchTextLine->text().length() != 0) { // If there is a current search string, perform the search m_canBeep = true; doSearch(searchTextLine->text(), true, false); } else { // Position to the first query term if (m_haveAnchors) { QString aname = QString::fromUtf8(editor->m_plaintorich->termAnchorName(1).c_str()); LOGDEB2(("Call movetoanchor(%s)\n", (const char *)aname.toUtf8())); editor->scrollToAnchor(aname); // Position the cursor approximately at the anchor (top of // viewport) so that searches start from here QTextCursor cursor = editor->cursorForPosition(QPoint(0, 0)); editor->setTextCursor(cursor); m_curAnchor = 1; } } // Enter document in document history string udi; if (idoc.getmeta(Rcl::Doc::keyudi, &udi)) { historyEnterDoc(g_dynconf, udi); } editor->setFocus(); emit(previewExposed(this, m_searchId, docnum)); LOGDEB(("LoadFileInCurrentTab: returning true\n")); return true; } PreviewTextEdit::PreviewTextEdit(QWidget* parent,const char* name, Preview *pv) : QTextEdit(parent), m_preview(pv), m_dspflds(false), m_docnum(-1) { setContextMenuPolicy(Qt::CustomContextMenu); setObjectName(name); connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(createPopupMenu(const QPoint&))); m_plaintorich = new PlainToRichQtPreview(); } PreviewTextEdit::~PreviewTextEdit() { delete m_plaintorich; } void PreviewTextEdit::createPopupMenu(const QPoint& pos) { LOGDEB1(("PreviewTextEdit::createPopupMenu()\n")); QMenu *popup = new QMenu(this); switch (m_curdsp) { case PTE_DSPTXT: popup->addAction(tr("Show fields"), this, SLOT(displayFields())); if (!m_image.isNull()) popup->addAction(tr("Show image"), this, SLOT(displayImage())); break; case PTE_DSPFLDS: popup->addAction(tr("Show main text"), this, SLOT(displayText())); if (!m_image.isNull()) popup->addAction(tr("Show image"), this, SLOT(displayImage())); break; case PTE_DSPIMG: default: popup->addAction(tr("Show fields"), this, SLOT(displayFields())); popup->addAction(tr("Show main text"), this, SLOT(displayText())); break; } popup->addAction(tr("Select All"), this, SLOT(selectAll())); popup->addAction(tr("Copy"), this, SLOT(copy())); popup->addAction(tr("Print"), this, SLOT(print())); if (prefs.previewPlainPre) { popup->addAction(tr("Fold lines"), m_preview, SLOT(togglePlainPre())); } else { popup->addAction(tr("Preserve indentation"), m_preview, SLOT(togglePlainPre())); } // Need to check ipath until we fix the internfile bug that always // has it convert to html for top level docs if (!m_dbdoc.url.empty() && !m_dbdoc.ipath.empty()) popup->addAction(tr("Save document to file"), m_preview, SLOT(emitSaveDocToFile())); popup->popup(mapToGlobal(pos)); } // Display main text void PreviewTextEdit::displayText() { LOGDEB1(("PreviewTextEdit::displayText()\n")); if (m_format == Qt::PlainText) setPlainText(m_richtxt); else setHtml(m_richtxt); m_curdsp = PTE_DSPTXT; } // Display field values void PreviewTextEdit::displayFields() { LOGDEB1(("PreviewTextEdit::displayFields()\n")); QString txt = "\n"; txt += "" + QString::fromLocal8Bit(m_url.c_str()); if (!m_ipath.empty()) txt += "|" + QString::fromUtf8(m_ipath.c_str()); txt += "

"; txt += "
\n"; for (map::const_iterator it = m_fdoc.meta.begin(); it != m_fdoc.meta.end(); it++) { if (!it->second.empty()) txt += "
" + QString::fromUtf8(it->first.c_str()) + "
" + "
" + QString::fromUtf8(escapeHtml(it->second).c_str()) + "
\n"; } txt += "
"; setHtml(txt); m_curdsp = PTE_DSPFLDS; } void PreviewTextEdit::displayImage() { LOGDEB1(("PreviewTextEdit::displayImage()\n")); if (m_image.isNull()) displayText(); setPlainText(""); if (m_image.width() > width() || m_image.height() > height()) { m_image = m_image.scaled(width(), height(), Qt::KeepAspectRatio); } document()->addResource(QTextDocument::ImageResource, QUrl("image"), m_image); QTextCursor cursor = textCursor(); cursor.insertImage("image"); m_curdsp = PTE_DSPIMG; } void PreviewTextEdit::mouseDoubleClickEvent(QMouseEvent *event) { LOGDEB2(("PreviewTextEdit::mouseDoubleClickEvent\n")); QTextEdit::mouseDoubleClickEvent(event); if (textCursor().hasSelection() && m_preview) m_preview->emitWordSelect(textCursor().selectedText()); } void PreviewTextEdit::print() { LOGDEB(("PreviewTextEdit::print\n")); if (!m_preview) return; #ifndef QT_NO_PRINTER QPrinter printer; QPrintDialog *dialog = new QPrintDialog(&printer, this); dialog->setWindowTitle(tr("Print Current Preview")); if (dialog->exec() != QDialog::Accepted) return; QTextEdit::print(&printer); #endif } recoll-1.17.3/qtgui/preview_w.h000644 001750 000000 00000012276 11740755063 017015 0ustar00dockeswheel000000 000000 /* 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 _PREVIEW_W_H_INCLUDED_ #define _PREVIEW_W_H_INCLUDED_ #include #include #include #include #include #include "rcldb.h" #include "refcntr.h" #include "plaintorich.h" #include "rclmain_w.h" class QTabWidget; class QLabel; class QLineEdit; class QPushButton; class QCheckBox; class Preview; class PlainToRichQtPreview; class PreviewTextEdit : public QTextEdit { Q_OBJECT; public: PreviewTextEdit(QWidget* parent, const char* name, Preview *pv); virtual ~PreviewTextEdit(); void moveToAnchor(const QString& name); enum DspType {PTE_DSPTXT, PTE_DSPFLDS, PTE_DSPIMG}; public slots: virtual void displayFields(); virtual void displayText(); virtual void displayImage(); virtual void print(); virtual void createPopupMenu(const QPoint& pos); friend class Preview; protected: void mouseDoubleClickEvent(QMouseEvent *); private: PlainToRichQtPreview *m_plaintorich; Preview *m_preview; bool m_dspflds; string m_url; // filename for this tab string m_ipath; // Internal doc path inside file int m_docnum; // Index of doc in db search results. // doc out of internfile (previous fields come from the index) with // main text erased (for space). Rcl::Doc m_fdoc; // The input doc out of the index/query list Rcl::Doc m_dbdoc; // Saved rich (or plain actually) text: the textedit seems to // sometimes (but not always) return its text stripped of tags, so // this is needed (for printing for example) QString m_richtxt; Qt::TextFormat m_format; // Temporary file name (possibly, if displaying image). The // TempFile itself is kept inside main.cpp (because that's where // signal cleanup happens), but we use its name to ask for release // when the tab is closed. string m_tmpfilename; QImage m_image; DspType m_curdsp; }; class Preview : public QWidget { Q_OBJECT public: Preview(int sid, // Search Id const HiliteData& hdata) // Search terms etc. for highlighting : QWidget(0), m_searchId(sid), m_hData(hdata) { init(); } ~Preview(){} virtual void closeEvent(QCloseEvent *e ); virtual bool eventFilter(QObject *target, QEvent *event ); /** * Arrange for the document to be displayed either by exposing the tab * if already loaded, or by creating a new tab and loading it. * @para docnum is used to link back to the result list (to highlight * paragraph when tab exposed etc. */ virtual bool makeDocCurrent(const Rcl::Doc& idoc, int docnum, bool sametab = false); void emitWordSelect(QString); friend class PreviewTextEdit; public slots: virtual void searchTextLine_textChanged(const QString& text); virtual void doSearch(const QString& str, bool next, bool reverse, bool wo = false); virtual void nextPressed(); virtual void prevPressed(); virtual void currentChanged(QWidget *tw); virtual void closeCurrentTab(); virtual void emitSaveDocToFile(); virtual void togglePlainPre(); signals: void previewClosed(Preview *); void wordSelect(QString); void showNext(Preview *w, int sid, int docnum); void showPrev(Preview *w, int sid, int docnum); void previewExposed(Preview *w, int sid, int docnum); void printCurrentPreviewRequest(); void saveDocToFile(Rcl::Doc); private: // Identifier of search in main window. This is used to check that // we make sense when requesting the next document when browsing // successive search results in a tab. int m_searchId; bool m_dynSearchActive; bool m_canBeep; bool m_loading; QWidget *m_currentW; HiliteData m_hData; bool m_justCreated; // First tab create is different bool m_haveAnchors; // Search terms are marked in text int m_lastAnchor; // Number of last anchor. Then rewind to 1 int m_curAnchor; QTabWidget* pvTab; QLabel* searchLabel; QLineEdit* searchTextLine; QPushButton* nextButton; QPushButton* prevButton; QPushButton* clearPB; QCheckBox* matchCheck; void init(); virtual void setCurTabProps(const Rcl::Doc& doc, int docnum); virtual PreviewTextEdit *currentEditor(); virtual PreviewTextEdit *addEditorTab(); virtual bool loadDocInCurrentTab(const Rcl::Doc& idoc, int dnm); }; #endif /* _PREVIEW_W_H_INCLUDED_ */ recoll-1.17.3/qtgui/rclhelp.cpp000644 001750 000000 00000004303 11740755063 016762 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #include #include #include "recoll.h" #include "rclhelp.h" #include "debuglog.h" map HelpClient::helpmap; void HelpClient::installMap(string wname, string section) { helpmap[wname] = section; } HelpClient::HelpClient(QObject *parent, const char *) : QObject(parent) { parent->installEventFilter(this); } bool HelpClient::eventFilter(QObject *obj, QEvent *event) { static time_t last_start; if (event->type() == QEvent::KeyPress || event->type() == QEvent::ShortcutOverride) { // LOGDEB(("HelpClient::eventFilter: %d\n", (int)event->type())); QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_F1 || ke->key() == Qt::Key_Help) { if (obj->isWidgetType()) { QWidget *widget = static_cast(obj)->focusWidget(); map::iterator it = helpmap.end(); while (widget) { it = helpmap.find((const char *)widget->objectName().toUtf8()); if (it != helpmap.end()) break; widget = widget->parentWidget(); } if (time(0) - last_start > 5) { last_start = time(0); if (it != helpmap.end()) { LOGDEB(("HelpClient::eventFilter: %s->%s\n", it->first.c_str(), it->second.c_str())); startManual(it->second); } else { LOGDEB(("HelpClient::eventFilter: no help section\n")); startManual(""); } } } return true; } } return false; } recoll-1.17.3/qtgui/rclhelp.h000644 001750 000000 00000002320 11740755063 016424 0ustar00dockeswheel000000 000000 /* * 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 RCLHELP_H #define RCLHELP_H #include #include #include using std::map; using std::string; class HelpClient : public QObject { Q_OBJECT public: HelpClient(QObject *parent, const char *name = 0); // Install mapping from widget name to manual section static void installMap(string wname, string section); protected: bool eventFilter(QObject *obj, QEvent *event); static map helpmap; }; #endif // RCLHELP_H recoll-1.17.3/qtgui/rclmain.ui000644 001750 000000 00000034673 11740755063 016626 0ustar00dockeswheel000000 000000 RclMainBase 0 0 800 600 0 0 Recoll 0 4 2 4 2 0 0 0 0 0 0 0 45 20 All 2 0 Search tools TopToolBarArea false Result list TopToolBarArea false 0 0 800 23 &File &Tools &Preferences &Help E&xit Ctrl+Q fileExitAction Update &index fileToggleIndexingAction &Rebuild index fileRebuildIndexAction &Erase document history fileEraseDocHistoryAction &Erase search history fileEraseSearchHistoryAction &Show missing helpers showMissingHelpers_Action &Show indexed types showActiveTypes_Action &About Recoll helpAbout_RecollAction &User manual userManualAction :/images/history.png:/images/history.png Document &History Document History toolsDoc_HistoryAction :/images/asearch.png:/images/asearch.png &Advanced Search Advanced/complex Search toolsAdvanced_SearchAction &Sort parameters Sort parameters toolsSort_parametersAction :/images/spell.png:/images/spell.png Term &explorer Term explorer tool toolsSpellAction false :/images/nextpage.png:/images/nextpage.png Next page Next page of results PgDown nextPageAction false :/images/firstpage.png:/images/firstpage.png First page Go to first page of results Shift+PgUp firstPageAction false :/images/prevpage.png:/images/prevpage.png Previous page Previous page of results PgUp prevPageAction &Indexing configuration indexConfigAction &Indexing schedule indexScheduleAction &Query configuration queryPrefsAction E&xternal index dialog External index dialog extIdxAction &Full Screen Full Screen F11 toggleFullScreenAction true false :/images/up.png:/images/up.png sortByDateAsc Sort by dates from oldest to newest true false :/images/down.png:/images/down.png sortByDateDesc Sort by dates from newest to oldest Show Query Details true :/images/table.png:/images/table.png Show results as table Show results as table SSearch QWidget
ssearch_w.h
ResList QWidget
reslist.h
ssearch_w.h reslist.h
recoll-1.17.3/qtgui/rclmain_w.cpp000644 001750 000000 00000160515 11754462015 017311 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #include #include #include #include #include #include #include #ifndef NO_NAMESPACES using std::pair; #endif /* NO_NAMESPACES */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "recoll.h" #include "debuglog.h" #include "mimehandler.h" #include "pathut.h" #include "smallut.h" #include "advsearch_w.h" #include "sortseq.h" #include "uiprefs_w.h" #include "guiutils.h" #include "reslist.h" #include "transcode.h" #include "refcntr.h" #include "ssearch_w.h" #include "execmd.h" #include "internfile.h" #include "docseqdb.h" #include "docseqhist.h" #include "confguiindex.h" #include "restable.h" #include "listdialog.h" #include "firstidx.h" #include "idxsched.h" #include "crontool.h" #include "rtitool.h" #include "indexer.h" #include "rclzg.h" #include "fileudi.h" using namespace confgui; #include "rclmain_w.h" #include "rclhelp.h" #include "moc_rclmain_w.cpp" extern "C" int XFlush(void *); QString g_stringAllStem, g_stringNoStem; static const QKeySequence quitKeySeq("Ctrl+q"); void RclMain::init() { // This is just to get the common catg strings into the message file static const char* catg_strings[] = { QT_TR_NOOP("All"), QT_TR_NOOP("media"), QT_TR_NOOP("message"), QT_TR_NOOP("other"), QT_TR_NOOP("presentation"), QT_TR_NOOP("spreadsheet"), QT_TR_NOOP("text"), QT_TR_NOOP("sorted"), QT_TR_NOOP("filtered") }; DocSequence::set_translations((const char *)tr("sorted").toUtf8(), (const char *)tr("filtered").toUtf8()); periodictimer = new QTimer(this); // idxstatus file. Make sure it exists before trying to watch it // (case where we're started on an older index, or if the status // file was deleted since indexing ::close(::open(theconfig->getIdxStatusFile().c_str(), O_CREAT, 0600)); m_watcher.addPath(QString::fromLocal8Bit( theconfig->getIdxStatusFile().c_str())); // At least some versions of qt4 don't display the status bar if // it's not created here. (void)statusBar(); (void)new HelpClient(this); HelpClient::installMap((const char *)this->objectName().toUtf8(), "RCL.SEARCH.SIMPLE"); // Set the focus to the search terms entry: sSearch->queryText->setFocus(); // Stemming language menu g_stringNoStem = tr("(no stemming)"); g_stringAllStem = tr("(all languages)"); m_idNoStem = preferencesMenu->addAction(g_stringNoStem); m_idNoStem->setCheckable(true); m_stemLangToId[g_stringNoStem] = m_idNoStem; m_idAllStem = preferencesMenu->addAction(g_stringAllStem); m_idAllStem->setCheckable(true); m_stemLangToId[g_stringAllStem] = m_idAllStem; // Can't get the stemming languages from the db at this stage as // db not open yet (the case where it does not even exist makes // things complicated). So get the languages from the config // instead string slangs; list langs; if (theconfig->getConfParam("indexstemminglanguages", slangs)) { stringToStrings(slangs, langs); } else { QMessageBox::warning(0, "Recoll", tr("error retrieving stemming languages")); } QAction *curid = prefs.queryStemLang == "ALL" ? m_idAllStem : m_idNoStem; QAction *id; for (list::const_iterator it = langs.begin(); it != langs.end(); it++) { QString qlang = QString::fromAscii(it->c_str(), it->length()); id = preferencesMenu->addAction(qlang); id->setCheckable(true); m_stemLangToId[qlang] = id; if (prefs.queryStemLang == qlang) { curid = id; } } curid->setChecked(true); // Toolbar+combobox version of the category selector QComboBox *catgCMB = 0; if (prefs.catgToolBar) { QToolBar *catgToolBar = new QToolBar(this); catgCMB = new QComboBox(catgToolBar); catgCMB->setEditable(FALSE); catgCMB->addItem(tr("All")); catgToolBar->setObjectName(QString::fromUtf8("catgToolBar")); catgCMB->setToolTip(tr("Document category filter")); catgToolBar->addWidget(catgCMB); this->addToolBar(Qt::TopToolBarArea, catgToolBar); } // Document categories buttons QHBoxLayout *bgrphbox = new QHBoxLayout(catgBGRP); QButtonGroup *bgrp = new QButtonGroup(catgBGRP); bgrphbox->addWidget(allRDB); int bgrpid = 0; bgrp->addButton(allRDB, bgrpid++); connect(bgrp, SIGNAL(buttonClicked(int)), this, SLOT(catgFilter(int))); allRDB->setChecked(true); list cats; theconfig->getGuiFilterNames(cats); // Text for button 0 is not used. Next statement just avoids unused // variable compiler warning for catg_strings m_catgbutvec.push_back(catg_strings[0]); for (list::const_iterator it = cats.begin(); it != cats.end(); it++) { QRadioButton *but = new QRadioButton(catgBGRP); QString catgnm = QString::fromUtf8(it->c_str(), it->length()); m_catgbutvec.push_back(*it); // We strip text before the first colon before setting the button name. // This is so that the user can decide the order of buttons by naming // the filter,ie, a:media b:messages etc. QString but_txt = catgnm; int colon = catgnm.indexOf(':'); if (colon != -1) { but_txt = catgnm.right(catgnm.size()-(colon+1)); } but->setText(tr(but_txt.toUtf8())); if (prefs.catgToolBar && catgCMB) catgCMB->addItem(tr(catgnm.toUtf8())); bgrphbox->addWidget(but); bgrp->addButton(but, bgrpid++); } catgBGRP->setLayout(bgrphbox); if (prefs.catgToolBar) catgBGRP->hide(); sSearch->queryText->installEventFilter(this); restable = new ResTable(this); verticalLayout->insertWidget(2, restable); actionShowResultsAsTable->setChecked(prefs.showResultsAsTable); on_actionShowResultsAsTable_toggled(prefs.showResultsAsTable); // Must not do this when restable is a child of rclmain // sc = new QShortcut(quitKeySeq, restable); // connect(sc, SIGNAL (activated()), this, SLOT (fileExit())); // A shortcut to get the focus back to the search entry. QKeySequence seq("Ctrl+Shift+s"); QShortcut *sc = new QShortcut(seq, this); connect(sc, SIGNAL (activated()), this, SLOT (focusToSearch())); connect(&m_watcher, SIGNAL(fileChanged(QString)), this, SLOT(idxStatus())); connect(sSearch, SIGNAL(startSearch(RefCntr)), this, SLOT(startSearch(RefCntr))); connect(sSearch, SIGNAL(clearSearch()), this, SLOT(resetSearch())); connect(preferencesMenu, SIGNAL(triggered(QAction*)), this, SLOT(setStemLang(QAction*))); connect(preferencesMenu, SIGNAL(aboutToShow()), this, SLOT(adjustPrefsMenu())); connect(fileExitAction, SIGNAL(activated() ), this, SLOT(fileExit() ) ); connect(fileToggleIndexingAction, SIGNAL(activated()), this, SLOT(toggleIndexing())); connect(fileRebuildIndexAction, SIGNAL(activated()), this, SLOT(rebuildIndex())); connect(fileEraseDocHistoryAction, SIGNAL(activated()), this, SLOT(eraseDocHistory())); connect(fileEraseSearchHistoryAction, SIGNAL(activated()), this, SLOT(eraseSearchHistory())); connect(helpAbout_RecollAction, SIGNAL(activated()), this, SLOT(showAboutDialog())); connect(showMissingHelpers_Action, SIGNAL(activated()), this, SLOT(showMissingHelpers())); connect(showActiveTypes_Action, SIGNAL(activated()), this, SLOT(showActiveTypes())); connect(userManualAction, SIGNAL(activated()), this, SLOT(startManual())); connect(toolsDoc_HistoryAction, SIGNAL(activated()), this, SLOT(showDocHistory())); connect(toolsAdvanced_SearchAction, SIGNAL(activated()), this, SLOT(showAdvSearchDialog())); connect(toolsSpellAction, SIGNAL(activated()), this, SLOT(showSpellDialog())); connect(indexConfigAction, SIGNAL(activated()), this, SLOT(showIndexConfig())); connect(indexScheduleAction, SIGNAL(activated()), this, SLOT(showIndexSched())); connect(queryPrefsAction, SIGNAL(activated()), this, SLOT(showUIPrefs())); connect(extIdxAction, SIGNAL(activated()), this, SLOT(showExtIdxDialog())); if (prefs.catgToolBar && catgCMB) connect(catgCMB, SIGNAL(activated(int)), this, SLOT(catgFilter(int))); connect(toggleFullScreenAction, SIGNAL(activated()), this, SLOT(toggleFullScreen())); connect(actionShowQueryDetails, SIGNAL(activated()), this, SLOT(showQueryDetails())); connect(periodictimer, SIGNAL(timeout()), this, SLOT(periodic100())); connect(this, SIGNAL(docSourceChanged(RefCntr)), restable, SLOT(setDocSource(RefCntr))); connect(this, SIGNAL(searchReset()), restable, SLOT(resetSource())); connect(this, SIGNAL(resultsReady()), restable, SLOT(readDocSource())); connect(this, SIGNAL(sortDataChanged(DocSeqSortSpec)), restable, SLOT(onSortDataChanged(DocSeqSortSpec))); connect(restable->getModel(), SIGNAL(sortDataChanged(DocSeqSortSpec)), this, SLOT(onSortDataChanged(DocSeqSortSpec))); connect(restable, SIGNAL(docEditClicked(Rcl::Doc)), this, SLOT(startNativeViewer(Rcl::Doc))); connect(restable, SIGNAL(docPreviewClicked(int, Rcl::Doc, int)), this, SLOT(startPreview(int, Rcl::Doc, int))); connect(restable, SIGNAL(docExpand(Rcl::Doc)), this, SLOT(docExpand(Rcl::Doc))); connect(restable, SIGNAL(previewRequested(Rcl::Doc)), this, SLOT(startPreview(Rcl::Doc))); connect(restable, SIGNAL(editRequested(Rcl::Doc)), this, SLOT(startNativeViewer(Rcl::Doc))); connect(restable, SIGNAL(docSaveToFileClicked(Rcl::Doc)), this, SLOT(saveDocToFile(Rcl::Doc))); connect(this, SIGNAL(docSourceChanged(RefCntr)), reslist, SLOT(setDocSource(RefCntr))); connect(firstPageAction, SIGNAL(activated()), reslist, SLOT(resultPageFirst())); connect(prevPageAction, SIGNAL(activated()), reslist, SLOT(resPageUpOrBack())); connect(nextPageAction, SIGNAL(activated()), reslist, SLOT(resPageDownOrNext())); connect(this, SIGNAL(searchReset()), reslist, SLOT(resetList())); connect(this, SIGNAL(resultsReady()), reslist, SLOT(readDocSource())); connect(reslist, SIGNAL(hasResults(int)), this, SLOT(resultCount(int))); connect(reslist, SIGNAL(docExpand(Rcl::Doc)), this, SLOT(docExpand(Rcl::Doc))); connect(reslist, SIGNAL(wordSelect(QString)), sSearch, SLOT(addTerm(QString))); connect(reslist, SIGNAL(wordReplace(const QString&, const QString&)), sSearch, SLOT(onWordReplace(const QString&, const QString&))); connect(reslist, SIGNAL(nextPageAvailable(bool)), this, SLOT(enableNextPage(bool))); connect(reslist, SIGNAL(prevPageAvailable(bool)), this, SLOT(enablePrevPage(bool))); connect(reslist, SIGNAL(docEditClicked(Rcl::Doc)), this, SLOT(startNativeViewer(Rcl::Doc))); connect(reslist, SIGNAL(docSaveToFileClicked(Rcl::Doc)), this, SLOT(saveDocToFile(Rcl::Doc))); connect(reslist, SIGNAL(editRequested(Rcl::Doc)), this, SLOT(startNativeViewer(Rcl::Doc))); connect(reslist, SIGNAL(docPreviewClicked(int, Rcl::Doc, int)), this, SLOT(startPreview(int, Rcl::Doc, int))); connect(reslist, SIGNAL(previewRequested(Rcl::Doc)), this, SLOT(startPreview(Rcl::Doc))); connect(reslist, SIGNAL(headerClicked()), this, SLOT(showQueryDetails())); if (prefs.keepSort && prefs.sortActive) { m_sortspec.field = (const char *)prefs.sortField.toUtf8(); m_sortspec.desc = prefs.sortDesc; onSortDataChanged(m_sortspec); emit sortDataChanged(m_sortspec); } fileRebuildIndexAction->setEnabled(FALSE); fileToggleIndexingAction->setEnabled(FALSE); // Start timer on a slow period (used for checking ^C). Will be // speeded up during indexing periodictimer->start(1000); } void RclMain::resultCount(int n) { actionSortByDateAsc->setEnabled(n>0); actionSortByDateDesc->setEnabled(n>0); } // This is called by a timer right after we come up. Try to open // the database and talk to the user if we can't void RclMain::initDbOpen() { bool nodb = false; string reason; bool maindberror; if (!maybeOpenDb(reason, true, &maindberror)) { nodb = true; if (maindberror) { FirstIdxDialog fidia(this); connect(fidia.idxconfCLB, SIGNAL(clicked()), this, SLOT(execIndexConfig())); connect(fidia.idxschedCLB, SIGNAL(clicked()), this, SLOT(execIndexSched())); connect(fidia.runidxPB, SIGNAL(clicked()), this, SLOT(toggleIndexing())); fidia.exec(); // Don't open adv search or run cmd line search in this case. return; } else { QMessageBox::warning(0, "Recoll", tr("Could not open external index. Db not open. Check external indexes list.")); } } if (prefs.startWithAdvSearchOpen) showAdvSearchDialog(); // If we have something in the search entry, it comes from a // command line argument if (!nodb && sSearch->hasSearchString()) QTimer::singleShot(0, sSearch, SLOT(startSimpleSearch())); if (!m_urltoview.isEmpty()) viewUrl(); } // Start native viewer or preview for input Doc. This is used allow // the using Recoll result docs with an ipath in another app. We act // as a proxy to extract the data and start a viewer. // The Url are encoded as file://path#ipath void RclMain::viewUrl() { if (m_urltoview.isEmpty() || !rcldb) return; QUrl qurl(m_urltoview); LOGDEB(("RclMain::viewUrl: Path [%s] fragment [%s]\n", (const char *)qurl.path().toLocal8Bit(), (const char *)qurl.fragment().toLocal8Bit())); /* In theory, the url might not be for a file managed by the fs indexer so that the make_udi() call here would be wrong(). When/if this happens we'll have to hide this part inside internfile and have some url magic to indicate the appropriate indexer/identification scheme */ string udi; make_udi((const char *)qurl.path().toLocal8Bit(), (const char *)qurl.fragment().toLocal8Bit(), udi); Rcl::Doc doc; if (!rcldb->getDoc(udi, doc) || doc.pc == -1) return; // Start a native viewer if the mimetype has one defined, else a // preview. string apptag; doc.getmeta(Rcl::Doc::keyapptg, &apptag); string viewer = theconfig->getMimeViewerDef(doc.mimetype, apptag); if (viewer.empty()) { startPreview(doc); } else { hide(); startNativeViewer(doc); // We have a problem here because xdg-open will exit // immediately after starting the command instead of waiting // for it, so we can't wait either and we don't know when we // can exit (deleting the temp file). As a bad workaround we // sleep some time then exit. The alternative would be to just // prevent the temp file deletion completely, leaving it // around forever. Better to let the user save a copy if he // wants I think. sleep(10); fileExit(); } } void RclMain::focusToSearch() { LOGDEB(("Giving focus to sSearch\n")); sSearch->queryText->setFocus(Qt::ShortcutFocusReason); } void RclMain::setStemLang(QAction *id) { LOGDEB(("RclMain::setStemLang(%p)\n", id)); // Check that the menu entry is for a stemming language change // (might also be "show prefs" etc. bool isLangId = false; for (map::const_iterator it = m_stemLangToId.begin(); it != m_stemLangToId.end(); it++) { if (id == it->second) isLangId = true; } if (!isLangId) return; // Set the "checked" item state for lang entries for (map::const_iterator it = m_stemLangToId.begin(); it != m_stemLangToId.end(); it++) { (it->second)->setChecked(false); } id->setChecked(true); // Retrieve language value (also handle special cases), set prefs, // notify that we changed QString lang; if (id == m_idNoStem) { lang = ""; } else if (id == m_idAllStem) { lang = "ALL"; } else { lang = id->text(); } prefs.queryStemLang = lang; LOGDEB(("RclMain::setStemLang(%d): lang [%s]\n", id, (const char *)prefs.queryStemLang.toAscii())); rwSettings(true); emit stemLangChanged(lang); } // Set the checked stemming language item before showing the prefs menu void RclMain::setStemLang(const QString& lang) { LOGDEB(("RclMain::setStemLang(%s)\n", (const char *)lang.toAscii())); QAction *id; if (lang == "") { id = m_idNoStem; } else if (lang == "ALL") { id = m_idAllStem; } else { map::iterator it = m_stemLangToId.find(lang); if (it == m_stemLangToId.end()) return; id = it->second; } for (map::const_iterator it = m_stemLangToId.begin(); it != m_stemLangToId.end(); it++) { (it->second)->setChecked(false); } id->setChecked(true); } // Prefs menu about to show void RclMain::adjustPrefsMenu() { setStemLang(prefs.queryStemLang); } void RclMain::closeEvent( QCloseEvent * ) { fileExit(); } // We also want to get rid of the advanced search form and previews // when we exit (not our children so that it's not systematically // created over the main form). bool RclMain::close() { LOGDEB(("RclMain::close\n")); fileExit(); return false; } void RclMain::fileExit() { LOGDEB(("RclMain: fileExit\n")); // Don't save geometry if we're currently fullscreened if (!isFullScreen()) { prefs.mainwidth = width(); prefs.mainheight = height(); } restable->saveColState(); prefs.ssearchTyp = sSearch->searchTypCMB->currentIndex(); if (asearchform) delete asearchform; // Let the exit handler clean up the rest (internal recoll stuff). exit(0); } void RclMain::idxStatus() { ConfSimple cs(theconfig->getIdxStatusFile().c_str(), 1); QString msg = tr("Indexing in progress: "); DbIxStatus status; string val; cs.get("phase", val); status.phase = DbIxStatus::Phase(atoi(val.c_str())); cs.get("fn", status.fn); cs.get("docsdone", val); status.docsdone = atoi(val.c_str()); cs.get("filesdone", val); status.filesdone = atoi(val.c_str()); cs.get("dbtotdocs", val); status.dbtotdocs = atoi(val.c_str()); QString phs; switch (status.phase) { case DbIxStatus::DBIXS_NONE:phs=tr("None");break; case DbIxStatus::DBIXS_FILES: phs=tr("Updating");break; case DbIxStatus::DBIXS_PURGE: phs=tr("Purge");break; case DbIxStatus::DBIXS_STEMDB: phs=tr("Stemdb");break; case DbIxStatus::DBIXS_CLOSING:phs=tr("Closing");break; case DbIxStatus::DBIXS_DONE:phs=tr("Done");break; case DbIxStatus::DBIXS_MONITOR:phs=tr("Monitor");break; default: phs=tr("Unknown");break; } msg += phs + " "; if (status.phase == DbIxStatus::DBIXS_FILES) { char cnts[100]; if (status.dbtotdocs > 0) sprintf(cnts,"(%d/%d/%d) ", status.docsdone, status.filesdone, status.dbtotdocs); else sprintf(cnts, "(%d/%d) ", status.docsdone, status.filesdone); msg += QString::fromAscii(cnts) + " "; } string mf;int ecnt = 0; string fcharset = theconfig->getDefCharset(true); if (!transcode(status.fn, mf, fcharset, "UTF-8", &ecnt) || ecnt) { mf = url_encode(status.fn, 0); } msg += QString::fromUtf8(mf.c_str()); statusBar()->showMessage(msg, 4000); } // This is called by a periodic timer to check the status of // indexing, a possible need to exit, and cleanup exited viewers void RclMain::periodic100() { LOGDEB2(("Periodic100\n")); if (m_idxproc) { // An indexing process was launched. If its' done, see status. int status; bool exited = m_idxproc->maybereap(&status); if (exited) { deleteZ(m_idxproc); if (status) { QMessageBox::warning(0, "Recoll", tr("Indexing failed")); } string reason; maybeOpenDb(reason, 1); } else { // update/show status even if the status file did not // change (else the status line goes blank during // lengthy operations). idxStatus(); } } // Update the "start/stop indexing" menu entry, can't be done from // the "start/stop indexing" slot itself if (m_idxproc) { m_indexerState = IXST_RUNNINGMINE; fileToggleIndexingAction->setText(tr("Stop &Indexing")); fileToggleIndexingAction->setEnabled(TRUE); fileRebuildIndexAction->setEnabled(FALSE); periodictimer->setInterval(200); } else { Pidfile pidfile(theconfig->getPidfile()); if (pidfile.open() == 0) { m_indexerState = IXST_NOTRUNNING; fileToggleIndexingAction->setText(tr("Update &Index")); fileToggleIndexingAction->setEnabled(TRUE); fileRebuildIndexAction->setEnabled(TRUE); periodictimer->setInterval(1000); } else { // Real time or externally started batch indexer running m_indexerState = IXST_RUNNINGNOTMINE; fileToggleIndexingAction->setText(tr("Stop &Indexing")); fileToggleIndexingAction->setEnabled(TRUE); fileRebuildIndexAction->setEnabled(FALSE); periodictimer->setInterval(200); } } // Possibly cleanup the dead viewers for (vector::iterator it = m_viewers.begin(); it != m_viewers.end(); it++) { int status; if ((*it)->maybereap(&status)) { deleteZ(*it); } } vector v; for (vector::iterator it = m_viewers.begin(); it != m_viewers.end(); it++) { if (*it) v.push_back(*it); } m_viewers = v; if (recollNeedsExit) fileExit(); } // This gets called when the "update iindex" action is activated. It executes // the requested action, and disables the menu entry. This will be // re-enabled by the indexing status check void RclMain::toggleIndexing() { switch (m_indexerState) { case IXST_RUNNINGMINE: if (m_idxproc) { // Indexing was in progress, request stop. Let the periodic // routine check for the results. int pid = m_idxproc->getChildPid(); if (pid > 0) kill(pid, SIGTERM); } break; case IXST_RUNNINGNOTMINE: { int rep = QMessageBox::information(0, tr("Warning"), tr("The current indexing process " "was not started from this " "interface. Click Ok to kill it " "anyway, or Cancel to leave it alone"), QMessageBox::Ok, QMessageBox::Cancel, QMessageBox::NoButton); if (rep == QMessageBox::Ok) { Pidfile pidfile(theconfig->getPidfile()); pid_t pid = pidfile.open(); if (pid > 0) kill(pid, SIGTERM); } } break; case IXST_NOTRUNNING: { list args; args.push_back("-c"); args.push_back(theconfig->getConfDir()); m_idxproc = new ExecCmd; m_idxproc->startExec("recollindex", args, false, false); } break; } } void RclMain::rebuildIndex() { switch (m_indexerState) { case IXST_RUNNINGMINE: case IXST_RUNNINGNOTMINE: return; //?? Should not have been called case IXST_NOTRUNNING: { int rep = QMessageBox::warning(0, tr("Erasing index"), tr("Reset the index and start " "from scratch ?"), QMessageBox::Ok, QMessageBox::Cancel, QMessageBox::NoButton); if (rep == QMessageBox::Ok) { list args; args.push_back("-c"); args.push_back(theconfig->getConfDir()); args.push_back("-z"); m_idxproc = new ExecCmd; m_idxproc->startExec("recollindex", args, false, false); } } break; } } // Start a db query and set the reslist docsource void RclMain::startSearch(RefCntr sdata) { LOGDEB(("RclMain::startSearch. Indexing %s\n", m_idxproc?"on":"off")); emit searchReset(); m_source = RefCntr(); // The db may have been closed at the end of indexing string reason; // If indexing is being performed, we reopen the db at each query. if (!maybeOpenDb(reason, m_idxproc != 0)) { QMessageBox::critical(0, "Recoll", QString(reason.c_str())); return; } string stemLang = (const char *)prefs.queryStemLang.toAscii(); if (stemLang == "ALL") { theconfig->getConfParam("indexstemminglanguages", stemLang); } sdata->setStemlang(stemLang); Rcl::Query *query = new Rcl::Query(rcldb); query->setCollapseDuplicates(prefs.collapseDuplicates); curPreview = 0; DocSequenceDb *src = new DocSequenceDb(RefCntr(query), string(tr("Query results").toUtf8()), sdata); src->setAbstractParams(prefs.queryBuildAbstract, prefs.queryReplaceAbstract); m_source = RefCntr(src); m_source->setSortSpec(m_sortspec); m_source->setFiltSpec(m_filtspec); emit docSourceChanged(m_source); emit sortDataChanged(m_sortspec); initiateQuery(); } class QueryThread : public QThread { int loglevel; RefCntr m_source; public: QueryThread(RefCntr source) : m_source(source) { loglevel = DebugLog::getdbl()->getlevel(); } ~QueryThread() { } virtual void run() { DebugLog::getdbl()->setloglevel(loglevel); cnt = m_source->getResCnt(); } int cnt; }; void RclMain::initiateQuery() { if (m_queryActive || m_source.isNull()) return; m_queryActive = true; QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QueryThread qthr(m_source); qthr.start(); QProgressDialog progress(this); progress.setLabelText(tr("Query in progress.
" "Due to limitations of the indexing library,
" "cancelling will exit the program")); progress.setWindowModality(Qt::WindowModal); progress.setRange(0,0); // For some reason setMinimumDuration() does not seem to work with // a busy dialog (range 0,0) Have to call progress.show() inside // the loop. // progress.setMinimumDuration(2000); // Also the multiple processEvents() seem to improve the responsiveness?? for (int i = 0;;i++) { qApp->processEvents(); if (qthr.wait(100)) { break; } if (i == 20) progress.show(); qApp->processEvents(); if (progress.wasCanceled()) { fileExit(); } qApp->processEvents(); } int cnt = qthr.cnt; QString msg; if (cnt > 0) { QString str; msg = tr("Result count (est.)") + ": " + str.setNum(cnt); } else { msg = tr("No results found"); } statusBar()->showMessage(msg, 0); QApplication::restoreOverrideCursor(); m_queryActive = false; emit(resultsReady()); } void RclMain::resetSearch() { emit searchReset(); } // Open advanced search dialog. void RclMain::showAdvSearchDialog() { if (asearchform == 0) { asearchform = new AdvSearch(0); connect(new QShortcut(quitKeySeq, asearchform), SIGNAL (activated()), this, SLOT (fileExit())); connect(asearchform, SIGNAL(startSearch(RefCntr)), this, SLOT(startSearch(RefCntr))); asearchform->show(); } else { // Close and reopen, in hope that makes us visible... asearchform->close(); asearchform->show(); } } void RclMain::showSpellDialog() { if (spellform == 0) { spellform = new SpellW(0); connect(new QShortcut(quitKeySeq, spellform), SIGNAL (activated()), this, SLOT (fileExit())); connect(spellform, SIGNAL(wordSelect(QString)), sSearch, SLOT(addTerm(QString))); spellform->show(); } else { // Close and reopen, in hope that makes us visible... spellform->close(); spellform->show(); } } void RclMain::showIndexConfig() { showIndexConfig(false); } void RclMain::execIndexConfig() { showIndexConfig(true); } void RclMain::showIndexConfig(bool modal) { LOGDEB(("showIndexConfig()\n")); if (indexConfig == 0) { indexConfig = new ConfIndexW(0, theconfig); connect(new QShortcut(quitKeySeq, indexConfig), SIGNAL (activated()), this, SLOT (fileExit())); } else { // Close and reopen, in hope that makes us visible... indexConfig->close(); indexConfig->reloadPanels(); } if (modal) { indexConfig->exec(); indexConfig->setModal(false); } else { indexConfig->show(); } } void RclMain::showIndexSched() { showIndexSched(false); } void RclMain::execIndexSched() { showIndexSched(true); } void RclMain::showIndexSched(bool modal) { LOGDEB(("showIndexSched()\n")); if (indexSched == 0) { indexSched = new IdxSchedW(this); connect(new QShortcut(quitKeySeq, indexSched), SIGNAL (activated()), this, SLOT (fileExit())); connect(indexSched->cronCLB, SIGNAL(clicked()), this, SLOT(execCronTool())); if (theconfig && theconfig->isDefaultConfig()) { connect(indexSched->rtidxCLB, SIGNAL(clicked()), this, SLOT(execRTITool())); } else { indexSched->rtidxCLB->setEnabled(false); } } else { // Close and reopen, in hope that makes us visible... indexSched->close(); } if (modal) { indexSched->exec(); indexSched->setModal(false); } else { indexSched->show(); } } void RclMain::showCronTool() { showCronTool(false); } void RclMain::execCronTool() { showCronTool(true); } void RclMain::showCronTool(bool modal) { LOGDEB(("showCronTool()\n")); if (cronTool == 0) { cronTool = new CronToolW(0); connect(new QShortcut(quitKeySeq, cronTool), SIGNAL (activated()), this, SLOT (fileExit())); } else { // Close and reopen, in hope that makes us visible... cronTool->close(); } if (modal) { cronTool->exec(); cronTool->setModal(false); } else { cronTool->show(); } } void RclMain::showRTITool() { showRTITool(false); } void RclMain::execRTITool() { showRTITool(true); } void RclMain::showRTITool(bool modal) { LOGDEB(("showRTITool()\n")); if (rtiTool == 0) { rtiTool = new RTIToolW(0); connect(new QShortcut(quitKeySeq, rtiTool), SIGNAL (activated()), this, SLOT (fileExit())); } else { // Close and reopen, in hope that makes us visible... rtiTool->close(); } if (modal) { rtiTool->exec(); rtiTool->setModal(false); } else { rtiTool->show(); } } void RclMain::showUIPrefs() { if (uiprefs == 0) { uiprefs = new UIPrefsDialog(this); connect(new QShortcut(quitKeySeq, uiprefs), SIGNAL (activated()), this, SLOT (fileExit())); connect(uiprefs, SIGNAL(uiprefsDone()), this, SLOT(setUIPrefs())); connect(this, SIGNAL(stemLangChanged(const QString&)), uiprefs, SLOT(setStemLang(const QString&))); } else { // Close and reopen, in hope that makes us visible... uiprefs->close(); } uiprefs->show(); } void RclMain::showExtIdxDialog() { if (uiprefs == 0) { uiprefs = new UIPrefsDialog(this); connect(new QShortcut(quitKeySeq, uiprefs), SIGNAL (activated()), this, SLOT (fileExit())); connect(uiprefs, SIGNAL(uiprefsDone()), this, SLOT(setUIPrefs())); } else { // Close and reopen, in hope that makes us visible... uiprefs->close(); } uiprefs->tabWidget->setCurrentIndex(3); uiprefs->show(); } void RclMain::showAboutDialog() { string vstring = Rcl::version_string() + string("
http://www.recoll.org") + string("
http://www.xapian.org"); QMessageBox::information(this, tr("About Recoll"), vstring.c_str()); } void RclMain::showMissingHelpers() { string miss = theconfig->getMissingHelperDesc(); QString msg = tr("External applications/commands needed and not found " "for indexing your file types:\n\n"); if (!miss.empty()) { msg += QString::fromUtf8(miss.c_str()); } else { msg += tr("No helpers found missing"); } QMessageBox::information(this, tr("Missing helper programs"), msg); } void RclMain::showActiveTypes() { if (rcldb == 0) { QMessageBox::warning(0, tr("Error"), tr("Index not open"), QMessageBox::Ok, QMessageBox::NoButton); return; } // Get list of all mime types in index. For this, we use a // wildcard field search on mtype Rcl::TermMatchResult matches; string prefix; if (!rcldb->termMatch(Rcl::Db::ET_WILD, "", "*", matches, -1, "mtype", &prefix)) { QMessageBox::warning(0, tr("Error"), tr("Index query error"), QMessageBox::Ok, QMessageBox::NoButton); return; } // Build the set of mtypes, stripping the prefix set mtypesfromdb; for (list::const_iterator it = matches.entries.begin(); it != matches.entries.end(); it++) { mtypesfromdb.insert(it->term.substr(prefix.size())); } // All types listed in mimeconf: list mtypesfromconfig = theconfig->getAllMimeTypes(); // Intersect file system types with config types (those not in the // config can be indexed by name, not by content) set mtypesfromdbconf; for (list::const_iterator it = mtypesfromconfig.begin(); it != mtypesfromconfig.end(); it++) { if (mtypesfromdb.find(*it) != mtypesfromdb.end()) mtypesfromdbconf.insert(*it); } // Substract the types for missing helpers (the docs are indexed by name only): string miss = theconfig->getMissingHelperDesc(); if (!miss.empty()) { FIMissingStore st; FileInterner::getMissingFromDescription(&st, miss); map >::const_iterator it; for (it = st.m_typesForMissing.begin(); it != st.m_typesForMissing.end(); it++) { set::const_iterator it1; for (it1 = it->second.begin(); it1 != it->second.end(); it1++) { set::iterator it2 = mtypesfromdbconf.find(*it1); if (it2 != mtypesfromdbconf.end()) mtypesfromdbconf.erase(it2); } } } ListDialog dialog; dialog.setWindowTitle(tr("Indexed MIME Types")); // Turn the result into a string and display dialog.groupBox->setTitle(tr("Content has been indexed for these mime types:")); // We replace the list with an editor so that the user can copy/paste delete dialog.listWidget; QTextEdit *editor = new QTextEdit(dialog.groupBox); editor->setReadOnly(TRUE); dialog.horizontalLayout->addWidget(editor); for (set::const_iterator it = mtypesfromdbconf.begin(); it != mtypesfromdbconf.end(); it++) { editor->append(QString::fromAscii(it->c_str())); } editor->moveCursor(QTextCursor::Start); editor->ensureCursorVisible(); dialog.exec(); } // If a preview (toplevel) window gets closed by the user, we need to // clean up because there is no way to reopen it. And check the case // where the current one is closed void RclMain::previewClosed(Preview *w) { LOGDEB(("RclMain::previewClosed(%p)\n", w)); if (w == curPreview) { LOGDEB(("Active preview closed\n")); curPreview = 0; } else { LOGDEB(("Old preview closed\n")); } delete w; } /** * Open a preview window for a given document, or load it into new tab of * existing window. * * @param docnum db query index * @param mod keyboards modifiers like ControlButton, ShiftButton */ void RclMain::startPreview(int docnum, Rcl::Doc doc, int mod) { LOGDEB(("startPreview(%d, doc, %d)\n", docnum, mod)); // Document up to date check. We do this only if ipath is not // empty as this does not appear to be a serious issue for single // docs (the main actual problem is displaying the wrong message // from a compacted mail folder) // // !! NOTE: there is one case where doing a partial index update // will not worl: if the search result does not exist in the new // version of the file, it won't be purged from the index because // a partial index pass does no purge, so its ref date will stay // the same and you keep getting the message about the index being // out of date. The only way to fix this is to run a normal // indexing pass. // Also we should re-run the query after updating the index // because the ipaths may be wrong in the current result list if (!doc.ipath.empty()) { string udi, sig; doc.getmeta(Rcl::Doc::keyudi, &udi); FileInterner::makesig(doc, sig); if (rcldb && !udi.empty()) { if (rcldb->needUpdate(udi, sig)) { int rep = QMessageBox::warning(0, tr("Warning"), tr("Index not up to date for this file. " "Refusing to risk showing the wrong " "entry. Click Ok to update the " "index for this file, then re-run the " "query when indexing is done. " "Else, Cancel."), QMessageBox::Ok, QMessageBox::Cancel, QMessageBox::NoButton); if (rep == QMessageBox::Ok) { LOGDEB(("Requesting index update for %s\n", doc.url.c_str())); vector docs(1, doc); updateIdxForDocs(docs); } return; } } } // Do the zeitgeist thing zg_send_event(ZGSEND_PREVIEW, doc); if (mod & Qt::ShiftModifier) { // User wants new preview window curPreview = 0; } if (curPreview == 0) { HiliteData hdata; m_source->getTerms(hdata.terms, hdata.groups, hdata.gslks); curPreview = new Preview(reslist->listId(), hdata); if (curPreview == 0) { QMessageBox::warning(0, tr("Warning"), tr("Can't create preview window"), QMessageBox::Ok, QMessageBox::NoButton); return; } connect(new QShortcut(quitKeySeq, curPreview), SIGNAL (activated()), this, SLOT (fileExit())); connect(curPreview, SIGNAL(previewClosed(Preview *)), this, SLOT(previewClosed(Preview *))); connect(curPreview, SIGNAL(wordSelect(QString)), sSearch, SLOT(addTerm(QString))); connect(curPreview, SIGNAL(showNext(Preview *, int, int)), this, SLOT(previewNextInTab(Preview *, int, int))); connect(curPreview, SIGNAL(showPrev(Preview *, int, int)), this, SLOT(previewPrevInTab(Preview *, int, int))); connect(curPreview, SIGNAL(previewExposed(Preview *, int, int)), this, SLOT(previewExposed(Preview *, int, int))); connect(curPreview, SIGNAL(saveDocToFile(Rcl::Doc)), this, SLOT(saveDocToFile(Rcl::Doc))); curPreview->setWindowTitle(getQueryDescription()); curPreview->show(); } curPreview->makeDocCurrent(doc, docnum); } void RclMain::updateIdxForDocs(vector& docs) { if (m_idxproc) { QMessageBox::warning(0, tr("Warning"), tr("Can't update index: indexer running"), QMessageBox::Ok, QMessageBox::NoButton); return; } vector paths; if (ConfIndexer::docsToPaths(docs, paths)) { list args; args.push_back("-c"); args.push_back(theconfig->getConfDir()); args.push_back("-i"); args.insert(args.end(), paths.begin(), paths.end()); m_idxproc = new ExecCmd; m_idxproc->startExec("recollindex", args, false, false); fileToggleIndexingAction->setText(tr("Stop &Indexing")); } fileToggleIndexingAction->setEnabled(FALSE); } /** * Open a preview window for a given document, no linking to result list * * This is used to show ie parent documents, which have no corresponding * entry in the result list. * */ void RclMain::startPreview(Rcl::Doc doc) { Preview *preview = new Preview(0, HiliteData()); if (preview == 0) { QMessageBox::warning(0, tr("Warning"), tr("Can't create preview window"), QMessageBox::Ok, QMessageBox::NoButton); return; } connect(new QShortcut(quitKeySeq, preview), SIGNAL (activated()), this, SLOT (fileExit())); connect(preview, SIGNAL(wordSelect(QString)), sSearch, SLOT(addTerm(QString))); // Do the zeitgeist thing zg_send_event(ZGSEND_PREVIEW, doc); preview->show(); preview->makeDocCurrent(doc, 0); } // Show next document from result list in current preview tab void RclMain::previewNextInTab(Preview * w, int sid, int docnum) { previewPrevOrNextInTab(w, sid, docnum, true); } // Show previous document from result list in current preview tab void RclMain::previewPrevInTab(Preview * w, int sid, int docnum) { previewPrevOrNextInTab(w, sid, docnum, false); } // Combined next/prev from result list in current preview tab void RclMain::previewPrevOrNextInTab(Preview * w, int sid, int docnum, bool nxt) { LOGDEB(("RclMain::previewNextInTab sid %d docnum %d, listId %d\n", sid, docnum, reslist->listId())); if (w == 0) // ?? return; if (sid != reslist->listId()) { QMessageBox::warning(0, "Recoll", tr("This search is not active any more")); return; } if (nxt) docnum++; else docnum--; if (docnum < 0 || m_source.isNull() || docnum >= m_source->getResCnt()) { QApplication::beep(); return; } Rcl::Doc doc; if (!reslist->getDoc(docnum, doc)) { QMessageBox::warning(0, "Recoll", tr("Cannot retrieve document info from database")); return; } w->makeDocCurrent(doc, docnum, true); } // Preview tab exposed: if the preview comes from the currently // displayed result list, tell reslist (to color the paragraph) void RclMain::previewExposed(Preview *, int sid, int docnum) { LOGDEB2(("RclMain::previewExposed: sid %d docnum %d, m_sid %d\n", sid, docnum, reslist->listId())); if (sid != reslist->listId()) { return; } reslist->previewExposed(docnum); } void RclMain::onSortCtlChanged() { if (m_sortspecnochange) return; LOGDEB(("RclMain::onSortCtlChanged()\n")); m_sortspec.reset(); if (actionSortByDateAsc->isChecked()) { m_sortspec.field = "mtime"; m_sortspec.desc = false; prefs.sortActive = true; prefs.sortDesc = false; prefs.sortField = "mtime"; } else if (actionSortByDateDesc->isChecked()) { m_sortspec.field = "mtime"; m_sortspec.desc = true; prefs.sortActive = true; prefs.sortDesc = true; prefs.sortField = "mtime"; } else { prefs.sortActive = prefs.sortDesc = false; prefs.sortField = ""; } if (m_source.isNotNull()) m_source->setSortSpec(m_sortspec); emit sortDataChanged(m_sortspec); initiateQuery(); } void RclMain::onSortDataChanged(DocSeqSortSpec spec) { LOGDEB(("RclMain::onSortDataChanged\n")); m_sortspecnochange = true; if (spec.field.compare("mtime")) { actionSortByDateDesc->setChecked(false); actionSortByDateAsc->setChecked(false); } else { actionSortByDateDesc->setChecked(spec.desc); actionSortByDateAsc->setChecked(!spec.desc); } m_sortspecnochange = false; if (m_source.isNotNull()) m_source->setSortSpec(spec); m_sortspec = spec; prefs.sortField = QString::fromUtf8(spec.field.c_str()); prefs.sortDesc = spec.desc; prefs.sortActive = !spec.field.empty(); initiateQuery(); } void RclMain::on_actionShowResultsAsTable_toggled(bool on) { LOGDEB(("RclMain::on_actionShowResultsAsTable_toggled(%d)\n", int(on))); prefs.showResultsAsTable = on; restable->setVisible(on); reslist->setVisible(!on); if (!on) { displayingTable = false; int docnum = restable->getDetailDocNumOrTopRow(); if (docnum >= 0) reslist->resultPageFor(docnum); } else { displayingTable = true; int docnum = reslist->pageFirstDocNum(); if (docnum >= 0) { restable->makeRowVisible(docnum); } nextPageAction->setEnabled(false); prevPageAction->setEnabled(false); firstPageAction->setEnabled(false); } } void RclMain::on_actionSortByDateAsc_toggled(bool on) { LOGDEB(("RclMain::on_actionSortByDateAsc_toggled(%d)\n", int(on))); if (on) { if (actionSortByDateDesc->isChecked()) { actionSortByDateDesc->setChecked(false); // Let our buddy work. return; } } onSortCtlChanged(); } void RclMain::on_actionSortByDateDesc_toggled(bool on) { LOGDEB(("RclMain::on_actionSortByDateDesc_toggled(%d)\n", int(on))); if (on) { if (actionSortByDateAsc->isChecked()) { actionSortByDateAsc->setChecked(false); // Let our buddy work. return; } } onSortCtlChanged(); } void RclMain::saveDocToFile(Rcl::Doc doc) { QString s = QFileDialog::getSaveFileName(this, //parent tr("Save file"), QString::fromLocal8Bit(path_home().c_str()) ); string tofile((const char *)s.toLocal8Bit()); TempFile temp; // not used because tofile is set. if (!FileInterner::idocToFile(temp, tofile, theconfig, doc)) { QMessageBox::warning(0, "Recoll", tr("Cannot extract document or create " "temporary file")); return; } } /* Look for html browser. We make a special effort for html because it's * used for reading help */ static bool lookForHtmlBrowser(string &exefile) { static const char *htmlbrowserlist = "opera google-chrome konqueror firefox mozilla netscape epiphany"; vector blist; stringToTokens(htmlbrowserlist, blist, " "); const char *path = getenv("PATH"); if (path == 0) path = "/bin:/usr/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/local/bin"; // Look for each browser for (vector::const_iterator bit = blist.begin(); bit != blist.end(); bit++) { if (ExecCmd::which(*bit, exefile, path)) return true; } exefile.clear(); return false; } void RclMain::startNativeViewer(Rcl::Doc doc) { // Look for appropriate viewer string cmdplusattr; if (prefs.useDesktopOpen) { cmdplusattr = theconfig->getMimeViewerDef("application/x-all", ""); } else { string apptag; doc.getmeta(Rcl::Doc::keyapptg, &apptag); cmdplusattr = theconfig->getMimeViewerDef(doc.mimetype, apptag); } if (cmdplusattr.empty()) { QMessageBox::warning(0, "Recoll", tr("No external viewer configured for mime type [") + doc.mimetype.c_str() + "]"); return; } // Extract possible viewer attributes ConfSimple attrs; string cmd; theconfig->valueSplitAttributes(cmdplusattr, cmd, attrs); bool ignoreipath = false; if (attrs.get("ignoreipath", cmdplusattr)) ignoreipath = stringToBool(cmdplusattr); // Split the command line list lcmd; if (!stringToStrings(cmd, lcmd)) { QMessageBox::warning(0, "Recoll", tr("Bad viewer command line for %1: [%2]\n" "Please check the mimeconf file") .arg(QString::fromAscii(doc.mimetype.c_str())) .arg(QString::fromLocal8Bit(cmd.c_str()))); return; } // Look for the command to execute in the exec path and the filters // directory string cmdpath; if (!ExecCmd::which(lcmd.front(), cmdpath)) { cmdpath = theconfig->findFilter(lcmd.front()); // findFilter returns its input param if the filter is not in // the normal places. As we already looked in the path, we // have no use for a simple command name here (as opposed to // mimehandler which will just let execvp do its thing). Erase // cmdpath so that the user dialog will be started further // down. if (!cmdpath.compare(lcmd.front())) cmdpath.erase(); // Specialcase text/html because of the help browser need if (cmdpath.empty() && !doc.mimetype.compare("text/html")) { if (lookForHtmlBrowser(cmdpath)) { lcmd.clear(); lcmd.push_back(cmdpath); lcmd.push_back("%u"); } } } // Command not found: start the user dialog to help find another one: if (cmdpath.empty()) { QString mt = QString::fromAscii(doc.mimetype.c_str()); QString message = tr("The viewer specified in mimeview for %1: %2" " is not found.\nDo you want to start the " " preferences dialog ?") .arg(mt).arg(QString::fromLocal8Bit(lcmd.front().c_str())); switch(QMessageBox::warning(0, "Recoll", message, "Yes", "No", 0, 0, 1)) { case 0: showUIPrefs(); if (uiprefs) uiprefs->showViewAction(mt); break; case 1: break; } // The user will have to click on the link again to try the // new command. return; } // We may need a temp file, or not, depending on the command // arguments and the fact that this is a subdoc or not. bool wantsipath = (cmd.find("%i") != string::npos) || ignoreipath; bool wantsfile = cmd.find("%f") != string::npos; bool istempfile = false; string fn = fileurltolocalpath(doc.url); string orgfn = fn; string url = doc.url; // If the command wants a file but this is not a file url, or // there is an ipath that it won't understand, we need a temp file: theconfig->setKeyDir(path_getfather(fn)); if ((wantsfile && fn.empty()) || (!wantsipath && !doc.ipath.empty())) { TempFile temp; if (!FileInterner::idocToFile(temp, string(), theconfig, doc)) { QMessageBox::warning(0, "Recoll", tr("Cannot extract document or create " "temporary file")); return; } istempfile = true; rememberTempFile(temp); fn = temp->filename(); url = string("file://") + fn; } // If using an actual file, check that it exists, and if it is // compressed, we may need an uncompressed version if (!fn.empty() && theconfig->mimeViewerNeedsUncomp(doc.mimetype)) { if (access(fn.c_str(), R_OK) != 0) { QMessageBox::warning(0, "Recoll", tr("Can't access file: ") + QString::fromLocal8Bit(fn.c_str())); return; } TempFile temp; if (FileInterner::isCompressed(fn, theconfig)) { if (!FileInterner::maybeUncompressToTemp(temp, fn, theconfig, doc)) { QMessageBox::warning(0, "Recoll", tr("Can't uncompress file: ") + QString::fromLocal8Bit(fn.c_str())); return; } } if (!temp.isNull()) { rememberTempFile(temp); fn = temp->filename(); url = string("file://") + fn; } } // Get rid of the command name. lcmd is now argv[1...n] lcmd.pop_front(); // Substitute %xx inside arguments string efftime; if (!doc.dmtime.empty() || !doc.fmtime.empty()) { efftime = doc.dmtime.empty() ? doc.fmtime : doc.dmtime; } else { efftime = "0"; } // Try to keep the letters used more or less consistent with the reslist // paragraph format. map subs; subs["D"] = efftime; subs["f"] = fn; subs["F"] = orgfn; subs["i"] = doc.ipath; subs["M"] = doc.mimetype; subs["U"] = url; subs["u"] = url; // Let %(xx) access all metadata. for (map::const_iterator it = doc.meta.begin(); it != doc.meta.end(); it++) { subs[it->first] = it->second; } string ncmd; for (list::iterator it = lcmd.begin(); it != lcmd.end(); it++) { pcSubst(*it, ncmd, subs); LOGDEB(("%s->%s\n", it->c_str(), ncmd.c_str())); *it = ncmd; } // Also substitute inside the unsplitted command line and display // in status bar pcSubst(cmd, ncmd, subs); ncmd += " &"; QStatusBar *stb = statusBar(); if (stb) { string fcharset = theconfig->getDefCharset(true); string prcmd; transcode(ncmd, prcmd, fcharset, "UTF-8"); QString msg = tr("Executing: [") + QString::fromUtf8(prcmd.c_str()) + "]"; stb->showMessage(msg, 5000); } if (!istempfile) historyEnterDoc(g_dynconf, doc.meta[Rcl::Doc::keyudi]); // Do the zeitgeist thing zg_send_event(ZGSEND_OPEN, doc); // We keep pushing back and never deleting. This can't be good... ExecCmd *ecmd = new ExecCmd; m_viewers.push_back(ecmd); ecmd->startExec(cmdpath, lcmd, false, false); } void RclMain::startManual() { startManual(string()); } void RclMain::startManual(const string& index) { Rcl::Doc doc; doc.url = "file://"; doc.url = path_cat(doc.url, theconfig->getDatadir()); doc.url = path_cat(doc.url, "doc"); doc.url = path_cat(doc.url, "usermanual.html"); LOGDEB(("RclMain::startManual: help index is %s\n", index.empty()?"(null)":index.c_str())); if (!index.empty()) { doc.url += "#"; doc.url += index; } doc.mimetype = "text/html"; startNativeViewer(doc); } // Search for document 'like' the selected one. We ask rcldb/xapian to find // significant terms, and add them to the simple search entry. void RclMain::docExpand(Rcl::Doc doc) { LOGDEB(("RclMain::docExpand()\n")); if (!rcldb) return; list terms; terms = m_source->expand(doc); if (terms.empty()) { LOGDEB(("RclMain::docExpand: no terms\n")); return; } // Do we keep the original query. I think we'd better not. // rcldb->expand is set to keep the original query terms instead. QString text;// = sSearch->queryText->currentText(); for (list::iterator it = terms.begin(); it != terms.end(); it++) { text += QString::fromLatin1(" \"") + QString::fromUtf8((*it).c_str()) + QString::fromLatin1("\""); } // We need to insert item here, its not auto-done like when the user types // CR sSearch->queryText->setEditText(text); sSearch->setAnyTermMode(); sSearch->startSimpleSearch(); } void RclMain::showDocHistory() { LOGDEB(("RclMain::showDocHistory\n")); emit searchReset(); m_source = RefCntr(); curPreview = 0; string reason; if (!maybeOpenDb(reason)) { QMessageBox::critical(0, "Recoll", QString(reason.c_str())); return; } // Construct a bogus SearchData structure RefCntrsearchdata = RefCntr(new Rcl::SearchData(Rcl::SCLT_AND)); searchdata->setDescription((const char *)tr("History data").toUtf8()); // If you change the title, also change it in eraseDocHistory() DocSequenceHistory *src = new DocSequenceHistory(rcldb, g_dynconf, string(tr("Document history").toUtf8())); src->setDescription((const char *)tr("History data").toUtf8()); DocSource *source = new DocSource(theconfig, RefCntr(src)); m_source = RefCntr(source); m_source->setSortSpec(m_sortspec); m_source->setFiltSpec(m_filtspec); emit docSourceChanged(m_source); emit sortDataChanged(m_sortspec); initiateQuery(); } // Erase all memory of documents viewed void RclMain::eraseDocHistory() { // Clear file storage if (g_dynconf) g_dynconf->eraseAll(docHistSubKey); // Clear possibly displayed history if (reslist->displayingHistory()) { showDocHistory(); } } void RclMain::eraseSearchHistory() { prefs.ssearchHistory.clear(); sSearch->queryText->clear(); } // Called when the uiprefs dialog is ok'd void RclMain::setUIPrefs() { if (!uiprefs) return; LOGDEB(("Recollmain::setUIPrefs\n")); reslist->setFont(); } void RclMain::enableNextPage(bool yesno) { if (!displayingTable) nextPageAction->setEnabled(yesno); } void RclMain::enablePrevPage(bool yesno) { if (!displayingTable) { prevPageAction->setEnabled(yesno); firstPageAction->setEnabled(yesno); } } QString RclMain::getQueryDescription() { if (m_source.isNull()) return ""; return QString::fromUtf8(m_source->getDescription().c_str()); } /** Show detailed expansion of a query */ void RclMain::showQueryDetails() { if (m_source.isNull()) return; string oq = breakIntoLines(m_source->getDescription(), 100, 50); QString str; QString desc = tr("Result count (est.)") + ": " + str.setNum(m_source->getResCnt()) + "
"; desc += tr("Query details") + ": " + QString::fromUtf8(oq.c_str()); QMessageBox::information(this, tr("Query details"), desc); } // User pressed a category button: set filter params in reslist void RclMain::catgFilter(int id) { LOGDEB(("RclMain::catgFilter: id %d\n")); if (id < 0 || id >= int(m_catgbutvec.size())) return; m_filtspec.reset(); if (id != 0) { string catg = m_catgbutvec[id]; string frag; theconfig->getGuiFilter(catg, frag); m_filtspec.orCrit(DocSeqFiltSpec::DSFS_QLANG, frag); } LOGDEB(("RclMain::catgFilter: calling setFiltSpec\n")); if (m_source.isNotNull()) m_source->setFiltSpec(m_filtspec); initiateQuery(); } void RclMain::toggleFullScreen() { if (isFullScreen()) showNormal(); else showFullScreen(); } bool RclMain::eventFilter(QObject *, QEvent *event) { if (event->type() == QEvent::KeyPress) { LOGDEB2(("RclMain::eventFilter: keypress\n")); // We used to map shift-home to reslist "goto first page" // here but we now use shift-pageUp because shift-home is // useful to select all inside the search entry } else if (event->type() == QEvent::Show) { LOGDEB2(("RclMain::eventFilter: Show\n")); // move the focus to the search entry on show sSearch->queryText->setFocus(); } return false; } void RclMain::applyStyleSheet() { ::applyStyleSheet(prefs.stylesheetFile); } recoll-1.17.3/qtgui/rclmain_w.h000644 001750 000000 00000014053 11754462015 016751 0ustar00dockeswheel000000 000000 /* * 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 RCLMAIN_W_H #define RCLMAIN_W_H #include #include #include #include "sortseq.h" #include "preview_w.h" #include "recoll.h" #include "advsearch_w.h" #include "uiprefs_w.h" #include "rcldb.h" #include "searchdata.h" #include "spell_w.h" #include "refcntr.h" #include "pathut.h" class IdxSchedW; class ExecCmd; class Preview; class ResTable; class CronToolW; class RTIToolW; #include "ui_rclmain.h" namespace confgui { class ConfIndexW; } using confgui::ConfIndexW; class RclMain : public QMainWindow, public Ui::RclMainBase { Q_OBJECT public: enum IndexerState {IXST_NOTRUNNING, IXST_RUNNINGMINE, IXST_RUNNINGNOTMINE}; RclMain(QWidget * parent = 0) : QMainWindow(parent), curPreview(0), asearchform(0), uiprefs(0), indexConfig(0), indexSched(0), cronTool(0), rtiTool(0), spellform(0), periodictimer(0), restable(0), displayingTable(0), m_idNoStem(0), m_idAllStem(0), m_idxproc(0), m_sortspecnochange(false), m_indexerState(IXST_RUNNINGNOTMINE), m_queryActive(false) { setupUi(this); init(); } ~RclMain() {} virtual bool eventFilter(QObject *target, QEvent *event); QString getQueryDescription(); /** This is only called from main() to set an URL to be displayed (using recoll as a doc extracter for embedded docs */ virtual void setUrlToView(const QString& u) {m_urltoview = u;} /** Same usage: actually display the current urltoview */ virtual void viewUrl(); public slots: virtual bool close(); virtual void fileExit(); virtual void idxStatus(); virtual void periodic100(); virtual void toggleIndexing(); virtual void rebuildIndex(); virtual void startSearch(RefCntr sdata); virtual void previewClosed(Preview *w); virtual void showAdvSearchDialog(); virtual void showSpellDialog(); virtual void showAboutDialog(); virtual void showMissingHelpers(); virtual void showActiveTypes(); virtual void startManual(); virtual void startManual(const string&); virtual void showDocHistory(); virtual void showExtIdxDialog(); virtual void showUIPrefs(); virtual void showIndexConfig(); virtual void execIndexConfig(); virtual void showCronTool(); virtual void execCronTool(); virtual void showRTITool(); virtual void execRTITool(); virtual void showIndexSched(); virtual void execIndexSched(); virtual void setUIPrefs(); virtual void enableNextPage(bool); virtual void enablePrevPage(bool); virtual void docExpand(Rcl::Doc); virtual void startPreview(int docnum, Rcl::Doc doc, int keymods); virtual void startPreview(Rcl::Doc); virtual void startNativeViewer(Rcl::Doc); virtual void saveDocToFile(Rcl::Doc); virtual void previewNextInTab(Preview *, int sid, int docnum); virtual void previewPrevInTab(Preview *, int sid, int docnum); virtual void previewExposed(Preview *, int sid, int docnum); virtual void resetSearch(); virtual void eraseDocHistory(); virtual void eraseSearchHistory(); virtual void setStemLang(QAction *id); virtual void adjustPrefsMenu(); virtual void catgFilter(int); virtual void initDbOpen(); virtual void toggleFullScreen(); virtual void focusToSearch(); virtual void on_actionSortByDateAsc_toggled(bool on); virtual void on_actionSortByDateDesc_toggled(bool on); virtual void on_actionShowResultsAsTable_toggled(bool on); virtual void onSortDataChanged(DocSeqSortSpec); virtual void resultCount(int); virtual void showQueryDetails(); virtual void applyStyleSheet(); signals: void docSourceChanged(RefCntr); void stemLangChanged(const QString& lang); void sortDataChanged(DocSeqSortSpec); void resultsReady(); void searchReset(); protected: virtual void closeEvent( QCloseEvent * ); private: Preview *curPreview; AdvSearch *asearchform; UIPrefsDialog *uiprefs; ConfIndexW *indexConfig; IdxSchedW *indexSched; CronToolW *cronTool; RTIToolW *rtiTool; SpellW *spellform; QTimer *periodictimer; ResTable *restable; bool displayingTable; QAction *m_idNoStem; QAction *m_idAllStem; QFileSystemWatcher m_watcher; vector m_viewers; ExecCmd *m_idxproc; // Indexing process map m_stemLangToId; vector m_catgbutvec; DocSeqFiltSpec m_filtspec; bool m_sortspecnochange; DocSeqSortSpec m_sortspec; RefCntr m_source; IndexerState m_indexerState; bool m_queryActive; // If set on init, will be displayed either through ext app, or // preview (if no ext app set) QString m_urltoview; virtual void init(); virtual void previewPrevOrNextInTab(Preview *, int sid, int docnum, bool next); virtual void setStemLang(const QString& lang); virtual void onSortCtlChanged(); virtual void showIndexConfig(bool modal); virtual void showIndexSched(bool modal); virtual void showCronTool(bool modal); virtual void showRTITool(bool modal); virtual void updateIdxForDocs(vector&); virtual void initiateQuery(); }; #endif // RCLMAIN_W_H recoll-1.17.3/qtgui/rclzg.cpp000644 001750 000000 00000005151 11740755063 016454 0ustar00dockeswheel000000 000000 /* Copyright (C) 2012 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 USE_ZEITGEIST #include "rclzg.h" #include "debuglog.h" #include "pathut.h" #include #include #include #include #include #include #include // Can't see no reason why our logger couldn' static QtZeitgeist::Log zglogger; void zg_send_event(ZgSendType, const Rcl::Doc& doc) { static int needinit = 1; if (needinit) { QtZeitgeist::init(); needinit = 0; } // The subject is about the document QtZeitgeist::DataModel::Subject subject; subject.setUri(QString::fromLocal8Bit(doc.url.c_str())); // TODO: refine these subject.setInterpretation(QtZeitgeist::Interpretation::Subject::NFODocument); if (doc.ipath.empty()) subject.setManifestation(QtZeitgeist::Manifestation::Subject::NFOFileDataObject); else subject.setManifestation(QtZeitgeist::Manifestation::Subject::NFOEmbeddedFileDataObject); subject.setOrigin(QString::fromLocal8Bit(path_getfather(doc.url).c_str())); subject.setMimeType(doc.mimetype.c_str()); string titleOrFilename; doc.getmeta(Rcl::Doc::keytt, &titleOrFilename); if (titleOrFilename.empty()) { doc.getmeta(Rcl::Doc::keyfn, &titleOrFilename); } subject.setText(QString::fromUtf8(titleOrFilename.c_str())); QtZeitgeist::DataModel::Event event; event.setTimestamp(QDateTime::currentDateTime()); event.addSubject(subject); event.setInterpretation(QtZeitgeist::Interpretation::Event::ZGAccessEvent); event.setManifestation(QtZeitgeist::Manifestation::Event::ZGUserActivity); event.setActor("app://recoll.desktop"); QtZeitgeist::DataModel::EventList events; events.push_back(event); LOGDEB(("zg_send_event, sending for %s %s\n", doc.mimetype.c_str(), doc.url.c_str())); zglogger.insertEvents(events); } #endif recoll-1.17.3/qtgui/rclzg.h000644 001750 000000 00000002101 11740755063 016111 0ustar00dockeswheel000000 000000 /* Copyright (C) 2012 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 _RCLZG_H_INCLUDED_ #define _RCLZG_H_INCLUDED_ #include "rcldoc.h" enum ZgSendType {ZGSEND_PREVIEW, ZGSEND_OPEN}; #ifndef USE_ZEITGEIST inline void zg_send_event(ZgSendType, const Rcl::Doc&){} #else extern void zg_send_event(ZgSendType tp, const Rcl::Doc& doc); #endif #endif // _RCLZG_H_INCLUDED_ recoll-1.17.3/qtgui/recoll.h000644 001750 000000 00000003260 11740755063 016257 0ustar00dockeswheel000000 000000 /* 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 _RECOLL_H_INCLUDED_ #define _RECOLL_H_INCLUDED_ #include #include "rclconfig.h" #include "rcldb.h" #include "ptmutex.h" #include // Misc declarations in need of sharing between the UI files // Open the database if needed. We now force a close/open by default extern bool maybeOpenDb(std::string &reason, bool force = true, bool *maindberror = 0); /** Retrieve configured stemming languages */ bool getStemLangs(list& langs); extern RclConfig *theconfig; extern RclConfig *thestableconfig; extern PTMutexInit thestableconfiglock; extern void snapshotConfig(); extern void rememberTempFile(TempFile); extern void forgetTempFile(string &fn); extern Rcl::Db *rcldb; extern int recollNeedsExit; extern void startManual(const string& helpindex); extern void applyStyleSheet(const QString&); #ifdef RCL_USE_ASPELL class Aspell; extern Aspell *aspell; #endif #endif /* _RECOLL_H_INCLUDED_ */ recoll-1.17.3/qtgui/recoll.pro.in000644 001750 000000 00000004617 11740755063 017244 0ustar00dockeswheel000000 000000 TEMPLATE = app LANGUAGE = C++ @QMAKE_ENABLE_WEBKIT@QT += webkit @QMAKE_DISABLE_WEBKIT@QMAKE_CXXFLAGS += -DRESLIST_TEXTBROWSER @QMAKE_ENABLE_ZEITGEIST@QT += dbus @QMAKE_ENABLE_ZEITGEIST@QMAKE_CXXFLAGS += -DUSE_ZEITGEIST CONFIG += qt warn_on thread release HEADERS += \ advsearch_w.h \ confgui/confgui.h \ confgui/confguiindex.h \ crontool.h \ editdialog.h \ firstidx.h \ idxsched.h \ listdialog.h \ preview_w.h \ rclhelp.h \ rclmain_w.h \ reslist.h \ restable.h \ rtitool.h \ searchclause_w.h \ spell_w.h \ ssearch_w.h \ uiprefs_w.h \ viewaction_w.h \ SOURCES += \ advsearch_w.cpp \ confgui/confgui.cpp \ confgui/confguiindex.cpp \ crontool.cpp \ guiutils.cpp \ main.cpp \ preview_w.cpp \ rclhelp.cpp \ rclmain_w.cpp \ rclzg.cpp \ reslist.cpp \ restable.cpp \ rtitool.cpp \ searchclause_w.cpp \ spell_w.cpp \ ssearch_w.cpp \ uiprefs_w.cpp \ viewaction_w.cpp \ FORMS = \ advsearch.ui \ crontool.ui \ editdialog.ui \ firstidx.ui \ idxsched.ui \ listdialog.ui \ rclmain.ui \ restable.ui \ rtitool.ui \ spell.ui \ ssearchb.ui \ uiprefs.ui \ viewaction.ui \ RESOURCES = recoll.qrc unix { UI_DIR = .ui MOC_DIR = .moc OBJECTS_DIR = .obj LIBS += ../lib/librcl.a \ $(BSTATIC) @LIBXAPIAN@ $(LIBXAPIANSTATICEXTRA) @LIBICONV@ $(BDYNAMIC) \ @LIBQZEITGEIST@ -lz INCLUDEPATH += ../common ../index ../internfile ../query ../unac \ ../utils ../aspell ../rcldb ../qtgui \ confgui DEPENDPATH += $$INCLUDEPATH POST_TARGETDEPS = ../lib/librcl.a } UNAME = $$system(uname -s) contains( UNAME, [lL]inux ) { LIBS += -ldl -lX11 } contains( UNAME, SunOS ) { LIBS += -ldl } TRANSLATIONS = \ i18n/recoll_cs.ts \ i18n/recoll_de.ts \ i18n/recoll_es.ts \ i18n/recoll_fr.ts \ i18n/recoll_it.ts \ i18n/recoll_lt.ts \ i18n/recoll_ru.ts \ i18n/recoll_tr.ts \ i18n/recoll_uk.ts \ i18n/recoll_xx.ts \ i18n/recoll_zh_CN.ts \ i18n/recoll_zh.ts \ recoll-1.17.3/qtgui/recoll.qrc000644 001750 000000 00000000723 11740755063 016616 0ustar00dockeswheel000000 000000 images/asearch.png images/cancel.png images/close.png images/history.png images/nextpage.png images/prevpage.png images/firstpage.png images/sortparms.png images/spell.png images/table.png images/up.png images/down.png recoll-1.17.3/qtgui/reslist.cpp000644 001750 000000 00000065066 11757431555 017040 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef __APPLE__ #include #endif #include "debuglog.h" #include "smallut.h" #include "recoll.h" #include "guiutils.h" #include "pathut.h" #include "docseq.h" #include "pathut.h" #include "mimehandler.h" #include "plaintorich.h" #include "refcntr.h" #include "internfile.h" #include "indexer.h" #include "reslist.h" #include "moc_reslist.cpp" #include "rclhelp.h" #ifdef RCL_USE_ASPELL #include "rclaspell.h" #endif #ifndef MIN #define MIN(A,B) ((A) < (B) ? (A) : (B)) #endif #ifndef RESLIST_TEXTBROWSER #include #include #include #endif class QtGuiResListPager : public ResListPager { public: QtGuiResListPager(ResList *p, int ps) : ResListPager(ps), m_parent(p) {} virtual bool append(const string& data); virtual bool append(const string& data, int idx, const Rcl::Doc& doc); virtual string trans(const string& in); virtual string detailsLink(); virtual const string &parFormat(); virtual const string &dateFormat(); virtual string nextUrl(); virtual string prevUrl(); virtual string headerContent(); virtual void suggest(const vectoruterms, map >& sugg); virtual string absSep() {return (const char *)(prefs.abssep.toUtf8());} virtual string iconUrl(RclConfig *, Rcl::Doc& doc); private: ResList *m_parent; }; #if 0 FILE *fp; void logdata(const char *data) { if (fp == 0) fp = fopen("/tmp/recolltoto.html", "a"); if (fp) fprintf(fp, "%s", data); } #else #define logdata(X) #endif ////////////////////////////// // /// QtGuiResListPager methods: bool QtGuiResListPager::append(const string& data) { LOGDEB2(("QtGuiReslistPager::appendString : %s\n", data.c_str())); logdata(data.c_str()); m_parent->append(QString::fromUtf8(data.c_str())); return true; } bool QtGuiResListPager::append(const string& data, int docnum, const Rcl::Doc&) { LOGDEB2(("QtGuiReslistPager::appendDoc: blockCount %d, %s\n", m_parent->document()->blockCount(), data.c_str())); logdata(data.c_str()); #ifdef RESLIST_TEXTBROWSER int blkcnt0 = m_parent->document()->blockCount(); m_parent->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); m_parent->textCursor().insertBlock(); m_parent->insertHtml(QString::fromUtf8(data.c_str())); m_parent->moveCursor(QTextCursor::Start, QTextCursor::MoveAnchor); m_parent->ensureCursorVisible(); int blkcnt1 = m_parent->document()->blockCount(); for (int block = blkcnt0; block < blkcnt1; block++) { m_parent->m_pageParaToReldocnums[block] = docnum; } #else QString sdoc = QString("
").arg(docnum); m_parent->append(sdoc); m_parent->append(QString::fromUtf8(data.c_str())); m_parent->append("
"); #endif return true; } string QtGuiResListPager::trans(const string& in) { return string((const char*)ResList::tr(in.c_str()).toUtf8()); } string QtGuiResListPager::detailsLink() { string chunk = ""; chunk += trans("(show query)"); chunk += ""; return chunk; } const string& QtGuiResListPager::parFormat() { return prefs.creslistformat; } const string& QtGuiResListPager::dateFormat() { return prefs.creslistdateformat; } string QtGuiResListPager::nextUrl() { return "n-1"; } string QtGuiResListPager::prevUrl() { return "p-1"; } string QtGuiResListPager::headerContent() { return (const char *)prefs.reslistheadertext.toUtf8(); } void QtGuiResListPager::suggest(const vectoruterms, map >& sugg) { sugg.clear(); #ifdef RCL_USE_ASPELL bool noaspell = false; theconfig->getConfParam("noaspell", &noaspell); if (noaspell) return; if (!aspell) { LOGERR(("QtGuiResListPager:: aspell not initialized\n")); return; } for (vector::const_iterator uit = uterms.begin(); uit != uterms.end(); uit++) { list asuggs; string reason; // If the term is in the index, we don't suggest alternatives. // Actually, we may want to check the frequencies and propose something // anyway if a possible variation is much more common (as google does) if (aspell->check(*rcldb, *uit, reason)) continue; else if (!reason.empty()) return; if (!aspell->suggest(*rcldb, *uit, asuggs, reason)) { LOGERR(("QtGuiResListPager::suggest: aspell failed: %s\n", reason.c_str())); continue; } if (!asuggs.empty()) { sugg[*uit] = vector(asuggs.begin(), asuggs.end()); if (sugg[*uit].size() > 5) sugg[*uit].resize(5); // Set up the links as a . for (vector::iterator it = sugg[*uit].begin(); it != sugg[*uit].end(); it++) { *it = string("" + *it + ""; } } } #endif } string QtGuiResListPager::iconUrl(RclConfig *config, Rcl::Doc& doc) { if (doc.ipath.empty()) { vector docs; docs.push_back(doc); vector paths; ConfIndexer::docsToPaths(docs, paths); if (!paths.empty()) { string path; LOGDEB0(("ResList::iconUrl: source path [%s]\n", paths[0].c_str())); if (thumbPathForUrl(cstr_fileu + paths[0], 128, path)) { LOGDEB0(("ResList::iconUrl: icon path [%s]\n", path.c_str())); return cstr_fileu + path; } else { LOGDEB0(("ResList::iconUrl: no icon: path [%s]\n", path.c_str())); } } else { LOGDEB(("ResList::iconUrl: docsToPaths failed\n")); } } return ResListPager::iconUrl(config, doc); } /////// /////// End reslistpager methods class PlainToRichQtReslist : public PlainToRich { public: virtual ~PlainToRichQtReslist() {} virtual string startMatch() { return string(""); } virtual string endMatch() {return string("");} }; static PlainToRichQtReslist g_hiliter; ///////////////////////////////////// ResList::ResList(QWidget* parent, const char* name) : RESLIST_PARENTCLASS(parent) { if (!name) setObjectName("resList"); else setObjectName(name); #ifdef RESLIST_TEXTBROWSER LOGDEB(("Reslist: using QTextBrowser\n")); setReadOnly(TRUE); setUndoRedoEnabled(FALSE); setOpenLinks(FALSE); setTabChangesFocus(true); // signals and slots connections connect(this, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(linkWasClicked(const QUrl &))); #else LOGDEB(("Reslist: using QWebView\n")); // signals and slots connections connect(this, SIGNAL(linkClicked(const QUrl &)), this, SLOT(linkWasClicked(const QUrl &))); page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); settings()->setAttribute(QWebSettings::JavascriptEnabled, true); #endif setFont(); languageChange(); (void)new HelpClient(this); HelpClient::installMap((const char *)this->objectName().toAscii(), "RCL.SEARCH.RESLIST"); #if 0 // See comments in "highlighted connect(this, SIGNAL(highlighted(const QString &)), this, SLOT(highlighted(const QString &))); #endif setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(createPopupMenu(const QPoint&))); m_curPvDoc = -1; m_lstClckMod = 0; m_listId = 0; m_pager = new QtGuiResListPager(this, prefs.respagesize); m_pager->setHighLighter(&g_hiliter); } ResList::~ResList() { // These have to exist somewhere for translations to work #ifdef __GNUC__ __attribute__((unused)) #endif static const char* strings[] = { QT_TR_NOOP("

No results found
"), QT_TR_NOOP("Documents"), QT_TR_NOOP("out of at least"), QT_TR_NOOP("for"), QT_TR_NOOP("Previous"), QT_TR_NOOP("Next"), QT_TR_NOOP("Unavailable document"), QT_TR_NOOP("Preview"), QT_TR_NOOP("Open"), QT_TR_NOOP("(show query)"), QT_TR_NOOP("

Alternate spellings (accents suppressed): "), }; } void ResList::setFont() { #ifdef RESLIST_TEXTBROWSER if (prefs.reslistfontfamily.length()) { QFont nfont(prefs.reslistfontfamily, prefs.reslistfontsize); QTextBrowser::setFont(nfont); } else { QTextBrowser::setFont(QFont()); } #else QWebSettings *websettings = settings(); if (prefs.reslistfontfamily.length()) { websettings->setFontSize(QWebSettings::DefaultFontSize, prefs.reslistfontsize); websettings->setFontFamily(QWebSettings::StandardFont, prefs.reslistfontfamily); } else { websettings->resetFontSize(QWebSettings::DefaultFontSize); websettings->resetFontFamily(QWebSettings::StandardFont); } #endif } int ResList::newListId() { static int id; return ++id; } extern "C" int XFlush(void *); void ResList::setDocSource(RefCntr nsource) { LOGDEB(("ResList::setDocSource()\n")); m_source = RefCntr(new DocSource(theconfig, nsource)); } // A query was executed, or the filtering/sorting parameters changed, // re-read the results. void ResList::readDocSource() { LOGDEB(("ResList::readDocSource()\n")); resetView(); if (m_source.isNull()) return; m_listId = newListId(); // Reset the page size in case the preference was changed m_pager->setPageSize(prefs.respagesize); m_pager->setDocSource(m_source); resultPageNext(); emit hasResults(m_source->getResCnt()); } void ResList::resetList() { LOGDEB(("ResList::resetList()\n")); setDocSource(RefCntr()); resetView(); } void ResList::resetView() { m_curPvDoc = -1; // There should be a progress bar for long searches but there isn't // We really want the old result list to go away, otherwise, for a // slow search, the user will wonder if anything happened. The // following helps making sure that the textedit is really // blank. Else, there are often icons or text left around #ifdef RESLIST_TEXTBROWSER m_pageParaToReldocnums.clear(); clear(); QTextBrowser::append("."); clear(); #ifndef __APPLE__ XFlush(QX11Info::display()); #endif #else m_text = ""; setHtml(""); #endif } bool ResList::displayingHistory() { // We want to reset the displayed history if it is currently // shown. Using the title value is an ugly hack string htstring = string((const char *)tr("Document history").toUtf8()); if (m_source.isNull() || m_source->title().empty()) return false; return m_source->title().find(htstring) == 0; } void ResList::languageChange() { setWindowTitle(tr("Result list")); } #ifdef RESLIST_TEXTBROWSER // Get document number from text block number int ResList::docnumfromparnum(int block) { if (m_pager->pageNumber() < 0) return -1; // Try to find the first number < input and actually in the map // (result blocks can be made of several text blocks) std::map::iterator it; do { it = m_pageParaToReldocnums.find(block); if (it != m_pageParaToReldocnums.end()) return pageFirstDocNum() + it->second; } while (--block >= 0); return -1; } // Get range of paragraph numbers which make up the result for document number pair ResList::parnumfromdocnum(int docnum) { LOGDEB(("parnumfromdocnum: docnum %d\n", docnum)); if (m_pager->pageNumber() < 0) { LOGDEB(("parnumfromdocnum: no page return -1,-1\n")); return pair(-1,-1); } int winfirst = pageFirstDocNum(); if (docnum - winfirst < 0) { LOGDEB(("parnumfromdocnum: docnum %d < winfirst %d return -1,-1\n", docnum, winfirst)); return pair(-1,-1); } docnum -= winfirst; for (std::map::iterator it = m_pageParaToReldocnums.begin(); it != m_pageParaToReldocnums.end(); it++) { if (docnum == it->second) { int first = it->first; int last = first+1; std::map::iterator it1; while ((it1 = m_pageParaToReldocnums.find(last)) != m_pageParaToReldocnums.end() && it1->second == docnum) { last++; } LOGDEB(("parnumfromdocnum: return %d,%d\n", first, last)); return pair(first, last); } } LOGDEB(("parnumfromdocnum: not found return -1,-1\n")); return pair(-1,-1); } #endif // TEXTBROWSER // Return doc from current or adjacent result pages. We can get called // for a document not in the current page if the user browses through // results inside a result window (with shift-arrow). This can only // result in a one-page change. bool ResList::getDoc(int docnum, Rcl::Doc &doc) { LOGDEB(("ResList::getDoc: docnum %d winfirst %d\n", docnum, pageFirstDocNum())); int winfirst = pageFirstDocNum(); int winlast = m_pager->pageLastDocNum(); if (docnum < 0 || winfirst < 0 || winlast < 0) return false; // Is docnum in current page ? Then all Ok if (docnum >= winfirst && docnum <= winlast) { return m_source->getDoc(docnum, doc); } // Else we accept to page down or up but not further if (docnum < winfirst && docnum >= winfirst - prefs.respagesize) { resultPageBack(); } else if (docnum < winlast + 1 + prefs.respagesize) { resultPageNext(); } winfirst = pageFirstDocNum(); winlast = m_pager->pageLastDocNum(); if (docnum >= winfirst && docnum <= winlast) { return m_source->getDoc(docnum, doc); } return false; } void ResList::keyPressEvent(QKeyEvent * e) { if ((e->modifiers() & Qt::ShiftModifier)) { if (e->key() == Qt::Key_PageUp) { // Shift-PageUp -> first page of results resultPageFirst(); return; } } else { if (e->key() == Qt::Key_PageUp || e->key() == Qt::Key_Backspace) { resPageUpOrBack(); return; } else if (e->key() == Qt::Key_PageDown || e->key() == Qt::Key_Space) { resPageDownOrNext(); return; } } RESLIST_PARENTCLASS::keyPressEvent(e); } void ResList::mouseReleaseEvent(QMouseEvent *e) { m_lstClckMod = 0; if (e->modifiers() & Qt::ControlModifier) { m_lstClckMod |= Qt::ControlModifier; } if (e->modifiers() & Qt::ShiftModifier) { m_lstClckMod |= Qt::ShiftModifier; } RESLIST_PARENTCLASS::mouseReleaseEvent(e); } void ResList::highlighted(const QString& ) { // This is supposedly called when a link is preactivated (hover or tab // traversal, but is not actually called for tabs. We would have liked to // give some kind of visual feedback for tab traversal } // Page Up/Down: we don't try to check if current paragraph is last or // first. We just page up/down and check if viewport moved. If it did, // fair enough, else we go to next/previous result page. void ResList::resPageUpOrBack() { #ifdef RESLIST_TEXTBROWSER int vpos = verticalScrollBar()->value(); verticalScrollBar()->triggerAction(QAbstractSlider::SliderPageStepSub); if (vpos == verticalScrollBar()->value()) resultPageBack(); #else if (scrollIsAtTop()) { resultPageBack(); } else { QWebFrame *frame = page()->mainFrame(); frame->scroll(0, -int(0.9*geometry().height())); } setupArrows(); #endif } void ResList::resPageDownOrNext() { #ifdef RESLIST_TEXTBROWSER int vpos = verticalScrollBar()->value(); verticalScrollBar()->triggerAction(QAbstractSlider::SliderPageStepAdd); LOGDEB(("ResList::resPageDownOrNext: vpos before %d, after %d\n", vpos, verticalScrollBar()->value())); if (vpos == verticalScrollBar()->value()) resultPageNext(); #else if (scrollIsAtBottom()) { resultPageNext(); } else { QWebFrame *frame = page()->mainFrame(); frame->scroll(0, int(0.9*geometry().height())); } setupArrows(); #endif } void ResList::setupArrows() { emit prevPageAvailable(m_pager->hasPrev() || !scrollIsAtTop()); emit nextPageAvailable(m_pager->hasNext() || !scrollIsAtBottom()); } bool ResList::scrollIsAtBottom() { #ifdef RESLIST_TEXTBROWSER return false; #else QWebFrame *frame = page()->mainFrame(); bool ret; if (!frame || frame->scrollBarGeometry(Qt::Vertical).isEmpty()) { ret = true; } else { int max = frame->scrollBarMaximum(Qt::Vertical); int cur = frame->scrollBarValue(Qt::Vertical); ret = (max != 0) && (cur == max); LOGDEB2(("Scrollatbottom: cur %d max %d\n", cur, max)); } LOGDEB2(("scrollIsAtBottom: returning %d\n", ret)); return ret; #endif } bool ResList::scrollIsAtTop() { #ifdef RESLIST_TEXTBROWSER return false; #else QWebFrame *frame = page()->mainFrame(); bool ret; if (!frame || frame->scrollBarGeometry(Qt::Vertical).isEmpty()) { ret = true; } else { int cur = frame->scrollBarValue(Qt::Vertical); int min = frame->scrollBarMinimum(Qt::Vertical); LOGDEB(("Scrollattop: cur %d min %d\n", cur, min)); ret = (cur == min); } #endif LOGDEB2(("scrollIsAtTop: returning %d\n", ret)); return ret; } // Show previous page of results. We just set the current number back // 2 pages and show next page. void ResList::resultPageBack() { if (m_pager->hasPrev()) { m_pager->resultPageBack(); displayPage(); } } // Go to the first page void ResList::resultPageFirst() { // In case the preference was changed m_pager->setPageSize(prefs.respagesize); m_pager->resultPageFirst(); displayPage(); } // Fill up result list window with next screen of hits void ResList::resultPageNext() { if (m_pager->hasNext()) { m_pager->resultPageNext(); displayPage(); } } void ResList::resultPageFor(int docnum) { m_pager->resultPageFor(docnum); displayPage(); } void ResList::append(const QString &text) { LOGDEB2(("QtGuiReslistPager::appendQString : %s\n", (const char*)text.toUtf8())); #ifdef RESLIST_TEXTBROWSER QTextBrowser::append(text); #else m_text += text; #endif } void ResList::displayPage() { resetView(); m_pager->displayPage(theconfig); #ifndef RESLIST_TEXTBROWSER setHtml(m_text); #endif LOGDEB0(("ResList::displayPg: hasNext %d atBot %d hasPrev %d at Top %d \n", m_pager->hasPrev(), scrollIsAtBottom(), m_pager->hasNext(), scrollIsAtTop())); setupArrows(); // Possibly color paragraph of current preview if any previewExposed(m_curPvDoc); } // Color paragraph (if any) of currently visible preview void ResList::previewExposed(int docnum) { LOGDEB(("ResList::previewExposed: doc %d\n", docnum)); // Possibly erase old one to white if (m_curPvDoc != -1) { #ifdef RESLIST_TEXTBROWSER pair blockrange = parnumfromdocnum(m_curPvDoc); if (blockrange.first != -1) { for (int blockn = blockrange.first; blockn < blockrange.second; blockn++) { QTextBlock block = document()->findBlockByNumber(blockn); QTextCursor cursor(block); QTextBlockFormat format = cursor.blockFormat(); format.clearBackground(); cursor.setBlockFormat(format); } } #else QString sel = QString("div[rcldocnum=\"%1\"]").arg(m_curPvDoc - pageFirstDocNum()); LOGDEB2(("Searching for element, selector: [%s]\n", (const char *)sel.toAscii())); QWebElement elt = page()->mainFrame()->findFirstElement(sel); if (!elt.isNull()) { LOGDEB2(("Found\n")); elt.removeAttribute("style"); } else { LOGDEB2(("Not Found\n")); } #endif m_curPvDoc = -1; } // Set background for active preview's doc entry m_curPvDoc = docnum; #ifdef RESLIST_TEXTBROWSER pair blockrange = parnumfromdocnum(docnum); // Maybe docnum is -1 or not in this window, if (blockrange.first < 0) return; // Color the new active paragraph QColor color("LightBlue"); for (int blockn = blockrange.first+1; blockn < blockrange.second; blockn++) { QTextBlock block = document()->findBlockByNumber(blockn); QTextCursor cursor(block); QTextBlockFormat format; format.setBackground(QBrush(color)); cursor.mergeBlockFormat(format); setTextCursor(cursor); ensureCursorVisible(); } #else QString sel = QString("div[rcldocnum=\"%1\"]").arg(docnum - pageFirstDocNum()); LOGDEB2(("Searching for element, selector: [%s]\n", (const char *)sel.toAscii())); QWebElement elt = page()->mainFrame()->findFirstElement(sel); if (!elt.isNull()) { LOGDEB2(("Found\n")); elt.setAttribute("style", "background: LightBlue;}"); } else { LOGDEB2(("Not Found\n")); } #endif } // Double click in res list: add selection to simple search void ResList::mouseDoubleClickEvent(QMouseEvent *event) { RESLIST_PARENTCLASS::mouseDoubleClickEvent(event); #ifdef RESLIST_TEXTBROWSER if (textCursor().hasSelection()) emit(wordSelect(textCursor().selectedText())); #else emit(wordSelect(selectedText())); #endif } void ResList::linkWasClicked(const QUrl &url) { string ascurl = (const char *)url.toString().toAscii();; LOGDEB(("ResList::linkWasClicked: [%s]\n", ascurl.c_str())); int what = ascurl[0]; switch (what) { case 'H': emit headerClicked(); break; case 'P': case 'E': { int i = atoi(ascurl.c_str()+1) - 1; Rcl::Doc doc; if (!getDoc(i, doc)) { LOGERR(("ResList::linkWasClicked: can't get doc for %d\n", i)); return; } if (what == 'P') emit docPreviewClicked(i, doc, m_lstClckMod); else emit docEditClicked(doc); } break; case 'n': resultPageNext(); break; case 'p': resultPageBack(); break; case 'S': { QString s = url.toString(); if (!s.isEmpty()) s = s.right(s.size()-1); int bar = s.indexOf("|"); if (bar != -1 && bar < s.size()-1) { QString o = s.left(bar); QString n = s.right(s.size() - (bar+1)); emit wordReplace(o, n); } } break; default: LOGERR(("ResList::linkWasClicked: bad link [%s]\n", ascurl.c_str())); break;// ?? } } void ResList::createPopupMenu(const QPoint& pos) { LOGDEB(("ResList::createPopupMenu(%d, %d)\n", pos.x(), pos.y())); #ifdef RESLIST_TEXTBROWSER QTextCursor cursor = cursorForPosition(pos); int blocknum = cursor.blockNumber(); LOGDEB(("ResList::createPopupMenu(): block %d\n", blocknum)); m_popDoc = docnumfromparnum(blocknum); #else QWebHitTestResult htr = page()->mainFrame()->hitTestContent(pos); if (htr.isNull()) return; QWebElement el = htr.enclosingBlockElement(); while (!el.isNull() && !el.hasAttribute("rcldocnum")) el = el.parent(); if (el.isNull()) return; QString snum = el.attribute("rcldocnum"); m_popDoc = pageFirstDocNum() + snum.toInt(); #endif if (m_popDoc < 0) return; QMenu *popup = new QMenu(this); popup->addAction(tr("&Preview"), this, SLOT(menuPreview())); Rcl::Doc doc; bool havedoc = getDoc(m_popDoc, doc); string apptag; if (havedoc) doc.getmeta(Rcl::Doc::keyapptg, &apptag); if (havedoc && !theconfig->getMimeViewerDef(doc.mimetype, apptag).empty()) { popup->addAction(tr("&Open"), this, SLOT(menuEdit())); } popup->addAction(tr("Copy &File Name"), this, SLOT(menuCopyFN())); popup->addAction(tr("Copy &URL"), this, SLOT(menuCopyURL())); if (havedoc && !doc.ipath.empty()) { popup->addAction(tr("&Write to File"), this, SLOT(menuSaveToFile())); } popup->addAction(tr("Find &similar documents"), this, SLOT(menuExpand())); popup->addAction(tr("Preview P&arent document/folder"), this, SLOT(menuPreviewParent())); popup->addAction(tr("&Open Parent document/folder"), this, SLOT(menuOpenParent())); popup->popup(mapToGlobal(pos)); } void ResList::menuPreview() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) emit docPreviewClicked(m_popDoc, doc, 0); } void ResList::menuSaveToFile() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) emit docSaveToFileClicked(doc); } void ResList::menuPreviewParent() { Rcl::Doc doc; if (!getDoc(m_popDoc, doc) || m_source.isNull()) return; Rcl::Doc pdoc; if (m_source->getEnclosing(doc, pdoc)) { emit previewRequested(pdoc); } else { // No parent doc: show enclosing folder with app configured for // directories pdoc.url = path_getfather(doc.url); pdoc.mimetype = "application/x-fsdirectory"; emit editRequested(pdoc); } } void ResList::menuOpenParent() { Rcl::Doc doc; if (!getDoc(m_popDoc, doc) || m_source.isNull()) return; Rcl::Doc pdoc; if (m_source->getEnclosing(doc, pdoc)) { emit editRequested(pdoc); } else { // No parent doc: show enclosing folder with app configured for // directories pdoc.url = path_getfather(doc.url); pdoc.mimetype = "application/x-fsdirectory"; emit editRequested(pdoc); } } void ResList::menuEdit() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) emit docEditClicked(doc); } void ResList::menuCopyFN() { LOGDEB(("menuCopyFN\n")); Rcl::Doc doc; if (getDoc(m_popDoc, doc)) { LOGDEB(("menuCopyFN: Got doc, fn: [%s]\n", doc.url.c_str())); // Our urls currently always begin with "file://" // // Problem: setText expects a QString. Passing a (const char*) // as we used to do causes an implicit conversion from // latin1. File are binary and the right approach would be no // conversion, but it's probably better (less worse...) to // make a "best effort" tentative and try to convert from the // locale's charset than accept the default conversion. QString qfn = QString::fromLocal8Bit(doc.url.c_str()+7); QApplication::clipboard()->setText(qfn, QClipboard::Selection); QApplication::clipboard()->setText(qfn, QClipboard::Clipboard); } } void ResList::menuCopyURL() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) { string url = url_encode(doc.url, 7); QApplication::clipboard()->setText(url.c_str(), QClipboard::Selection); QApplication::clipboard()->setText(url.c_str(), QClipboard::Clipboard); } } void ResList::menuExpand() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) emit docExpand(doc); } int ResList::pageFirstDocNum() { return m_pager->pageFirstDocNum(); } recoll-1.17.3/qtgui/reslist.h000644 001750 000000 00000011065 11757431555 016473 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 _RESLIST_H_INCLUDED_ #define _RESLIST_H_INCLUDED_ #include #include #ifndef NO_NAMESPACES using std::list; using std::pair; #endif #ifdef RESLIST_TEXTBROWSER #include #define RESLIST_PARENTCLASS QTextBrowser #else #include #define RESLIST_PARENTCLASS QWebView #endif #include "docseq.h" #include "sortseq.h" #include "filtseq.h" #include "refcntr.h" #include "rcldoc.h" #include "reslistpager.h" class QtGuiResListPager; /** * Display a list of document records. The data can be out of the history * manager or from an index query, both abstracted as a DocSequence. */ class ResList : public RESLIST_PARENTCLASS { Q_OBJECT; friend class QtGuiResListPager; public: ResList(QWidget* parent = 0, const char* name = 0); virtual ~ResList(); // Return document for given docnum. We mostly act as an // intermediary to the docseq here, but this has also the // side-effect of making the entry current (visible and // highlighted), and only works if the num is inside the current // page or its immediate neighbours. bool getDoc(int docnum, Rcl::Doc &); bool displayingHistory(); int listId() const {return m_listId;} int pageFirstDocNum(); void setFont(); public slots: virtual void setDocSource(RefCntr nsource); virtual void resetList(); // Erase current list virtual void resPageUpOrBack(); // Page up pressed virtual void resPageDownOrNext(); // Page down pressed virtual void resultPageBack(); // Previous page of results virtual void resultPageFirst(); // First page of results virtual void resultPageNext(); // Next (or first) page of results virtual void resultPageFor(int docnum); // Page containing docnum virtual void menuPreview(); virtual void menuSaveToFile(); virtual void menuEdit(); virtual void menuCopyFN(); virtual void menuCopyURL(); virtual void menuExpand(); virtual void menuPreviewParent(); virtual void menuOpenParent(); virtual void previewExposed(int); virtual void append(const QString &text); virtual void readDocSource(); virtual void highlighted(const QString& link); virtual void createPopupMenu(const QPoint& pos); signals: void nextPageAvailable(bool); void prevPageAvailable(bool); void docEditClicked(Rcl::Doc); void docPreviewClicked(int, Rcl::Doc, int); void docSaveToFileClicked(Rcl::Doc); void previewRequested(Rcl::Doc); void editRequested(Rcl::Doc); void headerClicked(); void docExpand(Rcl::Doc); void wordSelect(QString); void wordReplace(const QString&, const QString&); void hasResults(int); protected: void keyPressEvent(QKeyEvent *e); void mouseReleaseEvent(QMouseEvent *e); void mouseDoubleClickEvent(QMouseEvent*); protected slots: virtual void languageChange(); virtual void linkWasClicked(const QUrl &); private: QtGuiResListPager *m_pager; RefCntr m_source; int m_popDoc; // Docnum for the popup menu. int m_curPvDoc;// Docnum for current preview int m_lstClckMod; // Last click modifier. int m_listId; // query Id for matching with preview windows #ifdef RESLIST_TEXTBROWSER // Translate from textedit paragraph number to relative // docnum. Built while we insert text into the qtextedit std::map m_pageParaToReldocnums; virtual int docnumfromparnum(int); virtual pair parnumfromdocnum(int); #else QString m_text; // webview doesn't take text incrementally, store it. #endif virtual void displayPage(); // Display current page static int newListId(); void resetView(); bool scrollIsAtTop(); bool scrollIsAtBottom(); void setupArrows(); }; #endif /* _RESLIST_H_INCLUDED_ */ recoll-1.17.3/qtgui/restable.cpp000644 001750 000000 00000065620 11740755063 017143 0ustar00dockeswheel000000 000000 /* * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "recoll.h" #include "refcntr.h" #include "docseq.h" #include "debuglog.h" #include "restable.h" #include "guiutils.h" #include "reslistpager.h" #include "reslist.h" #include "rclconfig.h" #include "plaintorich.h" #include "indexer.h" // Compensate for the default and somewhat bizarre vertical placement // of text in cells static const int ROWHEIGHTPAD = 2; static const int TEXTINCELLVTRANS = -4; ////////////////////////////////////////////////////////////////////////////// // Restable hiliter: to highlight search term in the table. This is actually // the same as reslist's, could be shared. class PlainToRichQtReslist : public PlainToRich { public: virtual ~PlainToRichQtReslist() {} virtual string startMatch() { return string(""); } virtual string endMatch() {return string("");} }; static PlainToRichQtReslist g_hiliter; ////////////////////////////////////////////////////////////////////////// // Restable "pager". We use it to print details for a document in the // detail area /// class ResTablePager : public ResListPager { public: ResTablePager(ResTable *p) : ResListPager(1), m_parent(p) {} virtual bool append(const string& data, int idx, const Rcl::Doc& doc); virtual string trans(const string& in); virtual const string &parFormat(); virtual string absSep() {return (const char *)(prefs.abssep.toUtf8());} virtual string iconUrl(RclConfig *, Rcl::Doc& doc); private: ResTable *m_parent; }; bool ResTablePager::append(const string& data, int, const Rcl::Doc&) { m_parent->m_detail->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); m_parent->m_detail->textCursor().insertBlock(); m_parent->m_detail->insertHtml(QString::fromUtf8(data.c_str())); return true; } string ResTablePager::trans(const string& in) { return string((const char*)ResList::tr(in.c_str()).toUtf8()); } const string& ResTablePager::parFormat() { return prefs.creslistformat; } string ResTablePager::iconUrl(RclConfig *config, Rcl::Doc& doc) { if (doc.ipath.empty()) { vector docs; docs.push_back(doc); vector paths; ConfIndexer::docsToPaths(docs, paths); if (!paths.empty()) { string path; if (thumbPathForUrl(cstr_fileu + paths[0], 128, path)) { return cstr_fileu + path; } } } return ResListPager::iconUrl(config, doc); } ///////////////////////////////////////////////////////////////////////////// /// Detail text area methods ResTableDetailArea::ResTableDetailArea(ResTable* parent) : QTextBrowser(parent), m_table(parent) { setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(createPopupMenu(const QPoint&))); } void ResTableDetailArea::createPopupMenu(const QPoint& pos) { if (!m_table || m_table->m_detaildocnum < 0) { LOGDEB(("ResTableDetailArea::createPopupMenu: no table/detaildoc\n")); return; } QMenu *popup = new QMenu(this); popup->addAction(tr("&Preview"), m_table, SLOT(menuPreview())); popup->addAction(tr("&Open"), m_table, SLOT(menuEdit())); popup->addAction(tr("Copy &File Name"), m_table, SLOT(menuCopyFN())); popup->addAction(tr("Copy &URL"), m_table, SLOT(menuCopyURL())); if (!m_table->m_detaildoc.ipath.empty()) popup->addAction(tr("&Write to File"), m_table, SLOT(menuSaveToFile())); popup->addAction(tr("Find &similar documents"), m_table, SLOT(menuExpand())); popup->addAction(tr("Preview P&arent document/folder"), m_table, SLOT(menuPreviewParent())); popup->addAction(tr("&Open Parent document/folder"), m_table, SLOT(menuOpenParent())); popup->popup(mapToGlobal(pos)); } ////////////////////////////////////////////////////////////////////////////// //// Data model methods //// // Routines used to extract named data from an Rcl::Doc. The basic one // just uses the meta map. Others (ie: the date ones) need to do a // little processing static string gengetter(const string& fld, const Rcl::Doc& doc) { map::const_iterator it = doc.meta.find(fld); if (it == doc.meta.end()) { return string(); } return it->second; } static string sizegetter(const string& fld, const Rcl::Doc& doc) { map::const_iterator it = doc.meta.find(fld); if (it == doc.meta.end()) { return string(); } off_t size = atoll(it->second.c_str()); return displayableBytes(size) + " (" + it->second + ")"; } static string dategetter(const string&, const Rcl::Doc& doc) { char datebuf[100]; datebuf[0] = 0; if (!doc.dmtime.empty() || !doc.fmtime.empty()) { time_t mtime = doc.dmtime.empty() ? atol(doc.fmtime.c_str()) : atol(doc.dmtime.c_str()); struct tm *tm = localtime(&mtime); strftime(datebuf, 99, "%Y-%m-%d", tm); } return datebuf; } static string datetimegetter(const string&, const Rcl::Doc& doc) { char datebuf[100]; datebuf[0] = 0; if (!doc.dmtime.empty() || !doc.fmtime.empty()) { time_t mtime = doc.dmtime.empty() ? atol(doc.fmtime.c_str()) : atol(doc.dmtime.c_str()); struct tm *tm = localtime(&mtime); strftime(datebuf, 99, "%Y-%m-%d %H:%M:%S %z", tm); } return datebuf; } // Static map to translate from internal column names to displayable ones map RecollModel::o_displayableFields; FieldGetter *RecollModel::chooseGetter(const string& field) { if (!stringlowercmp("date", field)) return dategetter; else if (!stringlowercmp("datetime", field)) return datetimegetter; else if (!stringlowercmp("bytes", field.substr(1))) return sizegetter; else return gengetter; } string RecollModel::baseField(const string& field) { if (!stringlowercmp("date", field) || !stringlowercmp("datetime", field)) return "mtime"; else return field; } RecollModel::RecollModel(const QStringList fields, QObject *parent) : QAbstractTableModel(parent), m_ignoreSort(false) { // Initialize the translated map for column headers o_displayableFields["abstract"] = tr("Abstract"); o_displayableFields["author"] = tr("Author"); o_displayableFields["dbytes"] = tr("Document size"); o_displayableFields["dmtime"] = tr("Document date"); o_displayableFields["fbytes"] = tr("File size"); o_displayableFields["filename"] = tr("File name"); o_displayableFields["fmtime"] = tr("File date"); o_displayableFields["ipath"] = tr("Ipath"); o_displayableFields["keywords"] = tr("Keywords"); o_displayableFields["mtype"] = tr("MIME type"); o_displayableFields["origcharset"] = tr("Original character set"); o_displayableFields["relevancyrating"] = tr("Relevancy rating"); o_displayableFields["title"] = tr("Title"); o_displayableFields["url"] = tr("URL"); o_displayableFields["mtime"] = tr("Mtime"); o_displayableFields["date"] = tr("Date"); o_displayableFields["datetime"] = tr("Date and time"); // Add dynamic "stored" fields to the full column list. This // could be protected to be done only once, but it's no real // problem if (theconfig) { const set& stored = theconfig->getStoredFields(); for (set::const_iterator it = stored.begin(); it != stored.end(); it++) { if (o_displayableFields.find(*it) == o_displayableFields.end()) { o_displayableFields[*it] = QString::fromUtf8(it->c_str()); } } } // Construct the actual list of column names for (QStringList::const_iterator it = fields.begin(); it != fields.end(); it++) { m_fields.push_back((const char *)(it->toUtf8())); m_getters.push_back(chooseGetter(m_fields.back())); } g_hiliter.set_inputhtml(false); } int RecollModel::rowCount(const QModelIndex&) const { LOGDEB2(("RecollModel::rowCount\n")); if (m_source.isNull()) return 0; return m_source->getResCnt(); } int RecollModel::columnCount(const QModelIndex&) const { LOGDEB2(("RecollModel::columnCount\n")); return m_fields.size(); } void RecollModel::readDocSource() { LOGDEB(("RecollModel::readDocSource()\n")); reset(); } void RecollModel::setDocSource(RefCntr nsource) { LOGDEB(("RecollModel::setDocSource\n")); if (nsource.isNull()) { m_source = RefCntr(); } else { m_source = RefCntr(new DocSource(theconfig, nsource)); m_hdata.reset(); m_source->getTerms(m_hdata.terms, m_hdata.groups, m_hdata.gslks); } } void RecollModel::deleteColumn(int col) { if (col > 0 && col < int(m_fields.size())) { vector::iterator it = m_fields.begin(); it += col; m_fields.erase(it); vector::iterator it1 = m_getters.begin(); it1 += col; m_getters.erase(it1); readDocSource(); } } void RecollModel::addColumn(int col, const string& field) { LOGDEB(("AddColumn: col %d fld [%s]\n", col, field.c_str())); if (col >= 0 && col < int(m_fields.size())) { col++; vector::iterator it = m_fields.begin(); vector::iterator it1 = m_getters.begin(); if (col) { it += col; it1 += col; } m_fields.insert(it, field); m_getters.insert(it1, chooseGetter(field)); readDocSource(); } } QVariant RecollModel::headerData(int idx, Qt::Orientation orientation, int role) const { LOGDEB2(("RecollModel::headerData: idx %d orientation %s role %d\n", idx, orientation == Qt::Vertical ? "vertical":"horizontal", role)); if (orientation == Qt::Vertical && role == Qt::DisplayRole) { return idx; } if (orientation == Qt::Horizontal && role == Qt::DisplayRole && idx < int(m_fields.size())) { map::const_iterator it = o_displayableFields.find(m_fields[idx]); if (it == o_displayableFields.end()) return QString::fromUtf8(m_fields[idx].c_str()); else return it->second; } return QVariant(); } QVariant RecollModel::data(const QModelIndex& index, int role) const { LOGDEB2(("RecollModel::data: row %d col %d role %d\n", index.row(), index.column(), role)); if (m_source.isNull() || role != Qt::DisplayRole || !index.isValid() || index.column() >= int(m_fields.size())) { return QVariant(); } Rcl::Doc doc; if (!m_source->getDoc(index.row(), doc)) { return QVariant(); } string colname = m_fields[index.column()]; list lr; g_hiliter.plaintorich(m_getters[index.column()](colname, doc), lr, m_hdata); return QString::fromUtf8(lr.front().c_str()); } void RecollModel::saveAsCSV(FILE *fp) { if (m_source.isNull()) return; int cols = columnCount(); int rows = rowCount(); vector tokens; for (int col = 0; col < cols; col++) { QString qs = headerData(col, Qt::Horizontal,Qt::DisplayRole).toString(); tokens.push_back((const char *)qs.toUtf8()); } string csv; stringsToCSV(tokens, csv); fprintf(fp, "%s\n", csv.c_str()); tokens.clear(); for (int row = 0; row < rows; row++) { Rcl::Doc doc; if (!m_source->getDoc(row, doc)) { continue; } for (int col = 0; col < cols; col++) { tokens.push_back(m_getters[col](m_fields[col], doc)); } stringsToCSV(tokens, csv); fprintf(fp, "%s\n", csv.c_str()); tokens.clear(); } } // This gets called when the column headers are clicked void RecollModel::sort(int column, Qt::SortOrder order) { if (m_ignoreSort) return; LOGDEB(("RecollModel::sort(%d, %d)\n", column, int(order))); DocSeqSortSpec spec; if (column >= 0 && column < int(m_fields.size())) { spec.field = m_fields[column]; if (!stringlowercmp("date", spec.field) || !stringlowercmp("datetime", spec.field)) spec.field = "mtime"; spec.desc = order == Qt::AscendingOrder ? false : true; } emit sortDataChanged(spec); } /////////////////////////// // ResTable panel methods // We use a custom delegate to display the cells because the base // tableview's can't handle rich text to highlight the match terms class ResTableDelegate: public QStyledItemDelegate { public: ResTableDelegate(QObject *parent) : QStyledItemDelegate(parent) {} // We might want to optimize by passing the data to the base // method if the text does not contain any term matches. Would // need a modif to plaintorich to return the match count (easy), // and a way to pass an indicator from data(), a bit more // difficult. Anyway, the display seems fast enough as is. void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItemV4 opt = option; initStyleOption(&opt, index); QVariant value = index.data(Qt::DisplayRole); if (value.isValid() && !value.isNull()) { QString text = value.toString(); if (!text.isEmpty()) { QTextDocument document; painter->save(); if (opt.state & QStyle::State_Selected) { painter->fillRect(opt.rect, opt.palette.highlight()); // Set the foreground color. The pen approach does // not seem to work, probably it's reset by the // textdocument. Couldn't use // setdefaultstylesheet() either. the div thing is // an ugly hack. Works for now #if 0 QPen pen = painter->pen(); pen.setBrush(opt.palette.brush(QPalette::HighlightedText)); painter->setPen(pen); #else text = QString::fromAscii("

") + text + QString::fromAscii("
"); #endif } painter->setClipRect(option.rect); QPoint where = option.rect.topLeft(); where.ry() += TEXTINCELLVTRANS; painter->translate(where); document.setHtml(text); document.drawContents(painter); painter->restore(); return; } } QStyledItemDelegate::paint(painter, option, index); } }; void ResTable::init() { if (!(m_model = new RecollModel(prefs.restableFields))) return; tableView->setModel(m_model); tableView->setMouseTracking(true); tableView->setSelectionBehavior(QAbstractItemView::SelectRows); tableView->setSelectionMode(QAbstractItemView::SingleSelection); tableView->setItemDelegate(new ResTableDelegate(this)); tableView->setContextMenuPolicy(Qt::CustomContextMenu); connect(tableView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(createPopupMenu(const QPoint&))); QHeaderView *header = tableView->horizontalHeader(); if (header) { if (int(prefs.restableColWidths.size()) == header->count()) { for (int i = 0; i < header->count(); i++) { header->resizeSection(i, prefs.restableColWidths[i]); } } header->setSortIndicatorShown(true); header->setSortIndicator(-1, Qt::AscendingOrder); header->setContextMenuPolicy(Qt::CustomContextMenu); connect(header, SIGNAL(sectionResized(int,int,int)), this, SLOT(saveColState())); connect(header, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(createHeaderPopupMenu(const QPoint&))); } header->setMovable(true); header = tableView->verticalHeader(); if (header) { header->setDefaultSectionSize(QApplication::fontMetrics().height() + ROWHEIGHTPAD); } QKeySequence seq("Esc"); QShortcut *sc = new QShortcut(seq, this); connect(sc, SIGNAL (activated()), tableView->selectionModel(), SLOT (clear())); connect(tableView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex &)), this, SLOT(onTableView_currentChanged(const QModelIndex&))); m_pager = new ResTablePager(this); QSettings settings; QVariant saved = settings.value("resTableSplitterSizes"); if (saved != QVariant()) { splitter->restoreState(saved.toByteArray()); } else { QList sizes; sizes << 355 << 125; splitter->setSizes(sizes); } delete textBrowser; m_detail = new ResTableDetailArea(this); m_detail->setReadOnly(TRUE); m_detail->setUndoRedoEnabled(FALSE); m_detail->setOpenLinks(FALSE); // signals and slots connections connect(m_detail, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(linkWasClicked(const QUrl &))); splitter->addWidget(m_detail); splitter->setOrientation(Qt::Vertical); } int ResTable::getDetailDocNumOrTopRow() { if (m_detaildocnum >= 0) return m_detaildocnum; QModelIndex modelIndex = tableView->indexAt(QPoint(0, 0)); return modelIndex.row(); } void ResTable::makeRowVisible(int row) { LOGDEB(("ResTable::showRow(%d)\n", row)); QModelIndex modelIndex = m_model->index(row, 0); tableView->scrollTo(modelIndex, QAbstractItemView::PositionAtTop); tableView->selectionModel()->clear(); m_detail->clear(); m_detaildocnum = -1; } // This is called by rclmain_w prior to exiting void ResTable::saveColState() { QSettings settings; settings.setValue("resTableSplitterSizes", splitter->saveState()); QHeaderView *header = tableView->horizontalHeader(); const vector& vf = m_model->getFields(); if (!header) { LOGERR(("ResTable::saveColState: no table header ??\n")); return; } // Remember the current column order. Walk in visual order and // create new list QStringList newfields; vector newwidths; for (int vi = 0; vi < header->count(); vi++) { int li = header->logicalIndex(vi); if (li < 0 || li >= int(vf.size())) { LOGERR(("saveColState: logical index beyond list size!\n")); continue; } newfields.push_back(QString::fromUtf8(vf[li].c_str())); newwidths.push_back(header->sectionSize(li)); } prefs.restableFields = newfields; prefs.restableColWidths = newwidths; } void ResTable::onTableView_currentChanged(const QModelIndex& index) { LOGDEB2(("ResTable::onTableView_currentChanged(%d, %d)\n", index.row(), index.column())); if (!m_model || m_model->getDocSource().isNull()) return; Rcl::Doc doc; if (m_model->getDocSource()->getDoc(index.row(), doc)) { m_detail->clear(); m_detaildocnum = index.row(); m_detaildoc = doc; m_pager->displayDoc(theconfig, index.row(), doc, m_model->m_hdata); } else { m_detaildocnum = -1; } } void ResTable::on_tableView_entered(const QModelIndex& index) { LOGDEB2(("ResTable::on_tableView_entered(%d, %d)\n", index.row(), index.column())); if (!tableView->selectionModel()->hasSelection()) onTableView_currentChanged(index); } void ResTable::setDocSource(RefCntr nsource) { LOGDEB(("ResTable::setDocSource\n")); if (m_model) m_model->setDocSource(nsource); if (m_pager) m_pager->setDocSource(nsource, 0); if (m_detail) m_detail->clear(); m_detaildocnum = -1; } void ResTable::resetSource() { LOGDEB(("ResTable::resetSource\n")); setDocSource(RefCntr()); } void ResTable::saveAsCSV() { LOGDEB(("ResTable::saveAsCSV\n")); if (!m_model) return; QString s = QFileDialog::getSaveFileName(this, //parent tr("Save table to CSV file"), QString::fromLocal8Bit(path_home().c_str()) ); const char *tofile = s.toLocal8Bit(); FILE *fp = fopen(tofile, "w"); if (fp == 0) { QMessageBox::warning(0, "Recoll", tr("Can't open/create file: ") + s); return; } m_model->saveAsCSV(fp); fclose(fp); } // This is called when the sort order is changed from another widget void ResTable::onSortDataChanged(DocSeqSortSpec spec) { LOGDEB(("ResTable::onSortDataChanged: [%s] desc %d\n", spec.field.c_str(), int(spec.desc))); QHeaderView *header = tableView->horizontalHeader(); if (!header || !m_model) return; // Check if the specified field actually matches one of columns // and set indicator m_model->setIgnoreSort(true); bool matched = false; const vector fields = m_model->getFields(); for (unsigned int i = 0; i < fields.size(); i++) { if (!spec.field.compare(m_model->baseField(fields[i]))) { header->setSortIndicator(i, spec.desc ? Qt::DescendingOrder : Qt::AscendingOrder); matched = true; } } if (!matched) header->setSortIndicator(-1, Qt::AscendingOrder); m_model->setIgnoreSort(false); } void ResTable::resetSort() { LOGDEB(("ResTable::resetSort()\n")); QHeaderView *header = tableView->horizontalHeader(); if (header) header->setSortIndicator(-1, Qt::AscendingOrder); // the model's sort slot is not called by qt in this case (qt 4.7) if (m_model) m_model->sort(-1, Qt::AscendingOrder); } void ResTable::readDocSource(bool resetPos) { LOGDEB(("ResTable::readDocSource(%d)\n", int(resetPos))); if (resetPos) tableView->verticalScrollBar()->setSliderPosition(0); m_model->readDocSource(); m_detail->clear(); m_detaildocnum = -1; } void ResTable::linkWasClicked(const QUrl &url) { if (m_detaildocnum < 0) { return; } QString s = url.toString(); const char *ascurl = s.toAscii(); LOGDEB(("ResTable::linkWasClicked: [%s]\n", ascurl)); int i = atoi(ascurl+1) -1; int what = ascurl[0]; switch (what) { case 'P': case 'E': { if (what == 'P') emit docPreviewClicked(i, m_detaildoc, 0); else emit docEditClicked(m_detaildoc); } break; default: LOGERR(("ResTable::linkWasClicked: bad link [%s]\n", ascurl)); break;// ?? } } void ResTable::createPopupMenu(const QPoint& pos) { LOGDEB(("ResTable::createPopupMenu: m_detaildocnum %d\n", m_detaildocnum)); if (m_detaildocnum < 0) return; QMenu *popup = new QMenu(this); popup->addAction(tr("&Preview"), this, SLOT(menuPreview())); popup->addAction(tr("&Open"), this, SLOT(menuEdit())); popup->addAction(tr("Copy &File Name"), this, SLOT(menuCopyFN())); popup->addAction(tr("Copy &URL"), this, SLOT(menuCopyURL())); if (m_detaildoc.ipath.empty()) popup->addAction(tr("&Write to File"), this, SLOT(menuSaveToFile())); popup->addAction(tr("Find &similar documents"), this, SLOT(menuExpand())); popup->addAction(tr("Preview P&arent document/folder"), this, SLOT(menuPreviewParent())); popup->addAction(tr("&Open Parent document/folder"), this, SLOT(menuOpenParent())); popup->popup(mapToGlobal(pos)); } void ResTable::menuPreview() { if (m_detaildocnum < 0) return; emit docPreviewClicked(m_detaildocnum, m_detaildoc, 0); } void ResTable::menuSaveToFile() { if (m_detaildocnum < 0) return; emit docSaveToFileClicked(m_detaildoc); } void ResTable::menuPreviewParent() { if (!m_model || m_detaildocnum < 0) return; RefCntr source = m_model->getDocSource(); if (source.isNull()) return; Rcl::Doc& doc = m_detaildoc; Rcl::Doc pdoc; if (source->getEnclosing(doc, pdoc)) { emit previewRequested(pdoc); } else { // No parent doc: show enclosing folder with app configured for // directories pdoc.url = path_getfather(doc.url); pdoc.mimetype = "application/x-fsdirectory"; emit editRequested(pdoc); } } void ResTable::menuOpenParent() { if (!m_model || m_detaildocnum < 0) return; RefCntr source = m_model->getDocSource(); if (source.isNull()) return; Rcl::Doc& doc = m_detaildoc; Rcl::Doc pdoc; if (source->getEnclosing(doc, pdoc)) { emit editRequested(pdoc); } else { // No parent doc: show enclosing folder with app configured for // directories pdoc.url = path_getfather(doc.url); pdoc.mimetype = "application/x-fsdirectory"; emit editRequested(pdoc); } } void ResTable::menuEdit() { if (m_detaildocnum < 0) return; emit docEditClicked(m_detaildoc); } void ResTable::menuCopyFN() { if (m_detaildocnum < 0) return; Rcl::Doc &doc = m_detaildoc; // Our urls currently always begin with "file://" // // Problem: setText expects a QString. Passing a (const char*) // as we used to do causes an implicit conversion from // latin1. File are binary and the right approach would be no // conversion, but it's probably better (less worse...) to // make a "best effort" tentative and try to convert from the // locale's charset than accept the default conversion. QString qfn = QString::fromLocal8Bit(doc.url.c_str()+7); QApplication::clipboard()->setText(qfn, QClipboard::Selection); QApplication::clipboard()->setText(qfn, QClipboard::Clipboard); } void ResTable::menuCopyURL() { if (m_detaildocnum < 0) return; Rcl::Doc &doc = m_detaildoc; string url = url_encode(doc.url, 7); QApplication::clipboard()->setText(url.c_str(), QClipboard::Selection); QApplication::clipboard()->setText(url.c_str(), QClipboard::Clipboard); } void ResTable::menuExpand() { if (m_detaildocnum < 0) return; emit docExpand(m_detaildoc); } void ResTable::createHeaderPopupMenu(const QPoint& pos) { LOGDEB(("ResTable::createHeaderPopupMenu(%d, %d)\n", pos.x(), pos.y())); QHeaderView *header = tableView->horizontalHeader(); if (!header || !m_model) return; m_popcolumn = header->logicalIndexAt(pos); if (m_popcolumn < 0) return; const map& allfields = m_model->getAllFields(); const vector& fields = m_model->getFields(); QMenu *popup = new QMenu(this); popup->addAction(tr("&Reset sort"), this, SLOT(resetSort())); popup->addSeparator(); popup->addAction(tr("&Save as CSV"), this, SLOT(saveAsCSV())); popup->addSeparator(); popup->addAction(tr("&Delete column"), this, SLOT(deleteColumn())); popup->addSeparator(); QAction *act; for (map::const_iterator it = allfields.begin(); it != allfields.end(); it++) { if (std::find(fields.begin(), fields.end(), it->first) != fields.end()) continue; act = new QAction(tr("Add \"%1\" column").arg(it->second), popup); act->setData(QString::fromUtf8(it->first.c_str())); connect(act, SIGNAL(triggered(bool)), this , SLOT(addColumn())); popup->addAction(act); } popup->popup(mapToGlobal(pos)); } void ResTable::deleteColumn() { if (m_model) m_model->deleteColumn(m_popcolumn); } void ResTable::addColumn() { if (!m_model) return; QAction *action = (QAction *)sender(); LOGDEB(("addColumn: text %s, data %s\n", (const char *)action->text().toUtf8(), (const char *)action->data().toString().toUtf8() )); string field((const char *)action->data().toString().toUtf8()); m_model->addColumn(m_popcolumn, field); } recoll-1.17.3/qtgui/restable.h000644 001750 000000 00000011703 11740755063 016601 0ustar00dockeswheel000000 000000 /* 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 _RESTABLE_H_INCLUDED_ #define _RESTABLE_H_INCLUDED_ #include #include "ui_restable.h" #include "refcntr.h" #include "docseq.h" #include "plaintorich.h" class ResTable; typedef string (FieldGetter)(const string& fldname, const Rcl::Doc& doc); class RecollModel : public QAbstractTableModel { Q_OBJECT public: RecollModel(const QStringList fields, QObject *parent = 0); // Reimplemented methods virtual int rowCount (const QModelIndex& = QModelIndex()) const; virtual int columnCount(const QModelIndex& = QModelIndex()) const; virtual QVariant headerData (int col, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole ) const; virtual void saveAsCSV(FILE *fp); virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); // Specific methods virtual void readDocSource(); virtual void setDocSource(RefCntr nsource); virtual RefCntr getDocSource() {return m_source;} virtual void deleteColumn(int); virtual const vector& getFields() {return m_fields;} virtual const map& getAllFields() { return o_displayableFields; } virtual void addColumn(int, const string&); // Some column name are aliases/translator for base document field // (ie: date, datetime->mtime). Help deal with this: virtual string baseField(const string&); // Ignore sort() call because virtual void setIgnoreSort(bool onoff) {m_ignoreSort = onoff;} friend class ResTable; signals: void sortDataChanged(DocSeqSortSpec); private: mutable RefCntr m_source; vector m_fields; vector m_getters; static map o_displayableFields; bool m_ignoreSort; FieldGetter* chooseGetter(const string&); HiliteData m_hdata; }; class ResTable; // Modified textBrowser for the detail area class ResTableDetailArea : public QTextBrowser { Q_OBJECT; public: ResTableDetailArea(ResTable* parent = 0); public slots: virtual void createPopupMenu(const QPoint& pos); private: ResTable *m_table; }; class ResTablePager; class QUrl; class ResTable : public QWidget, public Ui::ResTable { Q_OBJECT public: ResTable(QWidget* parent = 0) : QWidget(parent), m_model(0), m_pager(0), m_detail(0), m_detaildocnum(-1) { setupUi(this); init(); } virtual ~ResTable() {} virtual RecollModel *getModel() {return m_model;} virtual ResTableDetailArea* getDetailArea() {return m_detail;} virtual int getDetailDocNumOrTopRow(); public slots: virtual void onTableView_currentChanged(const QModelIndex&); virtual void on_tableView_entered(const QModelIndex& index); virtual void setDocSource(RefCntr nsource); virtual void saveColState(); virtual void resetSource(); virtual void readDocSource(bool resetPos = true); virtual void onSortDataChanged(DocSeqSortSpec); virtual void createPopupMenu(const QPoint& pos); virtual void menuPreview(); virtual void menuSaveToFile(); virtual void menuEdit(); virtual void menuCopyFN(); virtual void menuCopyURL(); virtual void menuExpand(); virtual void menuPreviewParent(); virtual void menuOpenParent(); virtual void createHeaderPopupMenu(const QPoint&); virtual void deleteColumn(); virtual void addColumn(); virtual void resetSort(); // Revert to natural (relevance) order virtual void saveAsCSV(); virtual void linkWasClicked(const QUrl&); virtual void makeRowVisible(int row); signals: void docPreviewClicked(int, Rcl::Doc, int); void docEditClicked(Rcl::Doc); void docSaveToFileClicked(Rcl::Doc); void previewRequested(Rcl::Doc); void editRequested(Rcl::Doc); void headerClicked(); void docExpand(Rcl::Doc); friend class ResTablePager; friend class ResTableDetailArea; private: void init(); RecollModel *m_model; ResTablePager *m_pager; ResTableDetailArea *m_detail; int m_detaildocnum; Rcl::Doc m_detaildoc; int m_popcolumn; }; #endif /* _RESTABLE_H_INCLUDED_ */ recoll-1.17.3/qtgui/restable.ui000644 001750 000000 00000003607 11740755063 016773 0ustar00dockeswheel000000 000000 ResTable 0 0 640 480 0 0 Qt::Vertical 0 2 QAbstractItemView::NoEditTriggers false true true false false false false 0 0 recoll-1.17.3/qtgui/rtitool.cpp000644 001750 000000 00000011637 11740755063 017035 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #include #include #include #include #include using std::string; #include #include #include "recoll.h" #include "rtitool.h" #include "smallut.h" #include "pathut.h" #include "copyfile.h" #include "readfile.h" #include "execmd.h" static const char *rautostartfile = ".config/autostart/recollindex.desktop"; // Just in case we don't find the file in the shared dir, have a // default text ready static const char *desktopfiletext = "[Desktop Entry]\n" "Name=Recoll real time indexer\n" "Comment=Runs in background to extract and index text from modified " "documents\n" "Icon=system-run\n" "Exec=recollindex -w 60 -m\n" "Terminal=false\n" "TerminalOptions=\n" "Type=Application\n" "Categories=Utility;Filesystem;Database;\n" "NoDisplay=true\n" "X-GNOME-Autostart-enabled=true\n" "X-KDE-autostart-after=panel\n" "X-KDE-UniqueApplet=true\n" ; void RTIToolW::init() { connect(this->sesCB, SIGNAL(clicked(bool)), this, SLOT(sesclicked(bool))); string autostartfile = path_cat(path_home(), rautostartfile); if (access(autostartfile.c_str(), 0) == 0) { sesCB->setChecked(true); } } void RTIToolW::sesclicked(bool on) { nowCB->setEnabled(on); if (!on) nowCB->setChecked(false); } void RTIToolW::accept() { bool exitdial = false; string autostartfile = path_cat(path_home(), rautostartfile); if (sesCB->isChecked()) { // Setting up daemon indexing autostart if (::access(autostartfile.c_str(), 0) == 0) { QString msg = tr("Replacing: ") + QString::fromLocal8Bit(autostartfile.c_str()); QMessageBox::Button rep = QMessageBox::question(this, tr("Replacing file"), msg, QMessageBox::Ok | QMessageBox::Cancel); if (rep != QMessageBox::Ok) { goto out; } } string text; if (theconfig) { string sourcefile = path_cat(theconfig->getDatadir(), "examples"); sourcefile = path_cat(sourcefile, "recollindex.desktop"); if (::access(sourcefile.c_str(), 0) == 0) { file_to_string(sourcefile, text); } } if (text.empty()) text = desktopfiletext; // Try to create .config and autostart anyway. If they exists this will // do nothing. An error will be detected when we try to create the file string dir = path_cat(path_home(), ".config"); mkdir(dir.c_str(), 0700); dir = path_cat(dir, "autostart"); mkdir(dir.c_str(), 0700); int fd = ::open(autostartfile.c_str(), O_WRONLY|O_CREAT, 0644); if (fd < 0 || ::write(fd, text.c_str(), size_t(text.size())) != ssize_t(text.size()) || ::close(fd) != 0) { if (fd >=0) ::close(fd); QString msg = tr("Can't create: ") + QString::fromLocal8Bit(autostartfile.c_str()); QMessageBox::warning(0, tr("Warning"), msg, QMessageBox::Ok); return; } ::close(fd); if (nowCB->isChecked()) { ExecCmd cmd; list args; int status; args.push_back("-m"); args.push_back("-w"); args.push_back("0"); status = cmd.doexec("recollindex", args, 0, 0); if (status) { QMessageBox::warning(0, tr("Warning"), tr("Could not execute recollindex"), QMessageBox::Ok); goto out; } } exitdial = true; } else { // Turning autostart off if (::access(autostartfile.c_str(), 0) == 0) { QString msg = tr("Deleting: ") + QString::fromLocal8Bit(autostartfile.c_str()); QMessageBox::Button rep = QMessageBox::question(this, tr("Deleting file"), msg, QMessageBox::Ok | QMessageBox::Cancel); if (rep == QMessageBox::Ok) { exitdial = true; unlink(autostartfile.c_str()); if (theconfig) { Pidfile pidfile(theconfig->getPidfile()); pid_t pid; if ((pid = pidfile.open()) != 0) { QMessageBox::Button rep = QMessageBox::question(this, tr("Removing autostart"), tr("Autostart file deleted. Kill current process too ?"), QMessageBox::Yes | QMessageBox::No); if (rep == QMessageBox::Yes) { kill(pid, SIGTERM); } } } } } else { exitdial = true; } } out: if (exitdial) QDialog::accept(); } recoll-1.17.3/qtgui/rtitool.h000644 001750 000000 00000002204 11740755063 016470 0ustar00dockeswheel000000 000000 /* * 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 _RTITOOL_W_H_INCLUDED_ #define _RTITOOL_W_H_INCLUDED_ #include "ui_rtitool.h" class QPushButton; class RTIToolW : public QDialog, public Ui::RTIToolW { Q_OBJECT public: RTIToolW(QWidget * parent = 0) : QDialog(parent) { setupUi(this); init(); } public slots: void sesclicked(bool); void accept(); private: void init(); }; #endif /* _RTITOOL_W_H_INCLUDED_ */ recoll-1.17.3/qtgui/rtitool.ui000644 001750 000000 00000007545 11740755063 016673 0ustar00dockeswheel000000 000000 RTIToolW 0 0 423 207 Real time indexing automatic start <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> true Start indexing daemon with my desktop session. Qt::Horizontal 28 20 false 1 0 Also start indexing daemon right now. Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() RTIToolW accept() 204 159 204 90 buttonBox rejected() RTIToolW reject() 204 159 204 90 recoll-1.17.3/qtgui/searchclause_w.cpp000644 001750 000000 00000010554 11740755063 020326 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 "recoll.h" #include "searchclause_w.h" #include #include #include #include #include #include #include /* * Constructs a SearchClauseW as a child of 'parent', with the * name 'name' and widget flags set to 'f'. */ SearchClauseW::SearchClauseW(QWidget* parent) : QWidget(parent) { QHBoxLayout* hLayout = new QHBoxLayout(this); sTpCMB = new QComboBox(this); sTpCMB->setEditable(false); hLayout->addWidget(sTpCMB); fldCMB = new QComboBox(this); fldCMB->setEditable(false); hLayout->addWidget(fldCMB); proxSlackSB = new QSpinBox(this); hLayout->addWidget(proxSlackSB); wordsLE = new QLineEdit(this); wordsLE->setMinimumSize(QSize(190, 0)); hLayout->addWidget(wordsLE); languageChange(); resize(QSize(0, 0).expandedTo(minimumSizeHint())); connect(sTpCMB, SIGNAL(activated(int)), this, SLOT(tpChange(int))); } /* * Destroys the object and frees any allocated resources */ SearchClauseW::~SearchClauseW() { // no need to delete child widgets, Qt does it all for us } /* * Sets the strings of the subwidgets using the current * language. */ void SearchClauseW::languageChange() { sTpCMB->clear(); sTpCMB->addItem(tr("Any")); // 0 sTpCMB->addItem(tr("All")); //1 sTpCMB->addItem(tr("None"));//2 sTpCMB->addItem(tr("Phrase"));//3 sTpCMB->addItem(tr("Proximity"));//4 sTpCMB->addItem(tr("File name"));//5 // sTpCMB->insertItem(tr("Complex clause"));//6 fldCMB->addItem(tr("No field")); if (theconfig) { set fields = theconfig->getIndexedFields(); for (set::const_iterator it = fields.begin(); it != fields.end(); it++) { // Some fields don't make sense here if (it->compare("filename")) { fldCMB->addItem(QString::fromUtf8(it->c_str())); } } } // Ensure that the spinbox will be enabled/disabled depending on // combobox state tpChange(0); sTpCMB->setToolTip(tr("Select the type of query that will be performed with the words")); proxSlackSB->setToolTip(tr("Number of additional words that may be interspersed with the chosen ones")); } using namespace Rcl; // Translate my window state into an Rcl search clause SearchDataClause * SearchClauseW::getClause() { if (wordsLE->text().isEmpty()) return 0; string field; if (fldCMB->currentIndex() != 0) { field = (const char *)fldCMB->currentText().toUtf8(); } string text = (const char *)wordsLE->text().toUtf8(); switch (sTpCMB->currentIndex()) { case 0: return new SearchDataClauseSimple(SCLT_OR, text, field); case 1: return new SearchDataClauseSimple(SCLT_AND, text, field); case 2: return new SearchDataClauseSimple(SCLT_EXCL, text, field); case 3: return new SearchDataClauseDist(SCLT_PHRASE, text, proxSlackSB->value(), field); case 4: return new SearchDataClauseDist(SCLT_NEAR, text, proxSlackSB->value(), field); case 5: return new SearchDataClauseFilename(text); case 6: default: return 0; } } // Handle combobox change: may need to enable/disable the distance // spinbox and field spec void SearchClauseW::tpChange(int index) { if (index < 0 || index > 5) return; if (sTpCMB->currentIndex() != index) sTpCMB->setCurrentIndex(index); switch (index) { case 3: case 4: proxSlackSB->show(); proxSlackSB->setEnabled(true); if (index == 4) proxSlackSB->setValue(10); break; default: proxSlackSB->close(); } if (index == 5) { fldCMB->close(); } else { fldCMB->show(); } } recoll-1.17.3/qtgui/searchclause_w.h000644 001750 000000 00000002645 11740755063 017775 0ustar00dockeswheel000000 000000 /* * 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 SEARCHCLAUSE_H #define SEARCHCLAUSE_H // A class for entry of a search clause: type (OR/AND/etc.), distance // for PHRASE or NEAR, and text #include #include #include "searchdata.h" class QVBoxLayout; class QHBoxLayout; class QComboBox; class QSpinBox; class QLineEdit; class SearchClauseW : public QWidget { Q_OBJECT public: SearchClauseW(QWidget* parent = 0); ~SearchClauseW(); Rcl::SearchDataClause *getClause(); QComboBox* sTpCMB; QComboBox* fldCMB; QSpinBox* proxSlackSB; QLineEdit* wordsLE; public slots: virtual void tpChange(int); protected slots: virtual void languageChange(); }; #endif // SEARCHCLAUSE_H recoll-1.17.3/qtgui/spell.ui000644 001750 000000 00000007003 11740755063 016303 0ustar00dockeswheel000000 000000 SpellBase 0 0 400 450 0 0 100 100 Term Explorer 100 0 false Qt::NoFocus &Expand Alt+E true Qt::NoFocus &Close Alt+C 7 No db info. 2 2 false false baseWordLE expandPB dismissPB expTypeCMB stemLangCMB recoll-1.17.3/qtgui/spell_w.cpp000644 001750 000000 00000020525 11740755063 017002 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "debuglog.h" #include "recoll.h" #include "spell_w.h" #include "guiutils.h" #include "rcldb.h" #include "rclhelp.h" #ifdef RCL_USE_ASPELL #include "rclaspell.h" #endif void SpellW::init() { // Don't change the order, or fix the rest of the code... /*0*/expTypeCMB->addItem(tr("Wildcards")); /*1*/expTypeCMB->addItem(tr("Regexp")); /*2*/expTypeCMB->addItem(tr("Stem expansion")); #ifdef RCL_USE_ASPELL bool noaspell = false; theconfig->getConfParam("noaspell", &noaspell); if (!noaspell) /*3*/expTypeCMB->addItem(tr("Spelling/Phonetic")); #endif int typ = prefs.termMatchType; if (typ < 0 || typ > expTypeCMB->count()) typ = 0; expTypeCMB->setCurrentIndex(typ); // Stemming language combobox stemLangCMB->clear(); list langs; if (!getStemLangs(langs)) { QMessageBox::warning(0, "Recoll", tr("error retrieving stemming languages")); } for (list::const_iterator it = langs.begin(); it != langs.end(); it++) { stemLangCMB-> addItem(QString::fromAscii(it->c_str(), it->length())); } stemLangCMB->setEnabled(expTypeCMB->currentIndex()==2); (void)new HelpClient(this); HelpClient::installMap((const char *)this->objectName().toUtf8(), "RCL.SEARCH.TERMEXPLORER"); // signals and slots connections connect(baseWordLE, SIGNAL(textChanged(const QString&)), this, SLOT(wordChanged(const QString&))); connect(baseWordLE, SIGNAL(returnPressed()), this, SLOT(doExpand())); connect(expandPB, SIGNAL(clicked()), this, SLOT(doExpand())); connect(dismissPB, SIGNAL(clicked()), this, SLOT(close())); connect(expTypeCMB, SIGNAL(activated(int)), this, SLOT(modeSet(int))); QStringList labels(tr("Term")); labels.push_back(tr("Doc. / Tot.")); resTW->setHorizontalHeaderLabels(labels); resTW->setShowGrid(0); resTW->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch); resTW->verticalHeader()->setDefaultSectionSize(20); connect(resTW, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(textDoubleClicked(int, int))); resTW->setColumnWidth(0, 200); resTW->setColumnWidth(1, 150); resTW->installEventFilter(this); } /* Expand term according to current mode */ void SpellW::doExpand() { // Can't clear qt4 table widget: resets column headers too resTW->setRowCount(0); if (baseWordLE->text().isEmpty()) return; string reason; if (!maybeOpenDb(reason)) { LOGDEB(("SpellW::doExpand: db error: %s\n", reason.c_str())); return; } string expr = string((const char *)baseWordLE->text().toUtf8()); list suggs; prefs.termMatchType = expTypeCMB->currentIndex(); Rcl::Db::MatchType mt = Rcl::Db::ET_WILD; switch(expTypeCMB->currentIndex()) { case 0: mt = Rcl::Db::ET_WILD; break; case 1:mt = Rcl::Db::ET_REGEXP; break; case 2:mt = Rcl::Db::ET_STEM; break; } Rcl::TermMatchResult res; switch (expTypeCMB->currentIndex()) { case 0: case 1: case 2: { string l_stemlang = (const char*)stemLangCMB->currentText().toAscii(); if (!rcldb->termMatch(mt, l_stemlang, expr, res, 200)) { LOGERR(("SpellW::doExpand:rcldb::termMatch failed\n")); return; } statsLBL->setText(tr("Index: %1 documents, average length %2 terms") .arg(res.dbdoccount).arg(res.dbavgdoclen, 0, 'f', 1)); } break; #ifdef RCL_USE_ASPELL case 3: { LOGDEB(("SpellW::doExpand: aspelling\n")); if (!aspell) { QMessageBox::warning(0, "Recoll", tr("Aspell init failed. " "Aspell not installed?")); LOGDEB(("SpellW::doExpand: aspell init error\n")); return; } list suggs; if (!aspell->suggest(*rcldb, expr, suggs, reason)) { QMessageBox::warning(0, "Recoll", tr("Aspell expansion error. ")); LOGERR(("SpellW::doExpand:suggest failed: %s\n", reason.c_str())); } for (list::const_iterator it = suggs.begin(); it != suggs.end(); it++) res.entries.push_back(Rcl::TermMatchEntry(*it)); #ifdef TESTING_XAPIAN_SPELL string rclsugg = rcldb->getSpellingSuggestion(expr); if (!rclsugg.empty()) { res.entries.push_back(Rcl::TermMatchEntry("Xapian spelling:")); res.entries.push_back(Rcl::TermMatchEntry(rclsugg)); } #endif // TESTING_XAPIAN_SPELL } #endif } if (res.entries.empty()) { resTW->setItem(0, 0, new QTableWidgetItem(tr("No expansion found"))); } else { int row = 0; for (list::iterator it = res.entries.begin(); it != res.entries.end(); it++) { LOGDEB(("SpellW::expand: %6d [%s]\n", it->wcf, it->term.c_str())); char num[30]; if (it->wcf) sprintf(num, "%d / %d", it->docs, it->wcf); else num[0] = 0; if (resTW->rowCount() <= row) resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(QString::fromUtf8(it->term.c_str()))); resTW->setItem(row++, 1, new QTableWidgetItem(QString::fromAscii(num))); } resTW->setRowCount(row+1); } } void SpellW::wordChanged(const QString &text) { if (text.isEmpty()) { expandPB->setEnabled(false); resTW->setRowCount(0); } else { expandPB->setEnabled(true); } } void SpellW::textDoubleClicked() {} void SpellW::textDoubleClicked(int row, int) { QTableWidgetItem *item = resTW->item(row, 0); if (item) emit(wordSelect(item->text())); } void SpellW::modeSet(int mode) { if (mode == 2) stemLangCMB->setEnabled(true); else stemLangCMB->setEnabled(false); } void SpellW::copy() { QItemSelectionModel * selection = resTW->selectionModel(); QModelIndexList indexes = selection->selectedIndexes(); if(indexes.size() < 1) return; // QModelIndex::operator < sorts first by row, then by column. // this is what we need std::sort(indexes.begin(), indexes.end()); // You need a pair of indexes to find the row changes QModelIndex previous = indexes.first(); indexes.removeFirst(); QString selected_text; QModelIndex current; Q_FOREACH(current, indexes) { QVariant data = resTW->model()->data(previous); QString text = data.toString(); // At this point `text` contains the text in one cell selected_text.append(text); // If you are at the start of the row the row number of the previous index // isn't the same. Text is followed by a row separator, which is a newline. if (current.row() != previous.row()) { selected_text.append(QLatin1Char('\n')); } // Otherwise it's the same row, so append a column separator, which is a tab. else { selected_text.append(QLatin1Char('\t')); } previous = current; } // add last element selected_text.append(resTW->model()->data(current).toString()); selected_text.append(QLatin1Char('\n')); qApp->clipboard()->setText(selected_text, QClipboard::Selection); qApp->clipboard()->setText(selected_text, QClipboard::Clipboard); } bool SpellW::eventFilter(QObject *target, QEvent *event) { if (event->type() != QEvent::KeyPress || (target != resTW && target != resTW->viewport())) return false; QKeyEvent *keyEvent = (QKeyEvent *)event; if(keyEvent->matches(QKeySequence::Copy) ) { copy(); return true; } return false; } recoll-1.17.3/qtgui/spell_w.h000644 001750 000000 00000002711 11740755063 016444 0ustar00dockeswheel000000 000000 /* 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 _ASPELL_W_H_INCLUDED_ #define _ASPELL_W_H_INCLUDED_ #include #include #include "ui_spell.h" class SpellW : public QWidget, public Ui::SpellBase { Q_OBJECT public: SpellW(QWidget* parent = 0) : QWidget(parent) { setupUi(this); init(); } ~SpellW(){} virtual bool eventFilter(QObject *target, QEvent *event ); public slots: virtual void doExpand(); virtual void wordChanged(const QString&); virtual void textDoubleClicked(); virtual void textDoubleClicked(int, int); virtual void modeSet(int); signals: void wordSelect(QString); private: void init(); void copy(); }; #endif /* _ASPELL_W_H_INCLUDED_ */ recoll-1.17.3/qtgui/ssearch_w.cpp000644 001750 000000 00000037453 11740755063 017323 0ustar00dockeswheel000000 000000 /* 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 #include #include #include #include #include #include #include "debuglog.h" #include "guiutils.h" #include "searchdata.h" #include "ssearch_w.h" #include "refcntr.h" #include "textsplit.h" #include "wasatorcl.h" #include "rclhelp.h" void SSearch::init() { // See enum above and keep in order ! searchTypCMB->addItem(tr("Any term")); searchTypCMB->addItem(tr("All terms")); searchTypCMB->addItem(tr("File name")); searchTypCMB->addItem(tr("Query language")); // We'd like to use QComboBox::InsertAtTop but it doesn't do lru // (existing item stays at its place instead of jumping at top) queryText->setInsertPolicy(QComboBox::NoInsert); queryText->addItems(prefs.ssearchHistory); queryText->setEditText(""); connect(queryText->lineEdit(), SIGNAL(returnPressed()), this, SLOT(startSimpleSearch())); connect(queryText->lineEdit(), SIGNAL(textChanged(const QString&)), this, SLOT(searchTextChanged(const QString&))); connect(clearqPB, SIGNAL(clicked()), queryText->lineEdit(), SLOT(clear())); connect(searchPB, SIGNAL(clicked()), this, SLOT(startSimpleSearch())); connect(searchTypCMB, SIGNAL(activated(int)), this, SLOT(searchTypeChanged(int))); queryText->installEventFilter(this); m_escape = false; } void SSearch::searchTextChanged(const QString& text) { if (text.isEmpty()) { searchPB->setEnabled(false); clearqPB->setEnabled(false); emit clearSearch(); } else { searchPB->setEnabled(true); clearqPB->setEnabled(true); } } void SSearch::searchTypeChanged(int typ) { LOGDEB(("Search type now %d\n", typ)); // Adjust context help if (typ == SST_LANG) HelpClient::installMap((const char *)this->objectName().toUtf8(), "RCL.SEARCH.LANG"); else HelpClient::installMap((const char *)this->objectName().toUtf8(), "RCL.SEARCH.SIMPLE"); // Also fix tooltips switch (typ) { case SST_LANG: queryText->setToolTip(tr( "Enter query language expression. Cheat sheet:
\n" "term1 term2 : 'term1' and 'term2' in any field.
\n" "field:term1 : 'term1' in field 'field'.
\n" " Standard field names/synonyms:
\n" " title/subject/caption, author/from, recipient/to, filename, ext.
\n" " Pseudo-fields: dir, mime/format, type/rclcat, date.
\n" " Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
\n" "term1 term2 OR term3 : term1 AND (term2 OR term3).
\n" " No actual parentheses allowed.
\n" "\"term1 term2\" : phrase (must occur exactly). Possible modifiers:
\n" "\"term1 term2\"p : unordered proximity search with default distance.
\n" "Use Show Query link when in doubt about result and see manual (<F1>) for more detail.\n" )); break; case SST_FNM: queryText->setToolTip(tr("Enter file name wildcard expression.")); break; case SST_ANY: case SST_ALL: default: queryText->setToolTip(tr( "Enter search terms here. Type ESC SPC for completions of current term." )); } } void SSearch::startSimpleSearch() { if (queryText->currentText().length() == 0) return; string u8 = (const char *)queryText->currentText().toUtf8(); LOGDEB(("SSearch::startSimpleSearch: [%s]\n", u8.c_str())); trimstring(u8); if (u8.length() == 0) return; SSearchType tp = (SSearchType)searchTypCMB->currentIndex(); Rcl::SearchData *sdata = 0; if (tp == SST_LANG) { string reason; if (prefs.autoSuffsEnable) sdata = wasaStringToRcl(theconfig, u8, reason, (const char *)prefs.autoSuffs.toUtf8()); else sdata = wasaStringToRcl(theconfig, u8, reason); if (sdata == 0) { QMessageBox::warning(0, "Recoll", tr("Bad query string") + ": " + QString::fromAscii(reason.c_str())); return; } } else { sdata = new Rcl::SearchData(Rcl::SCLT_OR); if (sdata == 0) { QMessageBox::warning(0, "Recoll", tr("Out of memory")); return; } Rcl::SearchDataClause *clp = 0; if (tp == SST_FNM) { clp = new Rcl::SearchDataClauseFilename(u8); } else if (!TextSplit::hasVisibleWhite(u8)) { // If there is no white space inside the query, then the user // certainly means it as a phrase. clp = new Rcl::SearchDataClauseDist(Rcl::SCLT_PHRASE, u8, 0); } else { // ANY or ALL, several words. if (tp == SST_ANY) { clp = new Rcl::SearchDataClauseSimple(Rcl::SCLT_OR, u8); } else { clp = new Rcl::SearchDataClauseSimple(Rcl::SCLT_AND, u8); } } sdata->addClause(clp); } if (prefs.ssearchAutoPhrase && rcldb) { string stemLang = (const char *)prefs.queryStemLang.toAscii(); if (stemLang == "ALL") { theconfig->getConfParam("indexstemminglanguages", stemLang); } sdata->setStemlang(stemLang); sdata->maybeAddAutoPhrase(*rcldb, prefs.ssearchAutoPhraseThreshPC / 100.0); } // Search terms history // We want to have the new text at the top and any older identical // entry to be erased. There is no standard qt policy to do this ? // So do it by hand. QString txt = queryText->currentText(); int index = queryText->findText(txt); if (index >= 0) queryText->removeItem(index); queryText->insertItem(0, txt); queryText->setCurrentIndex(0); // Save the current state of the listbox list to the prefs (will // go to disk) prefs.ssearchHistory.clear(); for (int index = 0; index < queryText->count(); index++) { prefs.ssearchHistory.push_back(queryText->itemText(index)); } RefCntr rsdata(sdata); emit startSearch(rsdata); } void SSearch::setSearchString(const QString& txt) { queryText->setEditText(txt); } bool SSearch::hasSearchString() { return !queryText->lineEdit()->text().isEmpty(); } // Add term to simple search. Term comes out of double-click in // reslist or preview. // It would probably be better to cleanup in preview.ui.h and // reslist.cpp and do the proper html stuff in the latter case // (which is different because it format is explicit richtext // instead of auto as for preview, needed because it's built by // fragments?). static const char* punct = " \t()<>\"'[]{}!^*.,:;\n\r"; void SSearch::addTerm(QString term) { LOGDEB(("SSearch::AddTerm: [%s]\n", (const char *)term.toUtf8())); string t = (const char *)term.toUtf8(); string::size_type pos = t.find_last_not_of(punct); if (pos == string::npos) return; t = t.substr(0, pos+1); pos = t.find_first_not_of(punct); if (pos != string::npos) t = t.substr(pos); if (t.empty()) return; term = QString::fromUtf8(t.c_str()); QString text = queryText->currentText(); text += QString::fromLatin1(" ") + term; queryText->setEditText(text); } void SSearch::onWordReplace(const QString& o, const QString& n) { QString txt = queryText->currentText(); QRegExp exp = QRegExp(QString("\\b") + o + QString("\\b")); exp.setCaseSensitivity(Qt::CaseInsensitive); txt.replace(exp, n); queryText->setEditText(txt); } void SSearch::setAnyTermMode() { searchTypCMB->setCurrentIndex(SST_ANY); } // Complete last word in input by querying db for all possible terms. void SSearch::completion() { if (!rcldb) return; if (searchTypCMB->currentIndex() == SST_FNM) { // Filename: no completion QApplication::beep(); return; } // Extract last word in text string txt = (const char *)queryText->currentText().toUtf8(); string::size_type cs = txt.find_last_of(" "); if (cs == string::npos) cs = 0; else cs++; if (txt.size() == 0 || cs == txt.size()) { QApplication::beep(); return; } string s = txt.substr(cs) + "*"; LOGDEB(("Completing: [%s]\n", s.c_str())); // Query database const int max = 100; Rcl::TermMatchResult tmres; string stemLang = (const char *)prefs.queryStemLang.toAscii(); if (stemLang == "ALL") { theconfig->getConfParam("indexstemminglanguages", stemLang); } if (!rcldb->termMatch(Rcl::Db::ET_WILD, stemLang, s, tmres, max) || tmres.entries.size() == 0) { QApplication::beep(); return; } if (tmres.entries.size() == (unsigned int)max) { QMessageBox::warning(0, "Recoll", tr("Too many completions")); return; } // If list from db is single word, insert it, else ask user to select QString res; bool ok = false; if (tmres.entries.size() == 1) { res = QString::fromUtf8(tmres.entries.begin()->term.c_str()); ok = true; } else { QStringList lst; for (list::iterator it = tmres.entries.begin(); it != tmres.entries.end(); it++) { lst.push_back(QString::fromUtf8(it->term.c_str())); } res = QInputDialog::getItem (this, tr("Completions"), tr("Select an item:"), lst, 0, false, &ok); } // Insert result if (ok) { txt.erase(cs); txt.append((const char *)res.toUtf8()); queryText->setEditText(QString::fromUtf8(txt.c_str())); } else { return; } } #undef SHOWEVENTS #if defined(SHOWEVENTS) const char *eventTypeToStr(int tp) { switch (tp) { case 0: return "None"; case 1: return "Timer"; case 2: return "MouseButtonPress"; case 3: return "MouseButtonRelease"; case 4: return "MouseButtonDblClick"; case 5: return "MouseMove"; case 6: return "KeyPress"; case 7: return "KeyRelease"; case 8: return "FocusIn"; case 9: return "FocusOut"; case 10: return "Enter"; case 11: return "Leave"; case 12: return "Paint"; case 13: return "Move"; case 14: return "Resize"; case 15: return "Create"; case 16: return "Destroy"; case 17: return "Show"; case 18: return "Hide"; case 19: return "Close"; case 20: return "Quit"; case 21: return "ParentChange"; case 131: return "ParentAboutToChange"; case 22: return "ThreadChange"; case 24: return "WindowActivate"; case 25: return "WindowDeactivate"; case 26: return "ShowToParent"; case 27: return "HideToParent"; case 31: return "Wheel"; case 33: return "WindowTitleChange"; case 34: return "WindowIconChange"; case 35: return "ApplicationWindowIconChange"; case 36: return "ApplicationFontChange"; case 37: return "ApplicationLayoutDirectionChange"; case 38: return "ApplicationPaletteChange"; case 39: return "PaletteChange"; case 40: return "Clipboard"; case 42: return "Speech"; case 43: return "MetaCall"; case 50: return "SockAct"; case 132: return "WinEventAct"; case 52: return "DeferredDelete"; case 60: return "DragEnter"; case 61: return "DragMove"; case 62: return "DragLeave"; case 63: return "Drop"; case 64: return "DragResponse"; case 68: return "ChildAdded"; case 69: return "ChildPolished"; case 70: return "ChildInserted"; case 72: return "LayoutHint"; case 71: return "ChildRemoved"; case 73: return "ShowWindowRequest"; case 74: return "PolishRequest"; case 75: return "Polish"; case 76: return "LayoutRequest"; case 77: return "UpdateRequest"; case 78: return "UpdateLater"; case 79: return "EmbeddingControl"; case 80: return "ActivateControl"; case 81: return "DeactivateControl"; case 82: return "ContextMenu"; case 83: return "InputMethod"; case 86: return "AccessibilityPrepare"; case 87: return "TabletMove"; case 88: return "LocaleChange"; case 89: return "LanguageChange"; case 90: return "LayoutDirectionChange"; case 91: return "Style"; case 92: return "TabletPress"; case 93: return "TabletRelease"; case 94: return "OkRequest"; case 95: return "HelpRequest"; case 96: return "IconDrag"; case 97: return "FontChange"; case 98: return "EnabledChange"; case 99: return "ActivationChange"; case 100: return "StyleChange"; case 101: return "IconTextChange"; case 102: return "ModifiedChange"; case 109: return "MouseTrackingChange"; case 103: return "WindowBlocked"; case 104: return "WindowUnblocked"; case 105: return "WindowStateChange"; case 110: return "ToolTip"; case 111: return "WhatsThis"; case 112: return "StatusTip"; case 113: return "ActionChanged"; case 114: return "ActionAdded"; case 115: return "ActionRemoved"; case 116: return "FileOpen"; case 117: return "Shortcut"; case 51: return "ShortcutOverride"; case 30: return "Accel"; case 32: return "AccelAvailable"; case 118: return "WhatsThisClicked"; case 120: return "ToolBarChange"; case 121: return "ApplicationActivated"; case 122: return "ApplicationDeactivated"; case 123: return "QueryWhatsThis"; case 124: return "EnterWhatsThisMode"; case 125: return "LeaveWhatsThisMode"; case 126: return "ZOrderChange"; case 127: return "HoverEnter"; case 128: return "HoverLeave"; case 129: return "HoverMove"; case 119: return "AccessibilityHelp"; case 130: return "AccessibilityDescription"; case 150: return "EnterEditFocus"; case 151: return "LeaveEditFocus"; case 152: return "AcceptDropsChange"; case 153: return "MenubarUpdated"; case 154: return "ZeroTimerEvent"; case 155: return "GraphicsSceneMouseMove"; case 156: return "GraphicsSceneMousePress"; case 157: return "GraphicsSceneMouseRelease"; case 158: return "GraphicsSceneMouseDoubleClick"; case 159: return "GraphicsSceneContextMenu"; case 160: return "GraphicsSceneHoverEnter"; case 161: return "GraphicsSceneHoverMove"; case 162: return "GraphicsSceneHoverLeave"; case 163: return "GraphicsSceneHelp"; case 164: return "GraphicsSceneDragEnter"; case 165: return "GraphicsSceneDragMove"; case 166: return "GraphicsSceneDragLeave"; case 167: return "GraphicsSceneDrop"; case 168: return "GraphicsSceneWheel"; case 169: return "KeyboardLayoutChange"; case 170: return "DynamicPropertyChange"; case 171: return "TabletEnterProximity"; case 172: return "TabletLeaveProximity"; default: return "UnknownEvent"; } } #endif bool SSearch::eventFilter(QObject *, QEvent *event) { #if defined(SHOWEVENTS) if (event->type() == QEvent::Timer || event->type() == QEvent::UpdateRequest || event->type() == QEvent::Paint) return false; LOGDEB2(("SSearch::eventFilter: target %p (%p) type %s\n", target, queryText->lineEdit(), eventTypeToStr(event->type()))); #endif if (event->type() == QEvent::KeyPress) { QKeyEvent *ke = (QKeyEvent *)event; LOGDEB1(("SSearch::eventFilter: keyPress (m_escape %d) key %d\n", m_escape, ke->key())); if (ke->key() == Qt::Key_Escape) { LOGDEB(("Escape\n")); m_escape = true; return true; } else if (m_escape && ke->key() == Qt::Key_Space) { LOGDEB(("Escape space\n")); ke->accept(); completion(); m_escape = false; return true; } else if (ke->key() == Qt::Key_Space) { if (prefs.autoSearchOnWS) startSimpleSearch(); } m_escape = false; } return false; } recoll-1.17.3/qtgui/ssearch_w.h000644 001750 000000 00000003561 11740755063 016761 0ustar00dockeswheel000000 000000 /* 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 _SSEARCH_W_H_INCLUDED_ #define _SSEARCH_W_H_INCLUDED_ #include #include #include "recoll.h" #include "searchdata.h" #include "refcntr.h" #include "ui_ssearchb.h" class SSearch : public QWidget, public Ui::SSearchBase { Q_OBJECT public: enum SSearchType {SST_ANY = 0, SST_ALL = 1, SST_FNM = 2, SST_LANG = 3}; SSearch(QWidget* parent = 0, const char * = 0) : QWidget(parent) { setupUi(this); init(); } ~SSearch(){} virtual void init(); virtual void setAnyTermMode(); virtual void completion(); virtual bool eventFilter(QObject *target, QEvent *event); virtual bool hasSearchString(); public slots: virtual void searchTextChanged(const QString & text); virtual void searchTypeChanged(int); virtual void setSearchString(const QString& text); virtual void startSimpleSearch(); virtual void addTerm(QString); virtual void onWordReplace(const QString&, const QString&); signals: void startSearch(RefCntr); void clearSearch(); private: bool m_escape; }; #endif /* _SSEARCH_W_H_INCLUDED_ */ recoll-1.17.3/qtgui/ssearchb.ui000644 001750 000000 00000005266 11740755063 016767 0ustar00dockeswheel000000 000000 SSearchBase 0 0 593 48 SSearchBase 2 4 false Erase search entry Clear Ctrl+S false Start query Search Qt::TabFocus Choose search type. 8 0 155 0 Enter search terms here. Type ESC SPC for completions of current term. true 30 QComboBox::NoInsert false recoll-1.17.3/qtgui/ui_rclmain.h-4.5000644 001750 000000 00000034116 11740755063 017431 0ustar00dockeswheel000000 000000 /******************************************************************************** ** Form generated from reading ui file 'rclmain.ui' ** ** Created: Mon Jan 25 20:45:26 2010 ** by: Qt User Interface Compiler version 4.4.0 ** ** WARNING! All changes made in this file will be lost when recompiling ui file! ********************************************************************************/ #ifndef UI_RCLMAIN_H #define UI_RCLMAIN_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include "reslist.h" #include "ssearch_w.h" QT_BEGIN_NAMESPACE class Ui_RclMainBase { public: QAction *fileExitAction; QAction *fileToggleIndexingAction; QAction *fileEraseDocHistoryAction; QAction *showMissingHelpers_Action; QAction *helpAbout_RecollAction; QAction *userManualAction; QAction *toolsDoc_HistoryAction; QAction *toolsAdvanced_SearchAction; QAction *toolsSort_parametersAction; QAction *toolsSpellAction; QAction *nextPageAction; QAction *firstPageAction; QAction *prevPageAction; QAction *indexConfigAction; QAction *queryPrefsAction; QAction *extIdxAction; QWidget *widget; QVBoxLayout *vboxLayout; QVBoxLayout *vboxLayout1; SSearch *sSearch; Q3ButtonGroup *catgBGRP; QRadioButton *allRDB; ResList *resList; Q3ToolBar *Toolbar; Q3ToolBar *Toolbar1; QMenuBar *MenuBar; QMenu *fileMenu; QMenu *toolsMenu; QMenu *preferencesMenu; QMenu *helpMenu; void setupUi(Q3MainWindow *RclMainBase) { if (RclMainBase->objectName().isEmpty()) RclMainBase->setObjectName(QString::fromUtf8("RclMainBase")); RclMainBase->resize(800, 600); QSizePolicy sizePolicy(static_cast(5), static_cast(5)); sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); sizePolicy.setHeightForWidth(RclMainBase->sizePolicy().hasHeightForWidth()); RclMainBase->setSizePolicy(sizePolicy); fileExitAction = new QAction(RclMainBase); fileExitAction->setObjectName(QString::fromUtf8("fileExitAction")); fileExitAction->setName("fileExitAction"); fileToggleIndexingAction = new QAction(RclMainBase); fileToggleIndexingAction->setObjectName(QString::fromUtf8("fileToggleIndexingAction")); fileToggleIndexingAction->setName("fileToggleIndexingAction"); fileEraseDocHistoryAction = new QAction(RclMainBase); fileEraseDocHistoryAction->setObjectName(QString::fromUtf8("fileEraseDocHistoryAction")); fileEraseDocHistoryAction->setName("fileEraseDocHistoryAction"); showMissingHelpers_Action = new QAction(RclMainBase); showMissingHelpers_Action->setObjectName(QString::fromUtf8("showMissingHelpers_Action")); showMissingHelpers_Action->setName("showMissingHelpers_Action"); helpAbout_RecollAction = new QAction(RclMainBase); helpAbout_RecollAction->setObjectName(QString::fromUtf8("helpAbout_RecollAction")); helpAbout_RecollAction->setName("helpAbout_RecollAction"); userManualAction = new QAction(RclMainBase); userManualAction->setObjectName(QString::fromUtf8("userManualAction")); userManualAction->setName("userManualAction"); toolsDoc_HistoryAction = new QAction(RclMainBase); toolsDoc_HistoryAction->setObjectName(QString::fromUtf8("toolsDoc_HistoryAction")); toolsDoc_HistoryAction->setName("toolsDoc_HistoryAction"); toolsAdvanced_SearchAction = new QAction(RclMainBase); toolsAdvanced_SearchAction->setObjectName(QString::fromUtf8("toolsAdvanced_SearchAction")); toolsAdvanced_SearchAction->setName("toolsAdvanced_SearchAction"); toolsSort_parametersAction = new QAction(RclMainBase); toolsSort_parametersAction->setObjectName(QString::fromUtf8("toolsSort_parametersAction")); toolsSort_parametersAction->setName("toolsSort_parametersAction"); toolsSpellAction = new QAction(RclMainBase); toolsSpellAction->setObjectName(QString::fromUtf8("toolsSpellAction")); toolsSpellAction->setName("toolsSpellAction"); nextPageAction = new QAction(RclMainBase); nextPageAction->setObjectName(QString::fromUtf8("nextPageAction")); nextPageAction->setName("nextPageAction"); nextPageAction->setEnabled(false); firstPageAction = new QAction(RclMainBase); firstPageAction->setObjectName(QString::fromUtf8("firstPageAction")); firstPageAction->setName("firstPageAction"); firstPageAction->setEnabled(false); prevPageAction = new QAction(RclMainBase); prevPageAction->setObjectName(QString::fromUtf8("prevPageAction")); prevPageAction->setName("prevPageAction"); prevPageAction->setEnabled(false); indexConfigAction = new QAction(RclMainBase); indexConfigAction->setObjectName(QString::fromUtf8("indexConfigAction")); indexConfigAction->setName("indexConfigAction"); queryPrefsAction = new QAction(RclMainBase); queryPrefsAction->setObjectName(QString::fromUtf8("queryPrefsAction")); queryPrefsAction->setName("queryPrefsAction"); extIdxAction = new QAction(RclMainBase); extIdxAction->setObjectName(QString::fromUtf8("extIdxAction")); extIdxAction->setName("extIdxAction"); widget = new QWidget(RclMainBase); widget->setObjectName(QString::fromUtf8("widget")); vboxLayout = new QVBoxLayout(widget); vboxLayout->setSpacing(2); vboxLayout->setMargin(4); vboxLayout->setObjectName(QString::fromUtf8("vboxLayout")); vboxLayout->setContentsMargins(0, 0, 0, 0); vboxLayout1 = new QVBoxLayout(); vboxLayout1->setSpacing(2); vboxLayout1->setMargin(2); vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1")); sSearch = new SSearch(widget); sSearch->setObjectName(QString::fromUtf8("sSearch")); QSizePolicy sizePolicy1(static_cast(7), static_cast(0)); sizePolicy1.setHorizontalStretch(0); sizePolicy1.setVerticalStretch(0); sizePolicy1.setHeightForWidth(sSearch->sizePolicy().hasHeightForWidth()); sSearch->setSizePolicy(sizePolicy1); vboxLayout1->addWidget(sSearch); catgBGRP = new Q3ButtonGroup(widget); catgBGRP->setObjectName(QString::fromUtf8("catgBGRP")); QSizePolicy sizePolicy2(static_cast(5), static_cast(0)); sizePolicy2.setHorizontalStretch(0); sizePolicy2.setVerticalStretch(0); sizePolicy2.setHeightForWidth(catgBGRP->sizePolicy().hasHeightForWidth()); catgBGRP->setSizePolicy(sizePolicy2); catgBGRP->setFrameShape(Q3GroupBox::GroupBoxPanel); catgBGRP->setFrameShadow(Q3GroupBox::Sunken); catgBGRP->setProperty("selectedId", QVariant(0)); allRDB = new QRadioButton(catgBGRP); allRDB->setObjectName(QString::fromUtf8("allRDB")); vboxLayout1->addWidget(catgBGRP); resList = new ResList(widget); resList->setObjectName(QString::fromUtf8("resList")); QSizePolicy sizePolicy3(static_cast(5), static_cast(5)); sizePolicy3.setHorizontalStretch(2); sizePolicy3.setVerticalStretch(0); sizePolicy3.setHeightForWidth(resList->sizePolicy().hasHeightForWidth()); resList->setSizePolicy(sizePolicy3); vboxLayout1->addWidget(resList); vboxLayout->addLayout(vboxLayout1); RclMainBase->setCentralWidget(widget); Toolbar = new Q3ToolBar(RclMainBase); Toolbar->setObjectName(QString::fromUtf8("Toolbar")); Toolbar1 = new Q3ToolBar(RclMainBase); Toolbar1->setObjectName(QString::fromUtf8("Toolbar1")); MenuBar = new QMenuBar(RclMainBase); MenuBar->setObjectName(QString::fromUtf8("MenuBar")); fileMenu = new QMenu(MenuBar); fileMenu->setObjectName(QString::fromUtf8("fileMenu")); toolsMenu = new QMenu(MenuBar); toolsMenu->setObjectName(QString::fromUtf8("toolsMenu")); preferencesMenu = new QMenu(MenuBar); preferencesMenu->setObjectName(QString::fromUtf8("preferencesMenu")); helpMenu = new QMenu(MenuBar); helpMenu->setObjectName(QString::fromUtf8("helpMenu")); Toolbar->addAction(toolsAdvanced_SearchAction); Toolbar->addAction(toolsSort_parametersAction); Toolbar->addAction(toolsDoc_HistoryAction); Toolbar->addAction(toolsSpellAction); Toolbar1->addAction(firstPageAction); Toolbar1->addAction(prevPageAction); Toolbar1->addAction(nextPageAction); MenuBar->addAction(fileMenu->menuAction()); MenuBar->addAction(toolsMenu->menuAction()); MenuBar->addAction(preferencesMenu->menuAction()); MenuBar->addSeparator(); MenuBar->addAction(helpMenu->menuAction()); fileMenu->addAction(fileToggleIndexingAction); fileMenu->addSeparator(); fileMenu->addAction(fileEraseDocHistoryAction); fileMenu->addAction(showMissingHelpers_Action); fileMenu->addSeparator(); fileMenu->addAction(fileExitAction); toolsMenu->addAction(toolsDoc_HistoryAction); toolsMenu->addAction(toolsAdvanced_SearchAction); toolsMenu->addAction(toolsSort_parametersAction); toolsMenu->addAction(toolsSpellAction); preferencesMenu->addAction(indexConfigAction); preferencesMenu->addSeparator(); preferencesMenu->addAction(queryPrefsAction); preferencesMenu->addAction(extIdxAction); preferencesMenu->addSeparator(); helpMenu->addAction(userManualAction); helpMenu->addAction(showMissingHelpers_Action); helpMenu->addSeparator(); helpMenu->addAction(helpAbout_RecollAction); retranslateUi(RclMainBase); QMetaObject::connectSlotsByName(RclMainBase); } // setupUi void retranslateUi(Q3MainWindow *RclMainBase) { RclMainBase->setWindowTitle(QApplication::translate("RclMainBase", "Recoll", 0, QApplication::UnicodeUTF8)); fileExitAction->setText(QApplication::translate("RclMainBase", "E&xit", 0, QApplication::UnicodeUTF8)); fileExitAction->setShortcut(QApplication::translate("RclMainBase", "Ctrl+Q", 0, QApplication::UnicodeUTF8)); fileToggleIndexingAction->setText(QApplication::translate("RclMainBase", "Update &index", 0, QApplication::UnicodeUTF8)); fileEraseDocHistoryAction->setText(QApplication::translate("RclMainBase", "&Erase document history", 0, QApplication::UnicodeUTF8)); showMissingHelpers_Action->setText(QApplication::translate("RclMainBase", "&Show missing helpers", 0, QApplication::UnicodeUTF8)); helpAbout_RecollAction->setText(QApplication::translate("RclMainBase", "&About Recoll", 0, QApplication::UnicodeUTF8)); userManualAction->setText(QApplication::translate("RclMainBase", "&User manual", 0, QApplication::UnicodeUTF8)); toolsDoc_HistoryAction->setText(QApplication::translate("RclMainBase", "Document &History", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP toolsDoc_HistoryAction->setToolTip(QApplication::translate("RclMainBase", "Document History", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP toolsAdvanced_SearchAction->setText(QApplication::translate("RclMainBase", "&Advanced Search", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP toolsAdvanced_SearchAction->setToolTip(QApplication::translate("RclMainBase", "Advanced/complex Search", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP toolsSort_parametersAction->setText(QApplication::translate("RclMainBase", "&Sort parameters", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP toolsSort_parametersAction->setToolTip(QApplication::translate("RclMainBase", "Sort parameters", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP toolsSpellAction->setText(QApplication::translate("RclMainBase", "Term &explorer", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP toolsSpellAction->setToolTip(QApplication::translate("RclMainBase", "Term explorer tool", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP nextPageAction->setIconText(QApplication::translate("RclMainBase", "Next page", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP nextPageAction->setToolTip(QApplication::translate("RclMainBase", "Next page of results", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP firstPageAction->setIconText(QApplication::translate("RclMainBase", "First page", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP firstPageAction->setToolTip(QApplication::translate("RclMainBase", "Go to first page of results", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP prevPageAction->setIconText(QApplication::translate("RclMainBase", "Previous page", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP prevPageAction->setToolTip(QApplication::translate("RclMainBase", "Previous page of results", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP indexConfigAction->setText(QApplication::translate("RclMainBase", "&Indexing configuration", 0, QApplication::UnicodeUTF8)); queryPrefsAction->setText(QApplication::translate("RclMainBase", "&Query configuration", 0, QApplication::UnicodeUTF8)); extIdxAction->setIconText(QApplication::translate("RclMainBase", "External index dialog", 0, QApplication::UnicodeUTF8)); extIdxAction->setText(QApplication::translate("RclMainBase", "External index dialog", 0, QApplication::UnicodeUTF8)); catgBGRP->setTitle(QString()); allRDB->setText(QApplication::translate("RclMainBase", "All", 0, QApplication::UnicodeUTF8)); Toolbar->setLabel(QApplication::translate("RclMainBase", "Search tools", 0, QApplication::UnicodeUTF8)); Toolbar1->setLabel(QApplication::translate("RclMainBase", "Result list", 0, QApplication::UnicodeUTF8)); fileMenu->setTitle(QApplication::translate("RclMainBase", "&File", 0, QApplication::UnicodeUTF8)); toolsMenu->setTitle(QApplication::translate("RclMainBase", "&Tools", 0, QApplication::UnicodeUTF8)); preferencesMenu->setTitle(QApplication::translate("RclMainBase", "&Preferences", 0, QApplication::UnicodeUTF8)); helpMenu->setTitle(QApplication::translate("RclMainBase", "&Help", 0, QApplication::UnicodeUTF8)); } // retranslateUi }; namespace Ui { class RclMainBase: public Ui_RclMainBase {}; } // namespace Ui QT_END_NAMESPACE #endif // UI_RCLMAIN_H recoll-1.17.3/qtgui/uiprefs.ui000644 001750 000000 00000065436 11740755063 016657 0ustar00dockeswheel000000 000000 uiPrefsDialogBase 0 0 531 422 User preferences true 0 User interface Highlight color for query terms false 50 0 Style sheet false Opens a dialog to select the style sheet file Choose Resets the style sheet to default Reset 1 0 Texts over this size will not be highlighted in preview (too slow). Maximum text size highlighted for preview (megabytes) false 1 3 Prefer Html to plain text for preview. false Lines in PRE text are not folded. Using BR loses some indentation. Use <PRE> tags instead of <BR>to display plain text as html in preview. false Use desktop preferences to choose document editor. false Choose editor applications Display category filter as toolbar instead of button panel (needs restart). false Auto-start simple search on whitespace entry. false Start with advanced search dialog open. false Remember sort activation state. false Qt::Vertical QSizePolicy::Expanding 20 70 Result List 1 0 Number of entries in a result page false 1 8 Result list font false Opens a dialog to select the result list font Helvetica-10 Resets the result list font to the system default Reset Edit result paragraph format string Edit result page html header insert Date format (strftime(3)) false 30 0 Abstract snippet separator false 30 0 Qt::Vertical 20 40 Search parameters If checked, results with the same content under different names will only be shown once. Hide duplicate results. false Stemming language false QFrame::HLine QFrame::Sunken A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Automatically add phrase to simple searches 1 0 Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Autophrase term frequency threshold percentage false 0.200000000000000 2.000000000000000 QFrame::HLine QFrame::Sunken Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Dynamically build abstracts Do we synthetize an abstract even if the document seemed to have one? Replace abstracts from documents 2 0 Synthetic abstract size (characters) false 1 0 80 100000 10 250 1 0 Synthetic abstract context words false 2 20000 4 QFrame::HLine QFrame::Sunken 1 0 The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Query language magic file name suffixes. false Enable 30 0 Qt::Vertical QSizePolicy::Expanding 20 70 External Indexes QAbstractItemView::ExtendedSelection Toggle selected Activate All Deactivate All QFrame::HLine QFrame::Sunken Remove from list. This has no effect on the disk index. Remove selected Qt::Horizontal QSizePolicy::Expanding 16 20 true Click to add another index directory to the list Add index Qt::Horizontal QSizePolicy::Expanding 210 20 Apply changes &OK true true Discard changes &Cancel true recoll-1.17.3/qtgui/uiprefs_w.cpp000644 001750 000000 00000034332 11740755063 017341 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "recoll.h" #include "guiutils.h" #include "rcldb.h" #include "rclconfig.h" #include "pathut.h" #include "uiprefs_w.h" #include "viewaction_w.h" #include "debuglog.h" #include "editdialog.h" #include "rclmain_w.h" void UIPrefsDialog::init() { m_viewAction = 0; connect(viewActionPB, SIGNAL(clicked()), this, SLOT(showViewAction())); connect(reslistFontPB, SIGNAL(clicked()), this, SLOT(showFontDialog())); connect(resetFontPB, SIGNAL(clicked()), this, SLOT(resetReslistFont())); connect(stylesheetPB, SIGNAL(clicked()), this, SLOT(showStylesheetDialog())); connect(resetSSPB, SIGNAL(clicked()), this, SLOT(resetStylesheet())); connect(addExtraDbPB, SIGNAL(clicked()), this, SLOT(addExtraDbPB_clicked())); connect(delExtraDbPB, SIGNAL(clicked()), this, SLOT(delExtraDbPB_clicked())); connect(togExtraDbPB, SIGNAL(clicked()), this, SLOT(togExtraDbPB_clicked())); connect(actAllExtraDbPB, SIGNAL(clicked()), this, SLOT(actAllExtraDbPB_clicked())); connect(unacAllExtraDbPB, SIGNAL(clicked()), this, SLOT(unacAllExtraDbPB_clicked())); connect(CLEditPara, SIGNAL(clicked()), this, SLOT(editParaFormat())); connect(CLEditHeader, SIGNAL(clicked()), this, SLOT(editHeaderText())); connect(buttonOk, SIGNAL(clicked()), this, SLOT(accept())); connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject())); connect(buildAbsCB, SIGNAL(toggled(bool)), replAbsCB, SLOT(setEnabled(bool))); connect(useDesktopOpenCB, SIGNAL(toggled(bool)), viewActionPB, SLOT(setDisabled(bool))); setFromPrefs(); } // Update dialog state from stored prefs void UIPrefsDialog::setFromPrefs() { // Entries per result page spinbox pageLenSB->setValue(prefs.respagesize); collapseDupsCB->setChecked(prefs.collapseDuplicates); maxHLTSB->setValue(prefs.maxhltextmbs); catgToolBarCB->setChecked(prefs.catgToolBar); autoSearchCB->setChecked(prefs.autoSearchOnWS); syntlenSB->setValue(prefs.syntAbsLen); syntctxSB->setValue(prefs.syntAbsCtx); initStartAdvCB->setChecked(prefs.startWithAdvSearchOpen); // External editor. Can use desktop prefs or internal useDesktopOpenCB->setChecked(prefs.useDesktopOpen); viewActionPB->setEnabled(!prefs.useDesktopOpen); keepSortCB->setChecked(prefs.keepSort); previewHtmlCB->setChecked(prefs.previewHtml); previewPlainPreCB->setChecked(prefs.previewPlainPre); // Query terms color qtermColorLE->setText(prefs.qtermcolor); // Abstract snippet separator string abssepLE->setText(prefs.abssep); dateformatLE->setText(prefs.reslistdateformat); // Result list font family and size reslistFontFamily = prefs.reslistfontfamily; reslistFontSize = prefs.reslistfontsize; QString s; if (prefs.reslistfontfamily.length() == 0) { reslistFontPB->setText(this->font().family() + "-" + s.setNum(this->font().pointSize())); } else { reslistFontPB->setText(reslistFontFamily + "-" + s.setNum(reslistFontSize)); } // Style sheet stylesheetFile = prefs.stylesheetFile; if (stylesheetFile.isEmpty()) { stylesheetPB->setText(tr("Choose")); } else { string nm = path_getsimple((const char *)stylesheetFile.toLocal8Bit()); stylesheetPB->setText(QString::fromLocal8Bit(nm.c_str())); } paraFormat = prefs.reslistformat; headerText = prefs.reslistheadertext; // Stemming language combobox stemLangCMB->clear(); stemLangCMB->addItem(g_stringNoStem); stemLangCMB->addItem(g_stringAllStem); list langs; if (!getStemLangs(langs)) { QMessageBox::warning(0, "Recoll", tr("error retrieving stemming languages")); } int cur = prefs.queryStemLang == "" ? 0 : 1; for (list::const_iterator it = langs.begin(); it != langs.end(); it++) { stemLangCMB-> addItem(QString::fromAscii(it->c_str(), it->length())); if (cur == 0 && !strcmp((const char*)prefs.queryStemLang.toAscii(), it->c_str())) { cur = stemLangCMB->count(); } } stemLangCMB->setCurrentIndex(cur); autoPhraseCB->setChecked(prefs.ssearchAutoPhrase); autoPThreshSB->setValue(prefs.ssearchAutoPhraseThreshPC); buildAbsCB->setChecked(prefs.queryBuildAbstract); replAbsCB->setEnabled(prefs.queryBuildAbstract); replAbsCB->setChecked(prefs.queryReplaceAbstract); autoSuffsCB->setChecked(prefs.autoSuffsEnable); autoSuffsLE->setText(prefs.autoSuffs); // Initialize the extra indexes listboxes idxLV->clear(); for (list::iterator it = prefs.allExtraDbs.begin(); it != prefs.allExtraDbs.end(); it++) { QListWidgetItem *item = new QListWidgetItem(QString::fromLocal8Bit(it->c_str()), idxLV); if (item) item->setCheckState(Qt::Unchecked); } for (list::iterator it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end(); it++) { QListitems = idxLV->findItems (QString::fromLocal8Bit(it->c_str()), Qt::MatchFixedString|Qt::MatchCaseSensitive); for (QList::iterator it = items.begin(); it != items.end(); it++) { (*it)->setCheckState(Qt::Checked); } } idxLV->sortItems(); } void UIPrefsDialog::accept() { prefs.autoSearchOnWS = autoSearchCB->isChecked(); prefs.catgToolBar = catgToolBarCB->isChecked(); prefs.respagesize = pageLenSB->value(); prefs.collapseDuplicates = collapseDupsCB->isChecked(); prefs.maxhltextmbs = maxHLTSB->value(); prefs.qtermcolor = qtermColorLE->text(); prefs.abssep = abssepLE->text(); prefs.reslistdateformat = dateformatLE->text(); prefs.creslistdateformat = (const char*)prefs.reslistdateformat.toUtf8(); prefs.reslistfontfamily = reslistFontFamily; prefs.reslistfontsize = reslistFontSize; prefs.stylesheetFile = stylesheetFile; QTimer::singleShot(0, m_mainWindow, SLOT(applyStyleSheet())); prefs.reslistformat = paraFormat; prefs.reslistheadertext = headerText; if (prefs.reslistformat.trimmed().isEmpty()) { prefs.reslistformat = prefs.dfltResListFormat; paraFormat = prefs.reslistformat; } prefs.creslistformat = (const char*)prefs.reslistformat.toUtf8(); if (stemLangCMB->currentIndex() == 0) { prefs.queryStemLang = ""; } else if (stemLangCMB->currentIndex() == 1) { prefs.queryStemLang = "ALL"; } else { prefs.queryStemLang = stemLangCMB->currentText(); } prefs.ssearchAutoPhrase = autoPhraseCB->isChecked(); prefs.ssearchAutoPhraseThreshPC = autoPThreshSB->value(); prefs.queryBuildAbstract = buildAbsCB->isChecked(); prefs.queryReplaceAbstract = buildAbsCB->isChecked() && replAbsCB->isChecked(); prefs.startWithAdvSearchOpen = initStartAdvCB->isChecked(); prefs.useDesktopOpen = useDesktopOpenCB->isChecked(); prefs.keepSort = keepSortCB->isChecked(); prefs.previewHtml = previewHtmlCB->isChecked(); prefs.previewPlainPre = previewPlainPreCB->isChecked(); prefs.syntAbsLen = syntlenSB->value(); prefs.syntAbsCtx = syntctxSB->value(); prefs.autoSuffsEnable = autoSuffsCB->isChecked(); prefs.autoSuffs = autoSuffsLE->text(); prefs.allExtraDbs.clear(); prefs.activeExtraDbs.clear(); for (int i = 0; i < idxLV->count(); i++) { QListWidgetItem *item = idxLV->item(i); if (item) { prefs.allExtraDbs.push_back((const char *)item->text().toLocal8Bit()); if (item->checkState() == Qt::Checked) { prefs.activeExtraDbs.push_back((const char *) item->text().toLocal8Bit()); } } } rwSettings(true); string reason; maybeOpenDb(reason, true); emit uiprefsDone(); QDialog::accept(); } void UIPrefsDialog::editParaFormat() { EditDialog dialog(this); dialog.plainTextEdit->setPlainText(paraFormat); int result = dialog.exec(); if (result == QDialog::Accepted) paraFormat = dialog.plainTextEdit->toPlainText(); } void UIPrefsDialog::editHeaderText() { EditDialog dialog(this); dialog.plainTextEdit->setPlainText(headerText); int result = dialog.exec(); if (result == QDialog::Accepted) headerText = dialog.plainTextEdit->toPlainText(); } void UIPrefsDialog::reject() { setFromPrefs(); QDialog::reject(); } void UIPrefsDialog::setStemLang(const QString& lang) { int cur = 0; if (lang == "") { cur = 0; } else if (lang == "ALL") { cur = 1; } else { for (int i = 1; i < stemLangCMB->count(); i++) { if (lang == stemLangCMB->itemText(i)) { cur = i; break; } } } stemLangCMB->setCurrentIndex(cur); } void UIPrefsDialog::showFontDialog() { bool ok; QFont font; if (prefs.reslistfontfamily.length()) { font.setFamily(prefs.reslistfontfamily); font.setPointSize(prefs.reslistfontsize); } font = QFontDialog::getFont(&ok, font, this); if (ok) { // Check if the default font was set, in which case we // erase the preference QString s; if (font.family().compare(this->font().family()) || font.pointSize() != this->font().pointSize()) { reslistFontFamily = font.family(); reslistFontSize = font.pointSize(); reslistFontPB->setText(reslistFontFamily + "-" + s.setNum(reslistFontSize)); } else { reslistFontFamily = ""; reslistFontSize = 0; reslistFontPB->setText(this->font().family() + "-" + s.setNum(this->font().pointSize())); } } } void UIPrefsDialog::showStylesheetDialog() { stylesheetFile = myGetFileName(false, "Select stylesheet file", true); string nm = path_getsimple((const char *)stylesheetFile.toLocal8Bit()); stylesheetPB->setText(QString::fromLocal8Bit(nm.c_str())); } void UIPrefsDialog::resetStylesheet() { stylesheetFile = ""; stylesheetPB->setText(tr("Choose")); } void UIPrefsDialog::resetReslistFont() { reslistFontFamily = ""; reslistFontSize = 0; reslistFontPB->setText(this->font().family() + "-" + QString().setNum(this->font().pointSize())); } void UIPrefsDialog::showViewAction() { if (m_viewAction== 0) { m_viewAction = new ViewAction(0); } else { // Close and reopen, in hope that makes us visible... m_viewAction->close(); } m_viewAction->show(); } void UIPrefsDialog::showViewAction(const QString& mt) { showViewAction(); m_viewAction->selectMT(mt); } //////////////////////////////////////////// // External / extra search indexes setup void UIPrefsDialog::togExtraDbPB_clicked() { for (int i = 0; i < idxLV->count(); i++) { QListWidgetItem *item = idxLV->item(i); if (item->isSelected()) { if (item->checkState() == Qt::Checked) { item->setCheckState(Qt::Unchecked); } else { item->setCheckState(Qt::Checked); } } } } void UIPrefsDialog::actAllExtraDbPB_clicked() { for (int i = 0; i < idxLV->count(); i++) { QListWidgetItem *item = idxLV->item(i); item->setCheckState(Qt::Checked); } } void UIPrefsDialog::unacAllExtraDbPB_clicked() { for (int i = 0; i < idxLV->count(); i++) { QListWidgetItem *item = idxLV->item(i); item->setCheckState(Qt::Unchecked); } } void UIPrefsDialog::delExtraDbPB_clicked() { QList items = idxLV->selectedItems(); for (QList::iterator it = items.begin(); it != items.end(); it++) { delete *it; } } /** * Browse to add another index. * We do a textual comparison to check for duplicates, except for * the main db for which we check inode numbers. */ void UIPrefsDialog::addExtraDbPB_clicked() { QString input = myGetFileName(true, tr("Select xapian index directory " "(ie: /home/buddy/.recoll/xapiandb)")); if (input.isEmpty()) return; string dbdir = (const char *)input.toLocal8Bit(); LOGDEB(("ExtraDbDial: got: [%s]\n", dbdir.c_str())); path_catslash(dbdir); if (!Rcl::Db::testDbDir(dbdir)) { QMessageBox::warning(0, "Recoll", tr("The selected directory does not appear to be a Xapian index")); return; } struct stat st1, st2; stat(dbdir.c_str(), &st1); string rcldbdir = theconfig->getDbDir(); stat(rcldbdir.c_str(), &st2); path_catslash(rcldbdir); if (st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino) { QMessageBox::warning(0, "Recoll", tr("This is the main/local index!")); return; } // For some reason, finditem (which we used to use to detect duplicates // here) does not work anymore here: qt 4.6.3 QListitems = idxLV->findItems (input, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (!items.empty()) { QMessageBox::warning(0, "Recoll", tr("The selected directory is already in the index list")); return; } #if 0 string nv = (const char *)input.toLocal8Bit(); QListViewItemIterator it(idxLV); while (it.current()) { QCheckListItem *item = (QCheckListItem *)it.current(); string ov = (const char *)item->text().toLocal8Bit(); if (!ov.compare(nv)) { QMessageBox::warning(0, "Recoll", tr("The selected directory is already in the index list")); return; } ++it; } #endif QListWidgetItem *item = new QListWidgetItem(input, idxLV); item->setCheckState(Qt::Unchecked); idxLV->sortItems(); } recoll-1.17.3/qtgui/uiprefs_w.h000644 001750 000000 00000004260 11740755063 017003 0ustar00dockeswheel000000 000000 /* 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 _UIPREFS_W_H_INCLUDED_ #define _UIPREFS_W_H_INCLUDED_ #include #include #include "ui_uiprefs.h" class QDialog; class ViewAction; class RclMain; class UIPrefsDialog : public QDialog, public Ui::uiPrefsDialogBase { Q_OBJECT public: UIPrefsDialog(RclMain* parent) : QDialog((QWidget*)parent), m_mainWindow(parent) { setupUi(this); init(); } ~UIPrefsDialog(){}; QString reslistFontFamily; int reslistFontSize; QString stylesheetFile; virtual void init(); public slots: virtual void showFontDialog(); virtual void resetReslistFont(); virtual void showStylesheetDialog(); virtual void resetStylesheet(); virtual void showViewAction(); virtual void showViewAction(const QString& mt); virtual void addExtraDbPB_clicked(); virtual void delExtraDbPB_clicked(); virtual void togExtraDbPB_clicked(); virtual void actAllExtraDbPB_clicked(); virtual void unacAllExtraDbPB_clicked(); virtual void setStemLang(const QString& lang); virtual void editParaFormat(); virtual void editHeaderText(); signals: void uiprefsDone(); protected slots: virtual void accept(); virtual void reject(); private: // Locally stored data (pending ok/cancel) QString paraFormat; QString headerText; void setFromPrefs(); ViewAction *m_viewAction; RclMain *m_mainWindow; }; #endif /* _UIPREFS_W_H_INCLUDED_ */ recoll-1.17.3/qtgui/viewaction.ui000644 001750 000000 00000007050 11740755063 017336 0ustar00dockeswheel000000 000000 ViewActionBase 0 0 446 180 Native Viewers Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. false Select one or several file types, then click Change Action to modify the program used to open them QFrame::StyledPanel QFrame::Sunken QAbstractItemView::NoEditTriggers QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows true true 2 true true 150 true true false false true true 150 Change Action Close recoll-1.17.3/qtgui/viewaction_w.cpp000644 001750 000000 00000007632 11740755063 020037 0ustar00dockeswheel000000 000000 /* 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 using namespace std; #include #include #include #include #include #include #include "recoll.h" #include "debuglog.h" #include "guiutils.h" #include "viewaction_w.h" void ViewAction::init() { connect(closePB, SIGNAL(clicked()), this, SLOT(close())); connect(chgActPB, SIGNAL(clicked()), this, SLOT(editActions())); connect(actionsLV,SIGNAL(itemDoubleClicked(QTableWidgetItem *)), this, SLOT(onItemDoubleClicked(QTableWidgetItem *))); fillLists(); resize(QSize(640, 250).expandedTo(minimumSizeHint())); } void ViewAction::fillLists() { actionsLV->clear(); actionsLV->verticalHeader()->setDefaultSectionSize(20); vector > defs; theconfig->getMimeViewerDefs(defs); actionsLV->setRowCount(defs.size()); int row = 0; for (vector >::const_iterator it = defs.begin(); it != defs.end(); it++) { actionsLV->setItem(row, 0, new QTableWidgetItem(QString::fromAscii(it->first.c_str()))); actionsLV->setItem(row, 1, new QTableWidgetItem(QString::fromAscii(it->second.c_str()))); row++; } QStringList labels(tr("MIME type")); labels.push_back(tr("Command")); actionsLV->setHorizontalHeaderLabels(labels); } void ViewAction::selectMT(const QString& mt) { actionsLV->clearSelection(); QListitems = actionsLV->findItems(mt, Qt::MatchFixedString|Qt::MatchCaseSensitive); for (QList::iterator it = items.begin(); it != items.end(); it++) { (*it)->setSelected(true); actionsLV->setCurrentItem(*it, QItemSelectionModel::Columns); } } void ViewAction::onItemDoubleClicked(QTableWidgetItem * item) { actionsLV->clearSelection(); item->setSelected(true); QTableWidgetItem *item0 = actionsLV->item(item->row(), 0); item0->setSelected(true); editActions(); } void ViewAction::editActions() { QString action0; list mtypes; bool dowarnmultiple = true; for (int row = 0; row < actionsLV->rowCount(); row++) { QTableWidgetItem *item0 = actionsLV->item(row, 0); if (!item0->isSelected()) continue; mtypes.push_back((const char *)item0->text().toLocal8Bit()); QTableWidgetItem *item1 = actionsLV->item(row, 1); QString action = item1->text(); if (action0.isEmpty()) { action0 = action; } else { if (action != action0 && dowarnmultiple) { switch (QMessageBox::warning(0, "Recoll", tr("Changing actions with " "different current values"), "Continue", "Cancel", 0, 0, 1)) { case 0: dowarnmultiple = false;break; case 1: return; } } } } if (action0.isEmpty()) return; bool ok; QString newaction = QInputDialog::getText(this, "Recoll", "Edit action:", QLineEdit::Normal, action0, &ok); if (!ok || newaction.isEmpty() ) return; string sact = (const char *)newaction.toLocal8Bit(); for (list::const_iterator it = mtypes.begin(); it != mtypes.end(); it++) { theconfig->setMimeViewerDef(*it, sact); } fillLists(); } recoll-1.17.3/qtgui/viewaction_w.h000644 001750 000000 00000002623 11740755063 017477 0ustar00dockeswheel000000 000000 /* 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 _VIEWACTION_W_H_INCLUDED_ #define _VIEWACTION_W_H_INCLUDED_ #include #include #include "ui_viewaction.h" class QDialog; class QMouseEvent; class QTableWidget; class ViewAction : public QDialog, public Ui::ViewActionBase { Q_OBJECT public: ViewAction(QWidget* parent = 0) : QDialog(parent) { setupUi(this); init(); } ~ViewAction() {} void selectMT(const QString& mt); public slots: virtual void editActions(); virtual void onItemDoubleClicked(QTableWidgetItem *); private: virtual void init(); virtual void fillLists(); }; #endif /* _VIEWACTION_W_H_INCLUDED_ */ recoll-1.17.3/qtgui/mtpics/License_sidux.txt000644 001750 000000 00000001763 11740755063 021472 0ustar00dockeswheel000000 000000 For sidux-book.png: _________________________________________________________________ Coloured Sidux Book Icons (type2) Copyright (C) 2007 by spacepenguin, cako and cathbard (http://sidux.com) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA I suggest a copy be kept in your sources for safe keeping __________________________________________________________________________ recoll-1.17.3/qtgui/mtpics/README000644 001750 000000 00000000226 11740755063 017004 0ustar00dockeswheel000000 000000 Most icons thanks to kde crystalsvg The Python icon comes from oxygen (www.oxygen-icons.org) GPL The Pidgin icon comes from the Pidgin project (GPL) recoll-1.17.3/qtgui/mtpics/aptosid-book.png000755 001750 000000 00000010610 11740755063 021226 0ustar00dockeswheel000000 000000 ‰PNG  IHDR00Wù‡sBIT|dˆ pHYs11·í(RtEXtSoftwarewww.inkscape.org›î<IDAThÍšy]UÇ?ç.oë%~½/I:k‡LÈ’!h „GG- ¢3†œÂ?,Pq)ÄÁfÊ)± 42¤¢…ŒcH2 F¨"ÄhHšô–îô¾½¥ï{÷žeþxK¿nšt´Êª¹U§Ï¹÷žsî÷{~ë9ý0Æðÿ©üêŠËí?§¿0Æð׺^¹ãö £TÖªÆ(×JÕ¥j´Rq£T–ùZÍzïj©þþæ×^Ûw!ßp.̉{>_iŒ©Sc´‰cLѺÆ7Z×­ãF©Ü3¥ãZ«¸Ñ:dŒÆèB1m PçWc¨loGyS§NcŒ¹øó ^[³xkAB¸½¾ßt‘”Ø~SU…J§±ÊËA€SQÎdpÊËq*+ÑÙ,ñ+¯"34ÄøÑ£4ßz+Ñ–V¢MŒ¼ô"Ën¿ƒtw7ËnoåO=Äò;èÞ³‡to/M7ÝL÷O÷Pwõ5„«ã ,N}ÿû¥q+*©X¾ox±ñ‚äëè„R­Jkää$©áa´7ÛØ@Û;о[¹ˆìèÉŽšo½•ÎÇÃŽFYvÇN>ô-ÖÞ÷eº~òcZ?òº~ü8‰S§)_±‚¥û8°üSŸÆhMòíŒ1¤º»‰65┕儫5A*EÅÊ• 9‚0zƒâ©…ìÀÒJUi¥˜J$ÑÝݸ¾Ïâ yéEÆ%ÚÔÌòÏìdðŸ#u¦“‰7ßm¨h_K¤©” &°£1ŒVd††pÊÊH÷ž¥kÏÆŽ½Îº{îeñ† $:N®­¥ïWÿæÿ²cc¸åå9Ã7aÌ{òØ$`ip”Ö$S)üÞ³4†#X‘rh-é³½„ãq¼¾^*ÚÛq+áONih 32•̹B=r÷³Ýfi)€WDË%ZI–mƒ•óì2‘ ïÿt_ßó ©xZOù¾_ר¶ŒPCºã4ZIF_þ]®·Å—n$ÖÚB¸¦r²Ô´Ö˜ @J‰’”ÛÇÅv\°-Œ6ˆšj´6¨’WÈ}0:'<)KR ÍìTCÍ‰Ö c \̆\*/©Ô¸ÖšÌ؉@” (JsN^4“å@ Û¡õC·P{ùåD›šÐOòL''vï&32\XÍRªHܲÖÜVYiçU|~Æ#„P@6¡Ô¨ÒšD"ÉÄd‚E‘*›^ÚP±z—Ü÷eF^~™“|—DGFµ·óÞ]»8±{78ŽÑšÕÿðÔmÞ̹矧ãñÇÑR¢#@dkYÙjàÄBÐ@0!åÎÇ‚ÄT’šš8ÙDbøàï_¿õZÖüó]¼ùÀŒ¿ñû’4Z3ñ‡?ðÆpí“OòÆ7¾A$gý=÷PwÕU´Üx#¿ýÌgðÆÆr$Dz6 !þøn†\ `€`Ø÷¦§=¦FG ¯]Kr||Ö€ÒÕoºáFZnº‰t_>JåÚµ\üÅ/Ñù_OR¹j+–ƒpM Ñúz"õõDqb16=ü0Ú÷gÍ]³i×ïÛdz·Ü‚J¥ÐB yÏBݾNc¼LVD¢B˜?žÈ‰³°âyaT­»ˆK¾òº÷ícøÅyß#kiÁr]ÖÜùOïö½â•˜@A(*>›êè`üÄ .½ï>~÷Õ¯æ2[¸„óx¢Yð•JeµNú¾_¹tý:ÜÚt&ƒqÝäþ,ý»ÐýóŸqâá‡hÚ¾ò¶¶ó6J1~ü8ƒ‡3ð Œ?N¤¶–Mßþ6õ›7sú‰'8¶k2›…P§¼œL"eYë9'š%À›Vj*‚Êå¯'™É"|mY9uŸaÀ¢övŽì܉SQÉú{¿0kRopÑ×^C¦R¤z{ûýL?Žô¦‹ö`´&}î/|ò“ຨ ÀZLAÁîkh¨’@Ž€ÖRÊV9>NÂWh?@;îL7Ne%þä$Þà—íþ7BUU³&}óÁé?xp&­(I3Š59OcEÏc Ø.ò"Û~ÏBrÁl\kMzd„É©$n4B ä M rÅ &Nœ öÊ«hÞ¾}Ö„‰Ó§é;xÔlÀ”/¬t¾] £çikÀÊy¢Cóy" ÿâ±`êÜ¡EU©Ð²°ï•¸UUø“4lÝúŽ9ñï`YÜ#÷ÎÆ óÀKÁîué} x#BˆÂÞà¼Ѐ?%åp!¤FG _r zp‚úDjkYþ±Q{Å$Þ~{Öd]{÷Ò·ñЉ’/ª‹ïP!=§Ï\u²à] yîÎ_ŽÁ€çeH%“„››Ñ¯¿BPÑÖÆu?ûÊó¨\¹27(¦ç¿àØý÷ç“>ˆ57S¿e [¶PÑÖF¤¶–h]ÆÒýý¤úûIõõ‘èî¦ëÀ&»ºæU¡|J±úƪ*—yRŠRú³Ù~c ^&Ãâæ&ÜÚZ‡¹ü»ßeòäIŒRÄššŠ~ðƒ$ΜÁr–~øÃ´ïÜÉâuëæ[°ñ¶6*KÜîe_ü"ƒ¯¾Êɽ{y{ÿ~üééY’B›ÊË/Ž-D@Á¨4ÆZuÙ¥(cRß²…ò%KØ¿mÛöî-šøÓŸ˜êì¤í£å=÷ÜC¬±qÖüd’dw7‰|Q¾Oys3eÍÍT´¶R¹l ›6Ѱi›ï¿Ÿ—|O=5c'€cY„¿ŸkÈsU(¼ŒÖ“AÔ-Y½Šžž>Œ14¾ÿýt=ý4©ÁA„33lèÈ®þái½ñÆ™IR):žzŠ“O^yà¦zzrž'¼àaŠE&zzxõ‘Gxò†xfÇ}}´mÛÆí‡ÑzõÕhÀbÞ½5ç>G@ëq¥5©±q¦‰¶´®®føØ14)Ið Òè?|˜§·oçÄ~D6•šr>àó=ë>|˜oßÎk>ŠQŠhu5·=ú(M—^Š-ļ§EyÝ’@6¥Ô˜ÖšD2IjlŒhSÞèhñÃÞœ õÍï}ƒwÜ755n®¿@2¾çqø[ßâ—ŸûZJœH„?ö5+VÔÞÝÔT¿4à'¥ÑZ“J¥HOMin.æèM×^KUÞ}¼p÷Ý}øa”1ïw>à…çïÒïÔþý<½s'2›%RUŇ~ðÖoÙrMþ(´xÍwLJ9¹Xñ}ÜúzB®Ë‡$¾vm±ã‰Ç§ã™gf ´´.1Ö³Y­ä¤1øR(E %ʲÔÈsÏÉSÛ¶éÈâÅÁpg篞 v.œ+õý|,ÈÒº¶mÛããÔoÛVì8þÖ[üî›ß,ªHp) 9@Ják¯µ‘¶-ë*¢m—•§j¡ÅÕ¢¼¹Éªom‹š›ÅV8µC¡‡‰WÇ£Ÿ½ùæ}vbbìB¾ß˜ ÄÅW]Ar`€gwïfÛ“O²äºëðÆÆøåw2™JÀieÛR…BÊD"šX »¢QU%ÊEys³]W_o—×Äm× ¹®ë¸¡PǶqÛ¶ GÂDÂ"‘¡P˲B`Ùñê8[׬ ž>vL.¤¯T*£u2‚ʺú:ì?ŒUTʽ»w›ä®]B…#&´r•Uvõ5VmK‹«ª²¢‘H( ãº.®ë¢•ÊåôÆ`Y±h”p$BÈus'ùÃ0×u ‡Ã„ù±9aæÔÜu]ÇA€n¨ˆ„óB]X€7-åd•R•^W· íØánlltc±èÌGÈíÇÁ¶,lÛÆ¶m‚ @kƒm[EpB”ÖL§Óxù<*S^^N8Ʋ,´Öø¾Çq…Bù“;ÃdoÏHH›²y{~ ^Ú˜‰°ë.éGåš5kìºÚB¡Ú,aaÛ9ÐZkT~µ3™ –e‹Öšééi²Ù,A‡ÃaÇÁC6›Å¶mB¡PQzBˆâ¼¾ï“>ujÒ‘ª‚y"ñ,¥gDÓJ•…B¨—Ú•ÅtSJ‰çy³ÀÞ——RæT(#‰à8RJ‚ü9ªmÛ9•ËK`¸¼$&NŸÊ:J]°4à§” ´bK—ºŽã µ&”RH)ÑZcY¡Pˆh4Zày™L¥®ëRVVV\ÑD"Që8NQ B®ë¸`ÈJJn›tÚµƒ *´¶}­=O멬1Sc&=cƧa4iÌð˜Ìt§¼S£™Ìi`äÏ‘€ÿöôôɈ¨mk× Y¶mûž§†:;½±ÎÎÌxo¯ŸìïW™áa‚ÉIÛ¤R!!¥«¥Tc­§<¥&¦µOk=šrx\Ê¡nß÷ýI ;§Hr;/™/^¾ómêßñ[‰|®Q´ßÛÚú£†x|Iy]­IÏs•ï«@© «ÔTF뉴Öãi¥FRJ ÁP¿ïôûþØPA¾€•ÖsÛ…E,Ôæ|ÿà˜÷ÇB¨ÀÊ¿mhø¤Ž <ëyÃ2s€P¡.fóÌ5þÂ_¼¸@ (^Îln¾6à_ ìB¯ÿÀüäª~*JIEND®B`‚recoll-1.17.3/qtgui/mtpics/aptosid-manual-copyright.txt000644 001750 000000 00000034002 11740755063 023610 0ustar00dockeswheel000000 000000 This package was debianized by Kel Modderman on Mon, 9 Apr 2007 13:54:11 +1000. It was downloaded from http://developer.berlios.de/projects/fullstory/ Files: lib/* Copyright: © 2006-2010 Trevor Walkley (bluewater) License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: bg/* Copyright: © 2008-2009 manul License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: da/* Copyright: © 2006-2009 Rasmus Pørksen License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: de/* Copyright: © 2006-2010 Markus Huber © 2006-2009 Markus Müller © 2006-2009 Philipp Rudolph License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License.. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: el/* Copyright: © 2008-2008 Gregory Gretri (grigris) siduxgr@gmail.com © 2008-2010 Nikolas Poniros (edhunter)edhunter@TBA.com © 2007-2008 mixalis (miles) georgiou mechmg93@gmail.com © 2007-2008 Pavlos (lathspell) fubar.ath@gmail.com © 2007-2008 Lazaros (riddle3)lazarost@gmail.com © 2007-2008 spyros melcher (xouzouris) License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: en/* Copyright: © 2006-2010 Trevor Walkley License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: es/* Copyright: © 2006-2009 Richard Holt © 2009-2010 Luis_P License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: fr/* Copyright: © 2006-2009 Philippe Masson License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: hr/* Copyright: © 2006-2009 Dinko Sabo License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: hu/* Copyright: © 2008-2009 mrowl Bagoj Ur © 2008-2009 ruess reuss@chello.hu © 2008-2009 Siposs Zoltan © 2008-2009 honorshark honorshark@gmail.com License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License.Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: it/* Copyright: © 2008-2009 Renato Zanotti zenren@tiscali.it © 2008-2009 speedygeo speedygeo@email.it © 2007-2009 Stefano Tombolini dedo.tombolini@gmail.com © 2008-2010 Alessio Giustini alessio@alessiogiustini.com License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: ja/* Copyright: © 2006-2009 Mutsumu Nomura License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: nl/* Copyright: © 2006-2010 S R Eissens © 2007-2009 Ronald Stam © 2007-2009 HarzG License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: pl/* Copyright: © 2006-2008 Marcin SÅ‚otwiÅ„ski © 2008-2009 Michael R' Tokarczyk © 2009 dongle License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: pt-br/* Copyright: © 2006-2010 Jose Tadeu Barros License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: ro/* Copyright: © 2006-2008 Gabriel Palade © 2009-2010 Dorin Vatavu License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: ru/* Copyright: © 2006-2010 Roland Engert © 2006-2007 Dmytro Kychenko © 2006-2007 Mikhail Burov © 2009 kostiagol License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: menu/* Copyright: © 2006-2010 Trevor Walkley License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: debian/* Copyright: © 2007, Kel Modderman License: GPL-2+ The Debian packaging information is licensed under the GNU General Public License, version 2 or later. Files: menu/* Copyright: © 2006-2010 Trevor Walkley License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License.. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: menu/icons/* Copyright: © 2010 Rick Battle © 2008-2010 Bernard Gray © 2008 David Creedy © 2007 David Vignoni © 2007 Johann Ollivier Lapeyre © 2007 Kenneth Wimer © 2007 Nuno Fernades Pinheiro © 2007 Riccardo Iaconelli © 2007 David Miller License: CC-ASA-3.0 | LGPL-2+ | GPL-2+ aptosid-manual.svg also includes elements from The Oxygen Icon Theme. Licensed under the Creative Common Attribution-ShareAlike 3.0 license, as found here: http://creativecommons.org/licenses/by-sa/3.0/ or the GNU Library General Public License (with following clarification). Clarification: The GNU Lesser General Public License or LGPL is written for software libraries in the first place. We expressly want the LGPL to be valid for this artwork library too. KDE Oxygen theme icons is a special kind of software library, it is an artwork library, it's elements can be used in a Graphical User Interface, or GUI. Source code, for this library means: - where they exist, SVG; - otherwise, if applicable, the multi-layered formats xcf or psd, or otherwise png. The LGPL in some sections obliges you to make the files carry notices. With images this is in some cases impossible or hardly useful. With this library a notice is placed at a prominent place in the directory containing the elements. You may follow this practice. The exception in section 6 of the GNU Lesser General Public License covers the use of elements of this art library in a GUI. Files: * Copyright: © 2006-2010 Trevor Walkley License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: *Coloured sidux Book Icons (type2) Copyright (C) 2007  by spacepenguin, cako and cathbard (http://sidux.com) 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA I suggest a copy be kept in your sources for safe keeping ________________________________________________________________________________ On Debian systems, the complete text of the GNU Free Documentation License, version 2, can be found in `/usr/share/common-licenses/GFDL-1.2'. On Debian systems, the complete text of the GNU General Public License, version 2, can be found in `/usr/share/common-licenses/GPL-2'. On Debian systems, the complete text of the GNU Lesser General Public License, version 2, can be found in `/usr/share/common-licenses/LGPL-2'. The Debian packaging is © 2007--2010, Kel Modderman and is licensed under the GPL, see `/usr/share/common-licenses/GPL'. recoll-1.17.3/qtgui/mtpics/aptosid-manual.png000644 001750 000000 00000010610 11740755063 021546 0ustar00dockeswheel000000 000000 ‰PNG  IHDR00Wù‡sBIT|dˆ pHYs11·í(RtEXtSoftwarewww.inkscape.org›î<IDAThÍšy]UÇ?ç.oë%~½/I:k‡LÈ’!h „GG- ¢3†œÂ?,Pq)ÄÁfÊ)± 42¤¢…ŒcH2 F¨"ÄhHšô–îô¾½¥ï{÷žeþxK¿nšt´Êª¹U§Ï¹÷žsî÷{~ë9ý0Æðÿ©üêŠËí?§¿0Æð׺^¹ãö £TÖªÆ(×JÕ¥j´Rq£T–ùZÍzïj©þþæ×^Ûw!ßp.̉{>_iŒ©Sc´‰cLѺÆ7Z×­ãF©Ü3¥ãZ«¸Ñ:dŒÆèB1m PçWc¨loGyS§NcŒ¹øó ^[³xkAB¸½¾ßt‘”Ø~SU…J§±ÊËA€SQÎdpÊËq*+ÑÙ,ñ+¯"34ÄøÑ£4ßz+Ñ–V¢MŒ¼ô"Ën¿ƒtw7ËnoåO=Äò;èÞ³‡to/M7ÝL÷O÷Pwõ5„«ã ,N}ÿû¥q+*©X¾ox±ñ‚äëè„R­Jkää$©áa´7ÛØ@Û;о[¹ˆìèÉŽšo½•ÎÇÃŽFYvÇN>ô-ÖÞ÷eº~òcZ?òº~ü8‰S§)_±‚¥û8°üSŸÆhMòíŒ1¤º»‰65┕儫5A*EÅÊ• 9‚0zƒâ©…ìÀÒJUi¥˜J$ÑÝݸ¾Ïâ yéEÆ%ÚÔÌòÏìdðŸ#u¦“‰7ßm¨h_K¤©” &°£1ŒVd††pÊÊH÷ž¥kÏÆŽ½Îº{îeñ† $:N®­¥ïWÿæÿ²cc¸åå9Ã7aÌ{òØ$`ip”Ö$S)üÞ³4†#X‘rh-é³½„ãq¼¾^*ÚÛq+áONih 32•̹B=r÷³Ýfi)€WDË%ZI–mƒ•óì2‘ ïÿt_ßó ©xZOù¾_ר¶ŒPCºã4ZIF_þ]®·Å—n$ÖÚB¸¦r²Ô´Ö˜ @J‰’”ÛÇÅv\°-Œ6ˆšj´6¨’WÈ}0:'<)KR ÍìTCÍ‰Ö c \̆\*/©Ô¸ÖšÌ؉@” (JsN^4“å@ Û¡õC·P{ùåD›šÐOòL''vï&32\XÍRªHܲÖÜVYiçU|~Æ#„P@6¡Ô¨ÒšD"ÉÄd‚E‘*›^ÚP±z—Ü÷eF^~™“|—DGFµ·óÞ]»8±{78ŽÑšÕÿðÔmÞ̹矧ãñÇÑR¢#@dkYÙjàÄBÐ@0!åÎÇ‚ÄT’šš8ÙDbøàï_¿õZÖüó]¼ùÀŒ¿ñû’4Z3ñ‡?ðÆpí“OòÆ7¾A$gý=÷PwÕU´Üx#¿ýÌgðÆÆr$Dz6 !þøn†\ `€`Ø÷¦§=¦FG ¯]Kr||Ö€ÒÕoºáFZnº‰t_>JåÚµ\üÅ/Ñù_OR¹j+–ƒpM Ñúz"õõDqb16=ü0Ú÷gÍ]³i×ïÛdz·Ü‚J¥ÐB yÏBݾNc¼LVD¢B˜?žÈ‰³°âyaT­»ˆK¾òº÷ícøÅyß#kiÁr]ÖÜùOïö½â•˜@A(*>›êè`üÄ .½ï>~÷Õ¯æ2[¸„óx¢Yð•JeµNú¾_¹tý:ÜÚt&ƒqÝäþ,ý»ÐýóŸqâá‡hÚ¾ò¶¶ó6J1~ü8ƒ‡3ð Œ?N¤¶–Mßþ6õ›7sú‰'8¶k2›…P§¼œL"eYë9'š%À›Vj*‚Êå¯'™É"|mY9uŸaÀ¢övŽì܉SQÉú{¿0kRopÑ×^C¦R¤z{ûýL?Žô¦‹ö`´&}î/|ò“ຨ ÀZLAÁîkh¨’@Ž€ÖRÊV9>NÂWh?@;îL7Ne%þä$Þà—íþ7BUU³&}óÁé?xp&­(I3Š59OcEÏc Ø.ò"Û~ÏBrÁl\kMzd„É©$n4B ä M rÅ &Nœ öÊ«hÞ¾}Ö„‰Ó§é;xÔlÀ”/¬t¾] £çikÀÊy¢Cóy" ÿâ±`êÜ¡EU©Ð²°ï•¸UUø“4lÝúŽ9ñï`YÜ#÷ÎÆ óÀKÁîué} x#BˆÂÞà¼Ѐ?%åp!¤FG _r zp‚úDjkYþ±Q{Å$Þ~{Öd]{÷Ò·ñЉ’/ª‹ïP!=§Ï\u²à] yîÎ_ŽÁ€çeH%“„››Ñ¯¿BPÑÖÆu?ûÊó¨\¹27(¦ç¿àØý÷ç“>ˆ57S¿e [¶PÑÖF¤¶–h]ÆÒýý¤úûIõõ‘èî¦ëÀ&»ºæU¡|J±úƪ*—yRŠRú³Ù~c ^&Ãâæ&ÜÚZ‡¹ü»ßeòäIŒRÄššŠ~ðƒ$ΜÁr–~øÃ´ïÜÉâuëæ[°ñ¶6*KÜîe_ü"ƒ¯¾Êɽ{y{ÿ~üééY’B›ÊË/Ž-D@Á¨4ÆZuÙ¥(cRß²…ò%KØ¿mÛöî-šøÓŸ˜êì¤í£å=÷ÜC¬±qÖüd’dw7‰|Q¾Oys3eÍÍT´¶R¹l ›6Ѱi›ï¿Ÿ—|O=5c'€cY„¿ŸkÈsU(¼ŒÖ“AÔ-Y½Šžž>Œ14¾ÿýt=ý4©ÁA„33lèÈ®þái½ñÆ™IR):žzŠ“O^yà¦zzrž'¼àaŠE&zzxõ‘Gxò†xfÇ}}´mÛÆí‡ÑzõÕhÀbÞ½5ç>G@ëq¥5©±q¦‰¶´®®føØ14)Ið Òè?|˜§·oçÄ~D6•šr>àó=ë>|˜oßÎk>ŠQŠhu5·=ú(M—^Š-ļ§EyÝ’@6¥Ô˜ÖšD2IjlŒhSÞèhñÃÞœ õÍï}ƒwÜ755n®¿@2¾çqø[ßâ—ŸûZJœH„?ö5+VÔÞÝÔT¿4à'¥ÑZ“J¥HOMin.æèM×^KUÞ}¼p÷Ý}øa”1ïw>à…çïÒïÔþý<½s'2›%RUŇ~ðÖoÙrMþ(´xÍwLJ9¹Xñ}ÜúzB®Ë‡$¾vm±ã‰Ç§ã™gf ´´.1Ö³Y­ä¤1øR(E %ʲÔÈsÏÉSÛ¶éÈâÅÁpg篞 v.œ+õý|,ÈÒº¶mÛããÔoÛVì8þÖ[üî›ß,ªHp) 9@Ják¯µ‘¶-ë*¢m—•§j¡ÅÕ¢¼¹Éªom‹š›ÅV8µC¡‡‰WÇ£Ÿ½ùæ}vbbìB¾ß˜ ÄÅW]Ar`€gwïfÛ“O²äºëðÆÆøåw2™JÀieÛR…BÊD"šX »¢QU%ÊEys³]W_o—×Äm× ¹®ë¸¡PǶqÛ¶ GÂDÂ"‘¡P˲B`Ùñê8[׬ ž>vL.¤¯T*£u2‚ʺú:ì?ŒUTʽ»w›ä®]B…#&´r•Uvõ5VmK‹«ª²¢‘H( ãº.®ë¢•ÊåôÆ`Y±h”p$BÈus'ùÃ0×u ‡Ã„ù±9aæÔÜu]ÇA€n¨ˆ„óB]X€7-åd•R•^W· íØánlltc±èÌGÈíÇÁ¶,lÛÆ¶m‚ @kƒm[EpB”ÖL§Óxù<*S^^N8Ʋ,´Öø¾Çq…Bù“;ÃdoÏHH›²y{~ ^Ú˜‰°ë.éGåš5kìºÚB¡Ú,aaÛ9ÐZkT~µ3™ –e‹Öšééi²Ù,A‡ÃaÇÁC6›Å¶mB¡PQzBˆâ¼¾ï“>ujÒ‘ª‚y"ñ,¥gDÓJ•…B¨—Ú•ÅtSJ‰çy³ÀÞ——RæT(#‰à8RJ‚ü9ªmÛ9•ËK`¸¼$&NŸÊ:J]°4à§” ´bK—ºŽã µ&”RH)ÑZcY¡Pˆh4Zày™L¥®ëRVVV\ÑD"Që8NQ B®ë¸`ÈJJn›tÚµƒ *´¶}­=O멬1Sc&=cƧa4iÌð˜Ìt§¼S£™Ìi`äÏ‘€ÿöôôɈ¨mk× Y¶mûž§†:;½±ÎÎÌxo¯ŸìïW™áa‚ÉIÛ¤R!!¥«¥Tc­§<¥&¦µOk=šrx\Ê¡nß÷ýI ;§Hr;/™/^¾ómêßñ[‰|®Q´ßÛÚú£†x|Iy]­IÏs•ï«@© «ÔTF뉴Öãi¥FRJ ÁP¿ïôûþØPA¾€•ÖsÛ…E,Ôæ|ÿà˜÷ÇB¨ÀÊ¿mhø¤Ž <ëyÃ2s€P¡.fóÌ5þÂ_¼¸@ (^Îln¾6à_ ìB¯ÿÀüäª~*JIEND®B`‚recoll-1.17.3/qtgui/mtpics/document.png000644 001750 000000 00000012422 11740755063 020451 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞgAMA¯È7ŠéÉIDATxœÕ›Iodǵçw¾7G2“Ì$“d’E©ÊU*µ«d[j[²Ÿíá-ð¢Wý ºwý¼’ Æ!x¯nY^‚§'ÃèÅ{€ñ`Á-Yx²,ÁU,²¬8s`Î÷æ¢ɈJ&‡¢ªªÝîy3"ndœgøŸA1zã7þ»mÛßÐ4% €@ˆÙ&ÄÃw’Qãá8qjÛÑv¡æu@rø[q= Hdÿa[’öA’ˆ‰w9:G"H›÷p¼‚8~øò½ LøæóÓü·oMA˜ÆåtDB-I6k »ÓiùiDÀíÝz'fyÖ`¹d²Uøôn€e +ºÜht#%¨A âD%£O¹èøð{‹ÑØèpL¤úßI’Ñw!¿Ž‚(IÔï$‰ ‚$ô‚„”«ó_¿™%I0&7|B 0ô‘:­” Š:ÍnBeÚáß øÇ/z|z?ä•Ë.A˜°P4™Îè CÁÕªÍ{7"t]Cºz2ú‹“‘™Æbô'k#Çb ŒÃ1†ì×ßIôc0`&ë0FZc›'Æ)“ãlÖb>¾3ä?}Ùe~Ú ;üËŸú؆ÇbÑbqÆä_>îq{wHÖÓ0 md2ÿŸ~ôëÑ…k, þã%›ÁP°ÓLȸßþ«e‹­FÄN3âËÏ8ü—W²¼°êÆOƼö”ÿEÇœ ¢x¤~÷k1¶ ½¡àëCê˜ýdÀjÙäk>7·†üuoÈ—ŸqÐ5øpÃ'N ŠQœC#g¯ñü²Îjy¤ÊQ,0uk,4,†± ˆ39ƒº–Ex䉿q%Ú(FKÏ.íT€òîòYH¯-¾#’‡ã’C¯úd´˜|N’d¥Æ£@%\[Í'çô0RûË :ǬãoBâȳˆ£ño£8?Ž„j²O¨±r*M7è ‚Sñ˜Æ©ÑhP«ÕÈd2DQDEÄIÂÜ܃Á€F£a˜¦AئI±X$›ÍR«Õ hšFàû躎aLOèt:ôz=ƒŽã`Û6†a iÝn—l6C¹Ÿgoo ¸{÷.Žãàû>¦iÒl6I¥R\¾|Û¶¹}û6µZ Ã0ØÚÚbqq‘ápÈ•+WØÚÚ¢ÓéP(¨Õj´ÛmR©†a`Yš¦ñâ‹/YËit’pÆù9‹ùc˜¤ XXX@Ó44M#Š"VVVÐ4l6‹eY´Ûm‚ àÂ… „ìììP(˜››#Žc–——ˆ¢Çq¨T*DQÄÔÔW¯^Å0 µà$I0MÇqÎØýÓ3ÞDZšû±°»»ËÆÆº®333ÃÁÁN‡8އ¤ÓinÞ¼‰a‹EZ­•J…z½NE¬®®rpp@¿ß'Š"t]§Ùl"„ Ñh0;;˵k×H¥RÇ˜ÔÆ³˜=iœœCÓ´3癄ÂG:/^¼ÈêêªR#]×-ðÚµkhšF’$JÚ²ß0 Â0$I\×%Š"¢(Bišj‡â8>s‡w÷dzÒs `’ Ãx¤ =ŠÆ…bÛ6¶mÛi@ Y¡vm|÷Nk“ïL é<ÌÃ#Ðívét:d2jµét]×I§Ó*Äq Œ¦çy†!©T ]×éõzd³Yâ8&Žct]'I‚ À¶mÒé4ƒÁ@i®ëŠß÷Éd2!h·ÛLMMáû>š¦©ñr§mÛÆ4M„jãå `RjFƒN§C»ÝfŸ(ŠðŸ§ÑhP©TH¥Rt»]’$¡\.S«Õ(—Ëø¾ÏÜÜžç‘$ Õj•\.G¿ßgeeÓ4 ÃMÓÃ˲øÊW¾‚‚b± ´Æu]åg à I¢(¢Ùl’Ëåž, îîîróæMªÕ*ÍfMÓ˜™™¡^¯#„àù矧ÙlÒh4H¥RJwvv˜¥T*±¾¾N6›E×u677‰¢ˆ^¯GÇäóy4M£ÕjQ­VY[[S¦#Í@ ;•Já8N‡n·K±XäÎ;¤R)<ÏSXDA«ÕbnnŽëׯ?™‹E®\¹¢â¼ã8„aˆmÛ ½}á _:¯ ˜™™Q¸áâÅ‹d³Y:•J… ˜››#Š"2™Œzg8òÜsÏ)[ JC,ËR`Ìó<*• ¦i’Íf1 Û¶ñ}Ÿt:M§Ó¡X,²°°p. ufìt:Ï`0 P(`š&ÝnWÙ›eYÊ›çr9®]»F†<÷Üs8ŽC¿ßGA§Ó!ŸÏS©Tà .(Çåû>ÓÓÓär9šÍ&ù|ÇqÐ4jµŠ×u‰ã˜ÅÅE¢("—Ë133ÃÈårT«U¥-“›(#Ôc  ×ëQ¯×1 ]×¹wï¥R‰ƒƒ¥ª¾ïÓétX\\d{{˲˜ŸŸ§×ë){l·Û,--ÑëõØÙÙaaaA…Ñ Ôó`0 X,²»»«Ì CŠÅ"š¦Ñëõ”ð›Í&ƒÁ€R©„mÛÄq|DQtk' `~ !( ÀtH¼?77G¹\Æ4Mvvv0 ƒ^¯Ç³Ï>K¿ßW‘C:¿t:­p€ÌÊå2½^ÅÅE• Z–E·ÛU¹ÃÁÁ¾ïS­V‰¢ß÷ñ}Û¶yæ™gØÚÚâÃ?$•J!„ C\×¥Z­ž œ©29‘^¿R©Ç1< P( i{{{Êk;ŽÃp8dŸ~¿¯I»Ý&Š"Â0Tˆ¢ˆƒƒ<Ï£ÕjẮrtý~˲ˆã˜0 iµZø¾O·ÛUホ››är9–e1UÔ˜™™!—Ë}> ˜¤L&C†¸®«¼üÔÔAÐívI¥RضÍââ¢JxÇ9"ù|>O¯×Ãó<µ‹2wXYY!Š"òù<ét˲0MS%\A055Åp8$Žc.]ºÄöö6¦iréÒ%®^½ª2Õ$IŽ„OiÿŸK&£@$IB*•âÎ;”J%¥ò­V ÁåV«¥¢A»Ý&›Í(XlÃáPW$h‡ÀRýe¬—€f0E‘š»ßïÓét˜ŸŸ?†ùÏ‹ÿOÀ$ÍÍÍ©çJ¥ š¤ÅÅÅ#”»‰ÙWWW1 ãXò('6éƒÆÛ’$¡R©œ˜D=.)€É…G˜§(ŠTr¤ëºRÁ“=)½•B9«ržÁç¥3°··Çææ&žç©Ä' CJ¥ív›0 ™››ãþýû*„EQD*•buuõ‘¡è¬‚Æø˜qÁœµã'?¥!GJ¿“6äû>Bòùü‘ÌÎ4MU(Õ4Meˆ¶m“J¥”c’øAª·tŽº®«1òûxßxÿxÅ4Í#ãÆ5S&Br®óÒ™NPÆçáp¨0A­V£Ùl255E.—cggGemŽãàº.ív›>ø]×Éçóª&–ËåT±ô™gž¡ÑhE¶mÓï÷Z^^f{{›N§C.—c8bYõzjµŠeYÜ»wååeêõ:Ýn—ÙÙY|ßçêÕ«¸®ûHœXü—ö+SÙqè«ë:¦iâyA`š&š¦)0"óz×uÕdLv]—\.‡®ë8Ž£!µKîf«Õ"›Í2 ˜žžF×u†Ã¡Ò×u1 ƒB¡@*•²,ööö˜™™Áó<\×Uëz,Ȅ²,•eõz=ÖÖÖÈçóôû}666”ÚIâ8ŽÚÍR©ŒÌhkk ß÷‰¢ˆz½®*E;;;*ÅÝØØ Ùlbš&I’ÍfB¨¤ Fð¼×ëÑï÷U>°±±AµZ¥\.ÓjµhµZ|òÉ'GLä4:Ñ Ž ‰³ Ã`zzÇqðŸÇ², ÃPÅŽL&ƒmÛ”J%n$c²|&al&“!\×¥T*ÑlŽ®éÈ(!ÓcMӔ߰,K¥Ê2W€  Z­’Ífyðà®ë233ÃóÏ?eYJ‹ÎC§F$IXXX`iiéHßÊÊŠú.„`iiéÄ$ ‹‹‹jÜxª*³½ñyÇQãøX@¡¿ñvYôœ››S ×*é±ëã †L^d –¹¶ŒÇãy¸DyÿÃh'¥@λ°ÓFN*vŒCïÏ ‚à 0 ƒõõuþüç?S*•h4ªþ.ÕRÖ礭ˤã8ÌÎβ³³C:Æ4M^yå<Ï{êPöIéT(,„`ff†—_~YU~ä€ÌÜduu•L&£lYÖëe%#Êß# …‘…Ëvi"ððv¼ý$Ÿ «5r¾q“Ÿï¤”ö$U> ÷O¶IX}ª²,ó‰Ëóù<ÝnWÅr×u‡Ø¶}¤`Ád˜Ïç ‚@a ‘5M£ßï+¯](Ž8C!ý~x˜•jšF»ÝÆó<,ËRíRȶm+>daås À4M677ùË_þ¢Ny{½/^TGæ¦iò /°»»K&“assS…½v»ÍÞÞ•JÛ¶¹|ù2wïÞ¥V«©c,]×YZZ¢Ùlrûöm•l¥ÓiÊå2ý~Ÿƒƒjµšdò¨~ssS­3IƒJ–––TØ”‡5¾ïŸ¨gš@¹\Ʋ,2™ †a(m¸rå ÛÛÛêÜNö‹E2™Œº ! ¡²L&ãt»Ý¦Ûí’N§Éd2är99€|¾uëžçqéÒ%i®_¿®žO:T ÿóŸÿ¼ó»ßýî߀ðLŒÛŸaìììðÑG©8ìº.{{{|éK_bŸµµ5u‹äààMÓ¸|ù2õz7n(¨+OnLÓ¤P(ËåØÚÚ"eJš¦Ñl6ùÚ×¾F½^ç“O>Qá¶^¯óÒK/1??šÂžJo½õV÷Í7ß|óÆÿ h0qòTå'‰êäBggg±,‹K—.)¤ØétÞw]——_~™õõuR©”REy÷' Cƒ/¾ø¢:Á‘GÚý~Û¶ÉçóLOO«²úgŸ}¦v[Ö Æ›t¬ãmqóÖ[oõ^{íµ7×ÖÖþø3£‹ÒGèT ë:<`kk‹½½=¦§§ñ}_U‚ûý>ý~Ÿ¯ý묯¯Ón·q]—V«ÅK/½D¿ßçÓO?U™òÎÏW¿úUÞ{ï=uª4^\‰ã˜©©)ž}öYîÝ»G¯×Ãu]îß¿Ï /¼  ðx1e|Ý2‡‰ã˜Ÿýìgý1æÿìOîþ© ½o¡P I®_¿®’¹ë­VK¡ÃjµªœT:Æó<ªÕ*_üâUn¯ëºŠßùÎwÃPU‹¤'—;캮ºU¦ë:ª4>^ •¯@ ‡CÞ~ûíþ÷¾÷½ÿqÈüG§1LãÉÔ€?þ˜R©Äþþ>¥R‰0 YYYá£>âÊ•+Ôjµc瀯¾úê‘ûrÎÉç“4o<–Ëp–N§ñ}Ÿ$IŽ@ïñOÓ4‰¢ˆ·ß~»ÿýïÿÍ7n¼û(æOÕ@m///)2üÍÏÏ«{‚r“$Q±X ó$ï<ù¥ÝÕî½{_§¬$d[’%Y&íô;³³÷Þs~çœß÷÷»¿sÎoÏJÌÁ—¾ô%Áÿ|á _f®•s ?ÿùÏ¿½£y›qÏ=÷œuãù •ª†@ Äœœ}/ÄÙuæ–Ÿ+;ç™3çðÖ=ÓxA?\¾£FC¶t®?ïù¼Tª†eâU=Lieà d 9ZâX¶M¥ª‘/MRçñá÷úð{ü¦ÁÉä!€H0̱3§™UÎqÄÙ÷™%¡ö¬Vv©°PËòB.Y&è«£+ÑÎX>…KvQÖ5úƆˆ…"(.ê¡oì ²,qôÌ)Lˤ5GUÜxUÏ%Reu± u^?¦m¡**Ñ`˜í—m"Wœœ·¾GUq+nÊz…Ö†øêö`Qò¥IS#´56#IùR#ƒ'ˆCÈ’t^ý–hœÉ©"ºaÐn¸dƒ^MÌ´ªNÕ40-“¡Ô¶ã Uu ËäTr!e]àtr€L!Ç”^Á¶Š•’$ƒ°ßEVŠy HD±ìoÅ$1{-0÷¦Ë¦ï¦+Î\‹³ägêœÝÖ[í¬<^HÒ«zæñÚy ð{|+Èÿ5ÌK€mÛ¸\®Ué`ƪç~/Vv!™Á“¯â ¶O´.YF×u‰Äyã[4^J,6àÅdïÿ9#Ÿçø¡-YÆqœË/)+Ur!™ñ±¶Æ`8ãÂè]r?¶½p ž—€ù‚Åjb¥Ä$ß|ÿ†V^:t9½›·.¹Ÿe°Xmë¿yðÞ¹ëUœtOh;ápxQ™Ù}†ãüfXK ZóÉxÊÿ‰žú±Æ¦­×\Pf¦i"IÒ‚^}IX‰’‹É¾öÜ?sù»ªL ç™Pn>/š¯Ôúp ¸XW?G¿ÀÎŽGÁÛ«ÏZìyχp¹\KêDz¬Yë¿­«g}+ý¾Þ+0’ýLÙ—ñæ›Ç¿`?Bˆ ZÙ ¬«a}Çq¨T*äó“ ¼ù_¼gwœ(¥Q/7Ü~?oßÿþ÷‰Çã‹ö7óîÏ`!XUf°œN§I&“LNNhhh ÒÜ ÑÚý Ԧ˱ÿOüOðxë€I¦i¢(ʼíÛ¶½èâg.V€ ¹ºa¤R)&''Ñ4 Ã0ˆF£Äb1®¼òÊóê—ÁÓ²*y¦FsÔïú­ZûÀúõëéïï§§§gÞq̼ûsñ¶zÀÌ@r¹}}}”ËeÚÚÚˆÅb´µµáv»I¢œ=ŒžûÁÎß§òú©Ä?Ë!-Á냂OõHlÞ¼™Çœžžžóˆ7MsYã\ªÕ*“““ŒŒŒ ë:BB¡¡Pˆ«®ºj©·<Åq@–I þ+á¶MP9ÌÏ“yÄþr¯‚¯i€51p«*¶m#ËoÅñ™ 7ŸµWÕt]'—Ë144„eYD£Qâñ&¶oÛŠìZ¨I X€cÃþ$ÏC_êê [‚O¶¤ðÖ ÔøµïâÙÓߪxhE ðü›‚;Þ-±¦­L&3 çÎù–e!ËòYä,„yG{.[•J…}ûöáñxP…ÆÆFb Q®¾úê³ê9Frph@п^é‡tP!“‚Še†s-@O¼o„,‰Þh_#¸æ È?ÍÏŽí`P{/é¹Ë /…\ÝÝ—±oß+³ضM¹\f||MÓèìì$ .¨Ó¢œ‹‰‰ vîÜ9»þžUØbNŽ Þ<¿¬PÒÀ—Z@Tf² 1/|x7üö•Лnoª ýuÜ¡«Éüêi~8þcɃkúýV‰\Æ'¡=!“ÉÌΩTŠd2‰iš´µµáó--©³$|>'Nœ`×®] O ž8ãÈ—![„btÜ.P| ûÁœž…¤úÚjKÆt{–]Ð|5ÅU³´†eí ämxùY øL‹D¶’Æ[9¯©…gNxÄÿ Z “P.‹‘ÊS:zŒƒ§ùAý®é½¿ßÏ /¼À¶mÛhhh ­­@ °Œ,‘—ËUcP8tDeÄZ(Úຈ´`;ÐT/ñXžzâ»üÝ5^Hþ ?½“¸å¢ªõ£¢Ÿ¦ K~¢Š©™üÛþ›÷xhm £( ­­­Äãñ¥ñ–< ´´´ÉdhhŠóެ€Wˆé€$Qû–æd”™C˜#Õä&lpú‡ØSª§?·Žá#/Qêo&RzB¡Lª 1ž×°ñù,„9Aa|Š}‡Fùäïw±aÃTU]qsÉ$ ÆSi›âÜX’Œß f¥ŠjxŠYÜ•"’$áøCÁ(EEöz‘¨L·nÀ- `CãT o:<Ææž5<ÿêiž¼Ôd‰jÙ P´¨”ZÅÆ(¦0´"¶eÔDßL¢y ;wª=z”ÆÆÆEÇÑë€H$B__»ƒÃgð8Û#~Úõn|jË2Ieó”õ<–?ĉ¬‰œh¥Þ£¢UòdõqÆ+$ÇNr` ]ƒO´ÝÀ™¾O‰çÔ7°, §*ãq5 ‘C!Ü] U±C³9¦½‚p>B¼©‰'Ÿ|’­[/œ"»(‚Á Åb€Fapyêë[tvua#á8[8èÕ*òDÂØ(zé4Í.³ršc­iú´$#fšéÓœÙ÷ä >´öVÚ‚1~øÊÓœr ÷gðØ~ÖïèB ©”<ãLYCL ˆ‚‰S`V9–éçè™?cSç::::Èçó44,üsܲòóí£%I¢R©0zfîhˆŽuÝ–mYǦjW©Ú:¦cP6+àÇÏþ‚—^y™‰Ñ NX£ kYn5F7n¸ŽŠ®ñôÀËô½|ˆX%Î-·ÜȦ±Âétžl>ÍÔT=WÅ®Â)ýµ1ö>ùÛ·mg```©¶< óz@¹\F–eTUEUÕYöâñ8X–E0ım K`Ú6¥R‰ÉÂ$™ÉO;’¨‚>ŠcI86È.¨Áš|IÚR÷QtýzT—íÛvP.z#/ºª™ UÆbJhq7Õˆ ªåDéx•—šŠš ¤;üé?dÀHMn²‡|Ñ Oð³Ñ§B¬Þvxxx˜›o¾™h´É’Ž3ú÷ÔO~‘úh¼ J¯# À #9Îtƒ2¢RÃDñAƒÚ™c2} £u÷K¬eçömì;Ìñ(´(h 2fÊ•–ñéwÒÂx³Š}²Š¯`ó¼#ø¹)pˆ%>p¥—k6¨l]ëæŠun^$»èîîfllŒÖÖÖ•{À\ȲŒÇãel<‹šþ"Qí!d„Img3sÐ(ÔÎûÔBC­e„wºÜõÚ¢MÊþ@7VHÅÓáÅ5e ½XÅ.ØE˜S6AÝ!Ô Ó¾ÁEg£LcH"Q/“ˆ($" ›™“‚‰‰ *• étúâ˜ë.‰D‚!Öv6ãÿ²Âxgˆ@ ¬(Ït²×W ÔQP’`kÛe¿ÑOkÜb$gS¬úáˆ;­0ün…!˜¨(tÅe:eB> Ÿ*ƒâÜØ¦A&—cdd”l6K>Ÿ'“ÉpÙe—ÑÞÞN¹\>ÏóýXrAØ´i¯¾ú+zÖµàÞð"ó%0u~¼¼jÊR¥f i;!pÆÀø ¸’à¿‚‹­) %“ø+Íôu:¶Ö4HÔû%EÂë–ñz$YYÁ±“¥_ÿú´èÁƒ9xðàë-JÀ\ˆF£†I!×G£ú$RóæïKWäà ÂÀf F-: ¤ºÀs?(×BåQŒ¼Œâþ(w¼ÛM¬Ü.H.d—‚#…B‘“§ÇI§Óär9ŠÅ"¥R ¸¸Óì÷Üsápø¶ 0µ âЈ5þ-Üöýý Po@€šå5jÖ€M-8Ì<åQ°þÊÃhůà’±†i’/”I¥R 200€ã8477ÓÒÒÂÖ­[‰F£È²Ì7¾ñ €YW^ìgïù”¿üòËÿ즛nz|YÄãM g¦hÐö@å1ˆüHß®±è?µh©éÏ~ü²SpØCÚ›àÅý¿äÀkÏ#„Àï÷Ï.²f¦Û™ Ø 4M›½¶m{Vñ¹$,DÈåÿñܲ%-…;::xñWo°uãUðúc5·äÁ7 R˜ÉÁ[Ô,/¦¯-ÀÛC^¤CSàêàTAPçwóþë¯' â÷û/˜Ó›ÓÜcoç*?ß³{ï½—ÞÞÞ»çS~AÎE,c"=LqÏoíº yàED?ÄJÐ4ÑÍÞ J;H*ˆ*TÁÔëPxR' c‚'ޏìcœùe™ßyÿ{iiiYJ÷ça1˜ûì¾û·÷î[o½õ¡…ÚZ’$±kçœ8SäÊËîEFÊŸFäŽBùÈ¿¡‡Á§N·h×~ýЀ*Hþµ°~#ÐÆXà#¸¤gˆÇW~œ~®,DÂW¾òÖ¯_¿¨ò°ŒÝà–-[xøáo¿ñf|b­¨‰AåW`¿îøªµÙOvÕf± ÜïDhåñ3XÍŸáŸùïßµx<ËûCÅÜ1ëç’ðÀ°~ýú»o»í¶E•_€…ðÁþ.?þÑÙuÕõ¤Ò?C;N¤e#áØ|Á)dwdAÃð0U”F'ºŒ¡~š§}’µ-ólXf˜„¯}íktww/IyX&mmmÜyçÇytï^‚¡.Zš¯àð“8v’º †Ûã‚X–D¥¬cY!Ö¬¹Ž‰I‡Ã‡~ 7\϶mÛ> ±D,|ðAº»»ï¾ýöÛ—¤<,ã˜Ïçãÿè8pàýýýJ‚j5ÎXº Uõ"„®WåÚªNÓ†immáî»?I$Yñ1Üù^¹Ê?üðÃtuu-Ky¸ˆ";vì`ÇŽèºN*•"—Ë͙͞;·‡Ãáe¿ï‹a¾ið›ßü&]]]wßqÇËR!`©–òù|tvvÒÙٹܾ—……‚à·¿ým:;;W¤<\ÂCR—3ðï|‡ÎÎλ?þñ¯Hyø?J€mÛìÝ»—ööö‹RVS˜;¦½{÷^´ågðûËÌJñå/yU,?ƒó<àÜWÿoC}}ýwÞyçc«ÕÞÿB-Má$fIEND®B`‚recoll-1.17.3/qtgui/mtpics/folder.png000644 001750 000000 00000013633 11740755063 020113 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞ pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFIDATxÚbdb@2 < {20ì¿êñ_Àä~þüs†‡÷_2H ²2¬©Ðg`e¨ÙÈÀpì°bGRËËËÅðîÝ (0¯ÿgdþûŸóÿ_Æ@{Ø”â~Ý[xZ`mI`;ù±â¦ =ñ èÿß¿ŸþüøºíÅñ¥e67?ÇÖÓ­¼)àþÿÏããbåOtgHvb8,›—KößQÕ_½öžáæ­ç ÀŒÌP®Àn%Àз—aÝHÀ WèìœÎÈÀ#Íð÷÷#¦¿ÿ8þþåü l810²‹J¥8 þÄZQ`?í)¸zd7+#ƒ67ƒ½ 'Ãþ›_ù6^`Š`°Nôfã“»³4û ´Uv§nÕ•D Çë™åÄ2ÝE}e`X L¬_Ñœóòõ_†#§î3|þôƒ!ØL˜¡.T’a70e„̶s?C Š_Am>6†7~‹²ýþÿîÿߌÀB•ñ?ÛOFVAqB@Œø<î<ÿ½À¿?¿±Ç˜ÇÍÆÄL²úlàRè&†·ÀØ{þØ2Ûø’á!° úñöᔿ¿~îdá‘–ÂÙ ÎE›Ÿ¡:P’áPÓ `ùŒÅ?ÿ 1¢ß :pò)óŸÌ€u~M,Ã_`‚íÙ Éç?Cbþ×/T3€’7(€Ê`c‰ñÇ/†ÇÞ0p~ÿvùÛßß2<’øóëу戮€N½ u2 œà4÷M ##S?04å“MùÂuYÀµ+?-ý‹„ÿ=³öØW†]g^3|ýþè¸ÿ fŠ\ 9®’ JRL '_ ´Ÿ¨ÿL''/`¸tóƒ?+C°}o ÈÆ0˜†Î?†zèé_@ÿü…]è Œã+—ž1ð~ùñîßÏ?þþbøÿ›á…ЦWlߎ†z‚r´Ã„ˆ[¬ «…ŒLÌ~†Rl 5N\ ü@U@ûÞ3@hlÀß‚›ÁË”›á1°”¶W‚8ì!0Ì?G-à@àúƒ_ Ï=ÖQÿ€$ÁfÁÇpüCþZˆÇAcÍMú¸ô‡š$ó›¿ù€ÕáÇÿ Ëÿqý``gdâQù÷守 ”pšó Øÿ¿Ÿ—“•¿Æ‰ÁD"þ™˜nHŠƒû=$¦Ð=þXðí=û‚áÕÛo þ† ÙÎB ?10´ ¹÷ß žEó(r`àÿ2ƒÔ±S'0ô¿1üáø ª™E¬Õ€pWM@(ÀÈIJ^U”ª7Xõh’ÿKaJ›N~`¸ù胉CW "ƒ0?#ÊKÀÖ4ŸÃÊ·ÿÈžþ$þOŸèÀßþ3°231|ÿÏ̬u¾ÿÿl ýgýÃ̧a4~´Yü]+@± òükGFFùnxPý BýÿhûÒo¾~ýÉÐ É`¯ÆÊ°ØÆ_{Z­Áb™fÀô8>ÿ3|øn*óp±3|ÿò‡¨ç0%5›0C2pá €‚ÀߟߘY8ùÔ mo*5€NÝúÁðòý†•)2 ‚< s€‰XÓ¡æs´<þÿ?šÇñùä¥ï?Áj˜YÙô`ä1òüû÷÷#ö_Œœ"Ú@ÜÐf1 ŒžÒÇ¿Ôm^¸ÿ‰ÁOA–a=°Mö㚇ÿc&}ô¬€Ëÿ Á¿Àµ¨àû ì)òóýÉÈÂJÂÿ BFfnfQ[h`Ôz€/¯^ÑçŸRÏóÀê™áÃçß ŽêÀë tÈ4’/1 >\!j ëIä2ƒ‘˜ þ1²ügbæføÃnü°[)Nl#€‚ÀÙv¯·ÿþüºúüó_Â-$"hôÔ*3‘ebxò -¦ÑØ Xø øR0¶ÿý‘Æ>ƒÚ$ÿY8Ù™ÁÌÇðŸ X°ÿdä–ÓƒfVtc9 üÖý|03à°u(Åi@½úŠ%öÑcM%‹ ‡xô'ÔóHzÿA Vv`Æ$€þÍñ“‰MX¨ƒÚ;DÄ‚Ôø™ YC)ˆ×ÿQ!®=þÂ`*Ï f?ùˆˆetÏc-P^U ½ÿŸSÄóÿ‘ M›™™ù+Ã6ÿ8¿2rrˆ³ˆÚ*ÿy}ø>4qÃM &hãç°ñWã$À !È@•8zãÃów?üõùžÿÄ’ô°Ôèõ>›ó_ÃcžRþý‡§øÌù<<œ TÀÅðƒ\õ1‹9:@«C”Ä @Lß^=xÔÎè­ÎÉà ±ðl9ÍÜõžaËé×ÀÒŸŸAKŒáâ ìÞ,ù£ ÅŒß@ùþ¼Ä‡èû‘àÝd`6`ffdRQ`RãþÃÄ) *øÐ«C€b:Qeöþï/;ÝÿAqáwðú†¾Í¯^½ÿÉÐ"ÉPîÊǰç ÃÓÏØc=é#'ux €$_€¬_áÉœá?j[H}<`§˜!Æë/C_É/_K.Fq3&^5Øø¸Ñ÷íùí)Ï>ýa¸ñž}Åpö†ã·!Ùûß÷g¡Õ!@¡ûñ÷¯O¯§ï¿Å:éƒ3ƒ+–¤áUô¦*FŒ¡€ÿA9ÿýÃây̘Gæƒòz˜í7£ïÀÀû4W¬ÿ‡ÓŸ?c¸}ûÃ…6]6 ýýöçÕÞåßžx‹?€B/ðÿŸ®7™ûïïŸÏKO}Å( Ey˜@½E6\±Œ­„Íö@=m«Ç‘°Ž 0Öã>3ø›þ$*¹ƒèÑ£ .ßgXt”aÕ6†ïŸžŸÿy­£ú×í©kAÓ ‘Pb ¬£X_ÞÎÞt¹(ÚÜxþ ^†Ûo~3°¡õÿÿÇž×ar Ïÿù‡%•àÊçP Êëqß| ~cëÿñ†/_¾1ܹó„áìŸ «O³cýÏ·ßÏ6Ïû}á~Ðü ƒF<Þ€*4­„-þ}{q{ —pÑÆK?‚ô=HM 6†£·¿SÞ¡+äòøŸ¿hƒغ¾h -õ‡!ÓþƒÏ_,Éý?  Ç_2Ü{ø†aùñ¿ WŸ02üÿþ ëíÓÿ}úêñÐøü ‹+€Â:5vmZØ-ãÆKkŸ` Ò“§P¾—bfXýñ1°² ʇÿ ØGuA“&¿ÿaÝÿhÿÅ\Àr'Ê䃇öOpY뚉‰2úõï ÷î=a8yó;ò£¾ÿÅúVX¬ƒ<ýë?Ð;º„knðÏ÷—w&?cç Ùuóƒ›:¤å¨% ñÝÙ'ÿtÁ}ôž,éÿƒæ{l1+4%R¬0sý%*¹ƒbýéÓ× Wn¿fXxàÃíçÿ°Åús¤XÇ„sàçõé•Ï%lSÝ>ÿb”ñÖå°È<,QÿþùÏ`#ÏÊðî¤dÿ ­Öþ@§½@lÐpøo$q˜š¿ÿPù 6;Ð!†ÿ,ó=–t…IƒJxP^_{øÃÜ=?^~ø Êë3ž_ôÿÏgÐÀÇ=hàÚ |³Ã¿¿¿¾ß~Š™cÕÀúW‚\jhJ²3œ¹÷ؘæDiù!lÀæ U“@¬.ÆÀoöA“ØXÿõÙ;?3Üxú‡äXG„¯ßóÿÚŸÿÿüz:eÏ °¨è3‘ggµŸÃ••{g–ïÑÛíÈÀ Ìëa† ¥.ÿÎF 2ýõë†[·3,Ùõœ¡vé†O~|ûýtã”ïgsZ€žM€^‡Æü{b§6ˆÐú€_¿>¾ì:u‡yâ`þÒ‘dbÐ’TL ûoýdp3bgøü µ üûûxr쫈20D=/È )äÀóùXKwˆçA±þüù[†+·^1LÞüžáÚ£ŸÅ:2 b€¸ô«¯Ü6Wš/Íì1ôìùÂðìÍO`ÿ_Ü üÃÍñ}ù Éÿ0þ/èÔ6h~Tàxi20H Õ¹à2’´!u=Œ†°AyÔ¨Yuà-ʃ¾~ÿEt O  bVˆüøõñE×ÉÛ,.›ÐºRÌ &ŠÜ ]W>‚Wy€—^ µóqµô´€žÖÄ8êvç_¾|Œõ× ½k_1\º÷j±Ž ˆ˜±×§¸ÌþûûûI;žŒåÁ¾Ýwó'ƒ0;já‡üÊj™öUi?aU!´ºS``ˆzœŸ ¿çá™ÿþ2¼~ýáÂõ— µ‹ž0l=ù‘áûǧç\¬jùûúðiÐ\ ¿…N‹þg ±Ãÿî. ßþ÷ç—S¶B&Ý4¸n<ÿÐ`Aꃇ¤Áê£T#OdA „?~2<|ø’aÎÖG é“2\¸õæíÏ»‹:¿Êlþ÷º±Ž ˆ”°¢jg~r*¤³²°2„™ò0Ì9òAŠŸAY‚•áíwHÌK«4Yà½}û…áâW åó<3|{ue÷× Íþ¼>q( jÔ<¤f¬#€"%þºµû€^ˆÌõÿ C¬Ä>ÿüÏpøæg†03^†çÀV’%°©¬ÆC¼ lóüù{†y;ž0Ô-~Ìðàéû·ßo-™üíÊ„õÿº õ<¨ ûJ……*X@‘:ú™Sð<“°nÊã7¿ØýLE€ýí7 úB F"ÀÆ ³*Ÿ>ý`¸zç CÑì{ 뎾eøúòòîϧ&ü~yì<4©?‚®ìúEíXGDò$ð·G'¿òªºðžÍ=ÊFŒaßÏàjÎB‰“„$ÿ•aÁîg • 0Ü{òîí×ë‹&¹Ð»þÿ¯t‰ud@ä΄q+§< +!dâo'ðîÔ†CU*5}ÿþ‡áΓO µ‹0œºù‰áç«K»?í]ùçó£‡ÐÍKhÏû@‘»Xúû÷—Ë3›ï½÷è#çoŽÞýÅ`­Ì†7É/Ú÷’a°ùðþÃÛÏW—ÎùrcÙ  Ô3(†rÿèˆÜuÿ?ßÚöŒW͇ÿÎ+Fs!†Oßÿ2¸ëòbv)ÿg8wûC0¹¯:òŠáÓÓ‹»ßªšðãéºæu\ €(Y,…¯²‹hDüøõŸ÷Áû? À2“5ÉOÚòìùÇÏß½ýtaÞä÷':ÖÿûIÿ¼Ž E+a¾?=ý•CÚì>‡X+;++ƒ±"'¸z»tÿ3CÆŒ» Ûξcøñòâî×{Ë'||hPÄ:2 j¬…â”Y?ƒK\.NØ(:Ò¨Å0eûs†)Ûž1üùúöñ‡KË—~¼¸ð4¶,¯ãD`â×O’ãÓ=Æ-"( ÚOðñëo†¯Žmz¾-oh}Ôã¯è]ˆ‘Jæ°Ûµ:qK(Dýûý•ûó­g>^]wë ÎÃâ×[Ó#͘‰± ÔÜOÐ|þe 9B €©l+ÒÌúoä ˆÁ  g¨'k²¢aIEND®B`‚recoll-1.17.3/qtgui/mtpics/html.png000644 001750 000000 00000011360 11740755063 017577 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞgAMA¯È7Šé§IDATxœÕšiŒÇuÇUÕ=×Î3Üåµ$ÅKI[2)K¤ŽÈŠå°eXˆmÅ |$ð‡qI>(ˆ3€b˰É6 PŽa‹ )¢cZIuYeI¦ÄP\’+î5³³suwUåCuÏÌÞ»ÔʰШî®êêzÿwÔ«W%è xà¯S©ÔmBØÈ €µ€äµíoŒ{·³ ¾›ùÞ¶út`°ÉïÐÆ eû}«m«èCÜg«7cèè9ƒ_­V‡î½÷Þ™U…×ùÐÝÝý¾;ï¼ón¥$nætiçX,P „ B¾ÿƒôÿLvÖ{³?èîîáÄë–©ªÁ`1ÆýD‹±É…+µE[' m-ÖX"ëXrÏNê:i¿ÓÖõëž{¶`ŒuqÙjÛQO<“üÏý¿ÝÆýÏZK#4\¿5Ï—?¾‘ hæ~ Ô‰× ¬µÂÃð˜ad2bS¿ —¼z!bÏF`Y_P çF#²]‚Ñ)ÃÅRÄMW¦yætƒlZðâÙF 0m,Z»2ŠÔÉ{c1Ú m»±–H»¶‘NÚWÆÌ'ß'}µúNú3–ZÓPmj´YµVj¶Àgi€,J‚0УXß'¸TÖìÚìó¿'ëò’5Ý’7ÇB>ysžJÝðæhÈÍ×äŠØ2âåsM¤c]?R€2 ±TAw!ܳ-âwñwÆ€’I[¹ ¦I c ¥390³2Ò0Ð#Ùu _ Ʀ iß9™‘IÍTÍPè’toIQ®Œ ²‘RÊÿû;C³†8_ÁHÉpì¥&‘1x |R ”X`ºaFÊž ô(n½6Ç®ÍéU x›×R4G,´ìîü¸f¼ÓMËso„T– åª@Ës¯7h%ÍÈPªj„€^EêAÛÌPÓøÞù€ØŽ­YÂÌUùyM å õ†¡„XŠ9³€@°{‹Ç¶u2ö¬–Þ¡¶ì¿:í~¨aS¿"Š,Æ*Œ¬a°èK=°òwßÔã¼uçÌaãg{o Æ,ï\{Û1óXÓî#鯳ìœu’¾m¹jc æ˜÷¸v“dŽu¬ Ùyî“`¡-´«,ˆ$è±íf­j;£li}¹X¤2€Õ¦ÎAJC¸ƒiKݵ³3"ÇÙ ÎW·x; Òé9³_‹f`Œ™ÑñjPbB@¥®™œ6˜ø¹” —øžh7Œ:Yšk§õâöï°œyòµÇSãÅsMJµˆjÓ¶bõ´'èÎH6õyÜte†wf¸~kŠlZ…m––þìwuZk”ZXúð0ôJ>^æ™3 òÉîÍ)îÞŸgÛÚ=í_K!gFC^<Ûä?_¨‘Rðѽ]|l_–E3œŸ$´˜ô£5xÞâ,Î…WÀæ\zy¸ÉÁ‡Æ9u¾É‡®Ïóí/làš)ºÓÎ¡Úø>JŠLëû‰šæä›M~z¼ÂϾ3ÆÝ7äø“[òd}õÂcœOúË5çUÑká»GKüë/KÜy]Ž¿ÿd?›Š>aäæçñj2zfF'³ÌSJØ·#ÃWfxe¸É÷~1Åçïîêáš~a&ÿ\ZúË¡· @#4|ùÇc?Sç+Ÿ*rÓÎ,AoM…­6NâÂñk-ÈÅ¢s‡Ëº¢ÇWî)rä¹_>Tæ‹èâý»24¢™m’~ÀŠœàrQKhªnøÒ÷/q¶ÜäŸ?ÛϺ^KSzÑo_štPÓ5¾}w†þ^É}GJÔøÈ{247Î…Ìa%³Ùek@¨-ÿphœç«üã§úɦ$£•™Ì«Xå•$‚ТøšJ6x|úönþw™b—`ÿÎÍÌ!‘~{ú}‡¦ÁïwGž.ñiǼÀâ AœÑ!;V†ÆBC/šGšCÓ Ø¹Îg÷¯ü¼Ì÷þ¬È†>ÙrŒ ­Äöº,µÁw/ÑW´ìÙe´a”¤$$f*:–dR: ­e:ÐhãV“³äds¥V à¦Y{yœûÿ§Ê?}"€VPnÞ·Ö.)õNZñ4X©þõ—eÞœ®sˆ, ˆ øñ÷A,!R „pŒ ëÌ \×T›&Nº¢$Æ%A|)0ô<‚Ì*ÁàÉáSU>¸'Íûwû4W7[õÁ©ÿª›ÀÑSuŽŸ¦jŠY‰µiOˆé¤-H+@;ÿ/¥›ǦC´†žŒÄ÷ ÐN+<)PÂ%T¦ƒ¹Ü[\äXÌ*^¨×xðÙvz(Iœ\:ì}ÛL7 ÿªJ)éÏ{äR „ DJI¤X\šKh·’ÒR®i.•B¡c®Rw¹äÓëI&šÐØy¥ÐT£-Pó̹O¿‘áö«=jM}ÙAÜŠC/ ‡<÷f % ,iß# ‘¶x¾)1ÆÙµÎ# #㣥cfÚg•j†Žõë‚™—–ÓèÞªûMÈþírQ»_U8~¦É¹ñ&[7¦5”jšFdB"c‘±ÍK\Bãµá:ãS!²5¥$×Ï „p>æÂD„0P©Gœ<1RöYßëò——CË`ºi95ܤ\ Ég3l^›!lL5 Ým€•aV6–·J!µ†AʕۧÎ?€@Ix«12!­ Ù0œ/‡œ™È°© 4›iÀbêiJ3Ö|ÊMÆÆÏK4±Ðâ”¶5 0‰ßפÆ+aËAZëÂêH»MÓ\ZñÙ»Ö²i­Ït-â•3Gt`ؽ³‹ýiÖuydT;ñ:›.+HÂÊÎòŠ\ZBd)d$¡zUÓæÌ%¼6¯O³®?M&­ð<'y/^$ùñ–š@Г‘¼{{ާ_ªÐ-µ¦ÆhÚÛuÃûúص=‡6–ÿ»Dð÷ ’•*IµaéÎ*|å´ærh^šÍf+¡èyJ) ]’5½>KÞÈ”dd<ÎZËš‚Ï?½‘õkÓ¤R O@Æ“d<ð¤DŠv#…d°à3XðPJ0ÝÐ\*E”*XØzE–÷(",mÀZ¦fëº4c¡‹F×t ”­çß ¼ìHÐZK†„aˆ§$9åqõ`†£ÖRkhvoLsê8ͩа{G/ëúÓ¤|EΗäS‚”’­˜¿5ž„´/БÁ“’ÞŒ¤{]Šr^²n}Ž«¶çØyE–©JˆŠ,ÓÓ>>ÎéÁ ·ßÐNjà ö\ÕËæ«ºÀšÃç¥hÞý¯Dý“kmH²oG–LÎc¬²±àSèVÐ4z6f¸ã¦"}=>ÝYE!+ɥ܊ÏóˆKá.åÊ×÷’ñ%V»ýFY®ÝÒEoöìÌ“ñ%i_’I+Š}>¦qå†OÿªÄ³/”ØPH3ØçÅü×R´äb¨sggï¶»wvóì‰1êuÍ Ûsܽpë~éêSܺ·a×?ðž^þê³[Ø»»e-}Ý'^(Ñ …^ÝÐËødÄøx“ý×¹j›ÿßÎvƼ>`>õ±@NYîzož#×xþù1îùÀZ>zë^ X|2žcÚÙ½@ȹÎÉÅngèšíy¾ôù+Èå;·tá§adéÊ(Þ*‡¼ò›in¾¡È=w¬%áÞ;˾}îØ[`K·^2 ^µÅ¸èê¢åÏïäK''8ùF•Ï|Lq•Mq¾ªBàÅç‹ÕC„9û!ÉŸò9ɽ½îìIÎ <a`xï{úØ5˜¦WB5|⛈"Å®"ä}{ÙÓ_B+:`,d…æÃ{²|æ¶ò³_ŒòÜkÓ¬íVlëõèR€pê0/…;š%…[Þ*1ó^X0‘[=B¬9Âå6®Mó§ è;ÔÆš–lÚg}Îc{¯~[¶¿( yT!Á¦lÈîZÇÞwøöÏÑ4Г–lÈ ú|øpôÕ¯~õÁ§žzêAà`|6?+Ò!A099IE³ê _NÑcêŒ]œ?×à©_MsèçÆày‚MƒYvlÊ’NIJ•ˆTJ22ÖäöŠt¯I³çº~ú‹iL½N¿­—u–fÍPùd,óxý‡z(úÚ×¾öàSO=ux¸ÀR&ØÑbNP)E:niBbÖ‚Fà‹Át‰ÏýÏÇlæÕaó/×xítóo59yºN­¡ÑÆ’ÏyäsŠS¯M³g7ä£ …Æ$).@¸C˜´w~µÖ3˜î¼—ñtÌüOžxâ‰E™ŸÀr(¥( cˆ¢­u«ì”’1š>Uçæm‚[®Ì`ÈQi‚Èj‰1†”Ï’ÏZ†(¨a‘j1$¥$ŸÏS*•f0Ÿä¥”>|8:xðಘŸÀr)ÙŠJ¥RsÞ'å cPzó¶c6q·—(;Ž–Ï–p¹\frrr³ÕþÈ‘#áÁƒ:44”0q1æ`¹kéù¾ë,;iñÓzK÷Ù©]ý'’?räHtß}÷u2—ªY”Þñ£²«E óQµ´%)yä‘è¾ûîû˜ù,“yø=f€J˜ôÑG£¯ýë³m~Ù[¥óœ_~:é·M‰PJa­åÑGî¿ÿþCO>ù䃴m~EûÄ ú€ßEê {=~ãßxðøñã—Í<üžšÀ±cÇÂo~ó›‡f1Yéß’©îرcÑ·¾õ­Uaf „žç¹ÔÖ§¬›”Ä«Í<Ì ÑhØ“'O¢”ZñÃw’&&&xæ™g‚‡~ø'Ç?<Ë*0³x饗þëĉ¢Ùlf„‹ÇÄ¿EB¨‘‘‘á¡¡¡Ÿ³J’oõ=ë¹lò«Ñù*S8Œ°JÌÃ\îÐçåF®ï$i `™øHß3±çlIEND®B`‚recoll-1.17.3/qtgui/mtpics/image.png000755 001750 000000 00000010371 11740755063 017721 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞgAMA¯È7Šé°IDATxœÕ›[l×yÇsÙ½p—Kri‰Y¦)Ó’cFòE¾¨Fd§ëÔH…ß yÎ[‘ú”‡4HQCòH#§°èÉ@ NÑ6 I娲JCWŠ,#Þv¹\^ö6»;3çôawƳÃ]r))‰õÄž9ç›oÎ÷ÿ®sv©Ð¤©©©b±Ø?©ª‘RJ€æ‡GBüóîµûÙz» ›klã>§eMˆ†”æºô­¹ó²Í}Á}K)uÓ4?þîw¿û¯Hwûüñ¿ôÑG5DZ[¹$ ø4ðTÚä¶Aë’ÜYÂî<­ væQ°l‡sçÎÿlø7åP.—µžž¨S'¦ý~ÎAQ$ŽHé~‚ˆæœ 9ŽØNÃNÓŽhðI)A‚ƒD6ïR"dƒWH‰hò6Öšcéã ¬K)qd«,!sÒ'£j =ãÿö¶mÇûš° !„‚M˜Y¶ëpxTe½(P¹p£Î¡!Û\˜©rô0a~w½JX‡§'" $5®-VùCÎâ¹#14Uaµ`ñó‹E,!¢–#%¶G4®›ÀØM…l!qé[ûœÏU¾YÅ´$ÏLLÏW9<æ¾”ÆÏ/•¸¹RGQ$c÷…(›*ŸÌšÔ,ÑL|8·„hŸüîÝî¯M8Ž{o Ô5K²ô–e!¤¤7i*à@o\AÊF8ôÆË– #%X¶äȨAÝd7lTŽŒ†É²™ù¿öåžF‘¢™¡c)ð2¹”­ÝÍä²¥"à]KupçU¡n &†ã¨ªÚ±n·x€Ð¿8ºM‡Úd›qóÓ_Ðe`NÁ+§Òw” Ð(ÑÙäW|=„EmÜßaGÛBàn’¿#Ûi¼_ðsg¾ <›h´³A[¶ljÓ²îy/;ñ !v•£î¸zt;VÝIÎnà´ãsçÏÀ^i'º¹§Ýšã8(»”_/lÛ¾k!ЭõwÛœÿ>—×?®Ÿ|ëlGÔ$è'ÿæEAUUJ¥õz½-_· çâñ8¡P˲ºÚW× ¦§§™››£T*J¥8xð G¥§§§EÁvc—,ËâÃ?dkk ]¿3½Ã²,>Ìøø8Š¢tíhee…ÕÕUlÛæüùóܼy³ÑTøHÁ#<ÂK/½„ªª»†‘¢(ܼy“ÁÁA^~ùeÏU÷jy°l§¥/ëÙÕçÏŸ'‹±oß¾÷² ÿûÛß²°°Àðð0Bž{î9¾ò•¯´"„`kkkÚíÐB0::ÊñãÇqÓ4©ÕjØ¶í­«ªJ(BJ‰mÛ^,»< °œ¯ é4MEU@¡V5I½½½ÞÞoËVWWYXXà•W^ià6-®ÅüŸíÆ~·$¹ _¹r…\.€a!…BÔëu/¡ÅãqÒé4†aP*•ØÚÚ"‹ÅX/IÆ k –-øÅ§9ìZ™—ކºN€( ,Ë"‹qôèQ.]º(H§í·ŽÕÈ+)‰-ÅRã«[:–A7\÷ Öv÷z§)ŠB>ŸGJÉÓO?íÍW*¦§§FÖßÜÜÄ4Í– P«ÕÈår 011€¦iLLLpùòe¢Ñ/¡iã67¹ú“îžs´¶¨ŽãÍfÙÜÜô»™ÜŸäÜæÃ0 ¯œ¹<¶mS,yñÅÑ4 h$ÁK—.‘L&Y\\$—Ë188Èý÷ߢ(”ËeÖÖÖX[[#•J±¾¾Î§Ÿ~Êää$B¢Ñ(û÷ïg~~ž‡z¨¥ºè†:z€ã8,,,°¸¸ØR Ú•A˲èëëckk ˲¼Í”J%ž}öY‰ÐH´ÓÓÓ 233C<çë_ÿ:óóó\¼x‘ÕÕUúûûyä‘Gñ/!—/_æÈ‘#X–Åàà ¹\Žb±H$ÙÖHݶ¸ä¿ÉM&Bˆ¦Ëµ~=æ˜[=\°‰“““ž¬¹¹9R©Ùl–ÑÑQFFFøþ÷¿ÏO~r–\nÍã;p௾ú*/¿ü2³³³Ôëu,Ë"“ÉÐßß”’T*E>Ÿgdd¤¥¿èæ  #{yéØí¯^¯366F,À4MLÓ$‹‡ç[ßúgÏž`düRýûÈ,Ýdaá2ÿü½ïaš&ßøÆ7˜››£¯¯L&C*•¶m‰ -M—»•ñ¶¸äZÜoí`Œù»-ÿœß‡††<™Åb‘p8L¥Ra||œóçÏ7•qò•ðÍo¾J2a9³Á›§_çÚ¯ÀÙ³g9vìÉd’jµJ(Â4M/)+ŠB­VCÓ4ï¹nóÕmÜ&‚i§¤œàº‚þþ~OV¡PðÞãñ8?ûÙψ<ø*‡O¼Æÿe.^/°Qð¥þeà$ù|ž?þ˜x<îP,½gišF½^ïhí=å7y¹ÔIÑ`¬uÇÝ  dµZ%‘H‰D0M“……[ô>øUf25rÅ:ª¦ …ÅZ=Nß§YÏÿŠ•••E\9BÂá0…BÁ³º”’b±HµZ½³*àf}¿;ïJ0\ü亥®ë¨ªŠ¦ièºîuƒ‰h‰p\Ci„B –-éÑU¢† ÐâÞ.¹¥¶X,råÊïÍ \.S.—9vìØ…@»r×Îâ~^??4¬åZÇmnTUÅ0 ŽŠpH…Ìyö§%cc ÆÇb:”b º†²~Þd“““Þû@(ÂqlÛ¦R©P¯×©ÕjÔj5êõ:ÕjÕ{£¼mªÕjÛ„×.\ÅÛ´¶Ö(mŽã‡)•JD"Êå2¯½öÏ¿ð5’ΛŸœÂ¨Í2˜,¡þ—üÿü ÷õÔù«—þšÇœÍÍMb±˜¤{FP.—[:V—öÒÊ· W`rñ[·]¾Òòò2“““ضM,#—Ë‘N§ÙÜÜdbb‚oûÛ¼ÿþû” ×YøÏSd"1jå}J•‡N>Ï /¼@­V#•JyVµm˲( K»m×wÌ®eƒ9¡] þ^HUU2™ ÄãqE!“Ëåèïïgyy™gžy†ááa>ûlšüZÛ¶ÑC!Á²,fggI§ÓضíõT*•–Ó`¿!öÜøÅƒIÏ?Þ-Ü9h„ÒÕ«W9~ü8¶mÓÛÛËòò2år™H$ÂÒÒ½½½œ<ù¼w4&„ ^¯³¶¶F6›eppEQ0 ]×=÷_YYÙæ…< +‚Ô®åíäöÊ ¢(\»vÑÑQúûûq‡t:M&“¡§§‡ÞÞ^J¥RËëpµZ¥\.#¥dhhÈ+iÑhÔ³~.—#ŸÏ·*¸ïnó@[?qûù`'èË_pÍ Z­ráÂ*•Š7ŸN§1M“[·ná8‘HÃ0ˆD"Äb1úúúˆF£Ôj5 à ã8Ðè(ççç·µ¾Áq7ñ;¼ t*u»5HA€Ü\páž|òITUÅq’É$µZB¡€mÛ¨ªê…¡mÛ^Îp¯¡qŽpóæM*•JÇ#ø`ïF»&ÁàC:yE;0Ü9UU™››Ã4M{ì1âñ¸÷Ík]˲<¥ÜZïoÅ …ssslmmµUÞõ¸v ÜþS]Øþ^ìüüÁ&Ê•±°°Àúú:?ü0CCCèºÞ¢¨ °_–išd³Y–––¼Ç ¿ò.¹²Ü$¸ mO…]¡þøžø‰D¼Þ?˜ \ÅÜ ^¿~l6Ëðð0ÑhÔ“/eãpÅUÂ4MÖ××)•J$“ÉmqíWÐUØ0 ¯¸>55uÆgù;R|$‰êG}´rãÆ¤üs÷¿>jžjŸ}öÙ­sçÎý¸ÙÛßåÏÿ£ì‰'žè- _-‹J)uÚü¹H×uecc#W©T.ѨówEy å_ê4 ôòúOÕ€Ñê&çÀˆ` öܳ7ÏcwyøPRÞÐŒ7gºWH7ªÐmÀÄl‹ïÿv‘WÏUYªYŒ@¹HÒÕbñ² aÆxÁT[ÊÉóuN]¬s÷ž<óh?Ì“ØNMa#+€Nb3íÃ6 @~~f™^çúRB.úò†ØúDªv–ú ¥¼¡\Ta±æ¨4‹UËBÕƒV!g0çßù·ïÏñW”ùë—1éâiõ»WjÿFÀ/£mAk•ç9ÏN/¡ê}:N|2sï¾<¿½Èá=yFûCŠcºÊ$êhÄÊ|Å29ó›‹ N_j°XSŠ9/Øïžª²Tsüýãý|`#íwcÐŽ‰Uþã—süäô2Qº$ޏï@žÏ>ÜÏ D‘iW™²tµ«ZF.v‡ì yä¶Wfc~ð»*¯¾ÓÀ(ð?o7ê3<õG%œ] ŠÙõVÁü–ðýß,ñ³7ªr3O=ÖÏg?6@.LsøDQŒ#íì#NR”wŠ XÏÆ"þåÉAŽE¼øë*…~|¦Î»"î?Ñ›ÝvÖ zC¾¿JÙÃ[¡7/×yéô2…È ªs†xbˆG÷Aºr Ò:ÌBÕ11—Pmx õåáàXÄ@Ñ£|£å\Z ò™ú |çd c¼eýøLƒ»v‡Æ ·›n&”ß´T›ŽïžZÂ:òNáïäÑÃ}íš]ø%òO_¯pær“…ª#NÍ7 „ñÁ€O?ØÇÑý9¾ñó%¦—ñ–‘’ðO”ùôýE¦/ŸkPÈ.M[þw"æáC­”ßnàëÕ¾ˆl¨Ø›À¯ÎÕ¸< ÍÄñÄ}%»§„¦¾™÷üç«K\_´F#äÓ$@©EˉW*\º3Ï{3 ­Ä§Éq¢Œ–#J/ØÏqWžÁ’áú¢å§oÔ¹4öÔjÂÑ *¸gOÈ©wcZK™©8Êy¹åþ¦ò€·'šˆxsÝÑòà¡BûžµÊK¿«²XsäC¼þÅCE>u´˜V‰•±~Ãî¡€c?«0³d=XâKrýaç`ÐU‚±~Ã`ÑPkz›[v5jøF¢Á–]`¹î˜˜IȇU8¼'ÇØ@Gûçß97“ œƒû÷çøóûЍú: Sïç#eÃÇ"@Ä ÂPŸa¨$ØåB1‚b(ñ®Toé:»Q[£-¯ç–-•¦# à¸c¼Fê”Sš8Å›µ 9åñ#IO†j²s ŒI™vú â³ÉŒL`0Æ€ˆÙ^Ü(M/Y@(äv ù!ŒÀÔ‚cbÖ’ ’2|p‡Ïð·:{SU¢Ðeº¢ÃîáÕÌ5Z¤‚õkˆ\ˆ¬*ªôÒ¶ƒàRÝ[ŠA(ç C%Ó.bN/Z±ú]"ü.ÑÁ±ˆ\ä“X‰5Ô[ŠC i»AÏÆ«c¾âhÄ¥컑­ÓÍi˰Ö3ˆPˆò‘Á©bD˜Z´Rþ‘@Ø3¬ÊØ -š˜¯x_Ä3V*cýÒ~Æ/k•Ë³Š¨C-”Í-`3Ú²A`07Ýζ·²XS#©ŒÂp_g†½‘¦eazÙ[LxÀì/ EI×ÿŠ TðÞ,äBƒU‚¢¬³Õ¾5Úr#i“.l²CxëÈî÷Ù`8£ªñ;P×— yŸO€Ñ~! |´ŸQ¾5©TBî7ä"1Û†YhµZþFbÌêÙGÆ&Õ©ßtN—µ1m¦EÁëpµ€À…)Gœx¿ö‚ñAÒ' àê¼yrézcGûõÂvÐ*°Ö’$ qA[YZ9Ø'ä_±‰a¹¡ŒE¾0\6Æu´navÙ±s°“ê©úâ|ÕqvÒ‘1^€&„±~¯íéEøÅY%q¾lf¹@<(ª†Â}û”OU‹ÞâŒé|¶CëbÀzäŒ{°š«ùÞ›öÂ1õ@uP*ù«Â|Õ£w6¤/…9îÝëCàÉ B3ö (ˆRv *·ïRv¦ Pkyw…œRˆØ0Øö­1rÙ«œ¼à£SøÝ¥€RÞ2Ú¯$nÛ¡ìRëPi‰Jye ¨” þ™}#0ø€c¡*4b!)}9¥”÷‚Ò’\[N] |ÕïZ¶#½¥”xË~òÆ`jA¹<…>"üê‚ðÈ¡„ñaÅ©ÏÇúaÇ@VêTT¥}bCþ" öe,øû Êä¼ðÛwCj±`Ä'@‡w[FÊlš`ûFàÁƒŽZÓ°P3äBhÆÂ¯/æ¸}—åö¶­Eç²ÔfõdTÁjwíÇkWÄ›ü»×C.^ °iDHœ°wÄqô@ºë¼‰ú7SèM À©7ÓGî°¼ö®°T7>UU¸029°wıkÀ1Xr„)py®WÎ;›ŸSò UajÁ01°XKˆ›Kˆ˜t¨ޑЪCãl?Š"šÍ&ι5¥°JƘƧ0ÔŸ8œðÖ•©…c|‹­ðîuÃåi¥/¯ öùïBN D¡_¶¿jÄBµ),Õ…ZShÙ42HB­2EК'¼}Æ‘X×ÞÝhO# Cœs,//¯ÉÔ-ï :…¾|ì¶„‰9åÒt@µáÁ14B=†ÚBZ1N³Ä@¼“;'ií¯“h_ù1®ÊŸ<4ξý‰›î0wV¡ëÍ=ªÕ*Ï<óÌÌ÷¾÷½-zœfÃLðFIÉòËøcj!`jÁ£ÍÊ`"æ½àRÿ•®óêê€@ ¿·%̺„0W¤ØW¦°…­¯f³ÉñãÇgž~úé¯OLLü˜éí³­'Dœú¼àÐNËþ1ËrM˜¯–êB¥ahÆ)ƒ*«ð0%  Tp a¸d.ê¨\ó‡Tµ½6•){o[£Ñàé§Ÿžýüç?ÿõ©©©—€3ÀÒºØ.Ê@0XR†Ë6=TéÃWœ-KÛúùȇ<“¦Ï¾Ì ´âìø{zbÜÚU w[D†ÔëuŽ;–1ÿ#à zþ'°®n$Ø eY`2Vˆð)ßÊ·¦‘¡SEW®L3æ»O~ô~GQDµZ娱c³_øÂ6ez@ðƒ:)ÖMž¹-bL*€õ,<ó•J…gŸ}vö‹_übÆüëlÀ<|À'E·‹2åô c> C*• ßüæ7»5¿)óðp[¡^è=ü$"„aHµZåøñã[Ò|Fz è.ÊôZ@¦ùçŸ~¦‹ù }¾—>ôè¦nt3ÿå/ùi¨ÛóðqŒ¬µXkÛhâĉé/}éKÏLMMý›`>‚ "T«U¾ýíoÏ|å+_¹%æá#$€ìôWµZåÅ_œþêW¿úÌäää–}¾—>2ÃZ­Æ /¼p½‹ù3ÜóÐ%€ X²ï ‰Q±¼¼ÌK/½4ýµ¯}íÙÉÉÉ,·Ÿ»ÕñÛœ6 9{ö,aþA2Â%k-ÓÓÓ¼üòË×Nœ8ñÜÄÄÄÙ&æ¡KçÎûák¯½Æq\Г1§OŸ>uùòåŸp‹>¿jì®ëQàn »ßfZ.³lÏÙþã žG‹R² IEND®B`‚recoll-1.17.3/qtgui/mtpics/mozilla_doc.png000644 001750 000000 00000010532 11740755063 021127 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞsBIT|dˆtEXtTitleMade with SodipodiŸô/'tEXtAuthorUnknownŒ! òzTXtDescriptionxœKT(ÈL.)-J_~êô ,©IDATxœÝ›ytTE¾Ç?÷v§ÓéN:;{ Y!‚Ž$ £ €Fðˆâï=% 8ú@×1Â;8€ÀÌÃËc^–1‚HD"`6BÈF¶NÒ[ºïòþiºÓMÎ|ϹçÞúÕ¯~UõûýêWU·îðÀž={¶wmN+ŠâÎSUÕ“Õ+}+ðµÌkÏl6WÌ;wFsZë) 44´wbbâ½ü #%%åGÏ´—šµÖøÊh”ÊT@UAU@Q›žP½Óªr™Oo~UEšâQ¶9¿¹¬ªúÍ÷”§ú©ß«]ÊYÍiã€AŒÝû­B´>€ªt/,E>Ÿƒs×ÿ´l?öµ‹Pm /.G©©À¾ûK䊋˜æ}€h@•\T¾<É«A>¼†´¿w&­1…ùíªBÌ@4¦H4Î"†wA0†´p ïÎD.¿@Øg™TÍLí’éD¬Ø‡mÿ–VÝîV†—|‚J}5ÎB:•€ 7 AuI¨.'bX4ÁO¾†ëì l{7Þ¼V_T¿T±­"Êé 4wŒF):€ëØ> sÞFÿoÏ¡Zê¸c£'Ñxl?ÃG_ÿ6ß´:¤Ýë2÷¢XPÊ‹PªË±ý°í¨I¡]0/š€vÐH¶ ‹¿¥Ñ#;ãf¶ýºÀ¯Ä)I`­G;~ª š®±ˆ€V½ìH*f½zy–h" º@Lsßqç_&{Eîf~/Úå4xFò&fÏòÍ´f¿²Úݾš§AqÊB4Í5êÖWnË{Gi׃ßårùm›ß B;]ê8Z®äÚË»Qü²,ûåi3^Oø³N˼Åßrvó„—ÚÒæÕà·ìtG¬7Ñàæº¼'í7QÀ­b}EQP¥Õ¸vÓc€?ÚT’$Im¶ë†Ä€Î6´­¼káWUÕmý›æ¿µË{ÒÚ³>´±¾VtÖšéé餥¥QXXHQQ’$a2™ q_‘‘‘<ýôÓtëÖ­SÖ‡Ö×6mî;‹¶uæÌV¯^M]]‘‘‘ 2„!C†FRRGŽéPü1 .dÁ‚Æk²>Ü h…ç͛dž Ú1:­†7ÇÇD¬^%D¸$k)q|u²„]' °Z­$''óÅ_ðÖ[o1{ölDQô"Š¢ ªª—Õ;äׂÖ,±lÙ2Ö¯_ÏŒ»²tx(fAGž]äïç*Ø’yÎÍûê¸áü9®‘À» × 0˜Œ&bí¨ 5<:¶˜“™Gyvg'‹/QQQARR_}õkÖ¬áöÛow×ÙQëC+›¡kÙ x*"//÷߀þ½ºc7½«‘»¬ÕŒYÃçô&§ÆÁþ2Rd 3¦ Dõò¨FFè5øØ¡d þžÌœ\îÿìNI&++‹ñãdzeË‘eÙoûo¨´fýôôt÷.lãñ_Ùóë*²sÎòŸ³¦1þî;Ð7‚Þý$^Á…ÞRÖZ2¶^Q€ñ®‡¹7v('MÁ ^¶€††¦M›Æüùó™7oááánûu[NUYYYîÂb±jÐÓ…_JK>|8ë>ýŒw—.%ó…Ö<ù µ•—˜:¬¢¨AÐ!Cš:ØêJ/`uJ<<¬_þÙ+O–e,X€ÍfãùçŸoSÎ5Å€–.ÿý÷ß3{ölJKKøË£ <\Ï÷á·ó]ŽîÝ»³yóf²³³qÔ !B'2¦o!ïì-íw DXüÝY2ÎW¶Ú¶Å‹c2™xâ‰'n\¬¯¯çÀìܹ“M›6¡( !ú@RŸÉÀ`( êMq©ÛÙB,Ezv>Ep §ÍÊ!:5MÁ¯“Eå÷÷”–Õ*ªª$%%a2™xä‘Güò\õ8zô(ï½÷©©©îywxïn¼>j £ÔJºt5`0êr8™låž{â(Wtì/¨dóCý0ÉV´²„ê’Ái:?õ%çÃo³[å‘$‰çž{Ž””&Nœè“ßiÈÍÍåõ×_gÇŽô 71+~uÓs›PGH”ŒN4¡ì`³ 0*`µ0Dv2ebOô& ¢£ž‹U.]=ô2‚æêœñÅ!¡|è{äÇØ±cINN¦¸¸˜üü|ÒÒÒ¸ï¾û|ø:U«ÅbaâĉäççÁЇo-&´§H ZG`€ Òå1ì¼RN Ö]N¨PSë Z’9'vã!]‚ÃÑ™fx!Zõï9©©©|òÉ'¬\¹’±cÇ"Š"F£ï£S›¡×^{üü|f޼ä®v¢õ•MAƶë’J ‡]áì/Ywg-®:3šŽ/][BÐjDz…‡p¾ªÎ+oÓ¦M³aÃ"""ü–ï°ØívÖ¯_4Ö˜ÀJ´ÖŽï«T#Å…7ÎÙ—sš½³ï'¨æ'RÔ8 ¸ÚÕ·¬ á‡ç(³É<ºñ¨O~zz:=ôÛ·ogذa>ù~ƒ ¢(>#‡ÂqÙU7ÿ”ÊØÞt±_h¿ªÈyÙÈ?\!¼žV€¢V wÖÓè”9eW˜"¢u6t°ËÞµî²üŠâçÅçŒ38tèyyyLž<™ãÇû–÷'Ôf³aµZq:n¥œ>}Ú‹çWãmÈ m^ÕÀ?Ì+4ñÇïò›Ž·.cnj§Á|}ª¼]9m]šújÔÚKõÕh5Þ݉‰‰!++‹—^z‰²²2-ZäÓ×V‡€,ËȲŒÃá@«ÕRW×4¾âbza«7a¯§µ¡å„rB âù£f̶ž¼ª:&103¾?ªóL«²ÚGSA—>­hG’¯Z¾|9‘‘‘$''3gÎ22|o;´–eÙ­€ÙCûòdP5‘Ö"<êBU,#6UƒÅéb³Ô…49 5àÀ”¯¶Øx¾¯Êœ´þæ¾c8«‰Æá*p§ÇGqq1K–,Áb±°dÉFŽIJJŠW¹A›Í@¤ ÐÓü ’*` ÔH"6YâG1Š´ZH˯ ÖšË¸q}°X,n¸³?ÏîÆc[Û%’X{É5Xÿ2/J¼Ý_UU233Ù´i|ðµµµ¬Y³Æ§h‡0pà@ö”šFƒ$Q.ê) „¥ü|É‚Ý^âu {ðàA÷óGïåiC •U9è´zG˜HßÍÅc\kÿíÆp>û®À‹–ššÊÚµk™?>?þ8Û¶msïQ<ÑêépËkîܹDGGómv‹ÊCH8beJzŸUêiéÊ /¼à#'4HϬƒ9øD"sôUåR܃“S†p81œO (ªO`3„Rnìѱ@ˆÈ6[’7zóÍ7Ù²e z½ž9sæÐ³gOž/„´Z-&Là›o¾áÛ³Ånznn.F£‘ìì+ëñ;{uåã{û1ÀUI€bASU„ÖeCîª=ƒ¨^ñž5ªŠ&þÞâà† Æn¼º¿Ð‹¶téR ï¼ó/¾ø"QQQŒ?Þoù{€ <õÔS>¼’$ÑP_Ïß&æø”‘œylÿ¸+”Û+F0—RZ]ÃqgÙbò…jÅ`\ªèeEIpŠäƬ_Dþ•Û·¾ÀhqJÞ!tÆ LŸ>ÌÌLxûí·[U`§ö‰‰‰Ì›77ºƒ"ÀbyX)ÁPQˆ$èhÐQæTÉ èšÜ:ò*«Ý¼½ÂCxfp‰¢YQ¨EG Ã,°öt9 Œ%®®Eêȼ ²ÿ¬ïbìÌ™3L:•Ý»w³{÷nRSS±Ùl ^¯ùnçÎG'Ož|¯Ýno÷L®¬¬ŒmÛ¶ñá‡b³ÙX4j¿ê¨$cv-)çÊ8x±±±Ô××sþüyrssÛìο'ÞÉŸº7"Ÿk“Ïo¸âØåûõë‡ÙlfÚ´i¬X±¢©£‚@PP)))?N:uT3ïUíAA G¼üòËL›6;vpâÄ `0èv[7}¾˜Aƒy•;þ<[·neåÊ•Ô××{åm{|4£,…¨E%~¿è“Tpø‰ /DIlhA #55•uëÖyMÃ’$!˲—Ñýz€Ãá¸î_‹x¢¶¶–ùóç{-J& ŒaUd šF«ß2*Þ‹+þ¦3YBÑhÙ©Ñý@HH’$‘€N§ó’¡Ñh(..¾8wîܘfÚ ;m ááálܸ‘Å‹³zõjR ËyIèÁ_¢uè-¾¯ÈƒG1îõdŸ<ß÷<þqàÀÉf³½êI»¡ßµAHNN&!!€­“F|g„FAlú@ºÅ%_^{7[»3íÍÈÈPm6ÛÂ… nó¤ßÔo„ZB£ÑðÌ3Ïp²Ú†ñÌq&^ÌÄÅ?õ]‘UÁkÚSÔ&ȲŒ¢(î [{ ÉÈÈP«««çO™2å¯-ó:µ¸ט1cE‘ÿ+¬DµÔèBøÆJxŸ8Yõñ€æÓ_ÏŽ·¥Ã‡«Iþ:›9šÑ·o_fΜIö…2¾ÖÇñZ•‘Kèèqé| 냢4µÏ_‡ýÑÒÒÒ¸téRÒôéÓ×¶Vÿo:š1yòd>:ö+Ñ&#oD:±Õ[p‡·ÚSBZZ«V­Jo«óÐÖ×ñsÙö0tèP÷ó”»xŽšnÌï¡G67ͲzEžGàž÷æçŒŒ Ö®]›±k׮߷W·—\ë'2W‹¸¸8wã:Å”SuôîXp®ÅLpE­¹þ‘Œ V¯^¾k×®û •¿$<ð›¬ZBEt:˜mvâcº3ÕU‰Ãî„à`ÄÆFd§Ëk€·ÕAàøGùåËU™{öì¿¿Ãu߀þ\šî ŸŽè…½°»)‚ƒQƒ@Ð\þqÊ;zzÀ±Ž´aiî+Û÷ÿ®3õúõ€›9þÎ;ç^³ÿñþ4\¸@©;«•ƒ‚iÌs {üÑÒNdÃôÕ²’1)? èlÝ·Ä8pà€ûùOå±K«åtÙ%ÞwÚG‘”¦—%Í#Ú3fÿtœÐ/—•ŽÙùc/²ÛÃ-¡€¢¢"÷s^e ¿Ë#ÕEØ­¸¢¢PôAîˆÖì'³Nüù²ò1{ŽÅ´”ÙQüæ+AA()ñ=7ˆ ±–U`‰Œæ¯DØè@õð€ìŸŽcütiù{Žõ¸ú÷ª·„¨ªJŸ>}¼hé™n·ÝÍÑz;ÞÇÁ|šìõó‰„|ñßåî;~M‡[D[¶´ÿשÝn'##ƒ½{÷JõVëËS÷os…×Qx) ººúÂöíÛu:]„ ·Ì ˲`6› o-X°`Óõ’ûÿ»£^SdT_IEND®B`‚recoll-1.17.3/qtgui/mtpics/pdf.png000644 001750 000000 00000007251 11740755063 017410 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞgAMA¯È7Šé`IDATxœÍ›{Å}Ç?ÝóØÇííî$"ÖÃÂŒB[1rŒyN%˜ÈNa§•„¤R®TâJAÙ”‚)D1Ql‰ ˆ ƒ–! BÖ-oŽ CÒ=wïö5;Ýùcnöæöv÷vïAøVMÍìtOÏï÷ëoÿ~¿îéŒbÓ¦M‹£Ñè?K)ÃZk 0z*B)Eð¾*¹ G¯UàY(P®;îwð=Á¶TɳÁ6QŠQ!'ÊP"·ÖÚÌd2{o¾ùæ”Àô/æŸsÎ9מyæ™FA)ð…Â;”ò¤ôÊ\´ö1 ¯¬ J«µ\U¨©,XKÙtš-[¶Ì¶Áç‹1"n4™4øÕ¯à„À² ¿ ¹b1H¥ §Ç{èÄ=ź»!“ñ)À7¢ëŽ]—Þ/=J˜RNáºÊóyôÕW“]·Ž\.æƒA  ”ZOáƒáúë½,^ »vyX¶ÌSÒ²`çN¸â „dy>üÐS¢P;ÇSÎqÆß/=J†ÅLA-[†»nZk ¥åfðG‘â¶ ¡ìØçŸçž ¹<ó tvÂw¿ Ç{BïÞí1bd"OÃ;¤ôêFuø†*eÁt 5˜fÕ*²b‰aÀ•WBk+<÷œ'X6ë)›Éx ‡á¼ó ­Í3Üd”üb¼y|øxøaxÿ}¯w/¸N; ZZ¼²ãÇ=êoÜèù˜Ô ~1‘Z{=½ÿµ•‚_„¥K=_pï½ÞxÅ`xòù1'WJkŸÚ¥÷KÇÿ,±G8Nmp](À‚pá…žÒ«Vy‚)å)ÙÓã |ê©púéž_X»Ö+÷½»¸§ƒe£gíŸýz£ï)†BŸ£¿+†»Òò`=ÇA®^¨â`Ç3@)˜;.¿¼ªÕj…®pö¯u•²qç ’~Þ¡õØýÀ½Òz¦ÖÈB¡¢ŒÕ]ätìMÿ,„'xðÖ©ôÜ$gÁ˜¡ük­®”H˪(â¸(0Y¦V‚½ ãB¡®ž&<7™Š©ºR¸“ä•ÃàLBJÈçPþ„Âõ—£þâÔ¯‰k˜Ÿ“ ’aªÌ™ÄÂ, qÂvò¸·ü-ú›‹©³3ØOÿɧкh –!=ÊÖ TÅ÷”)s]1Ih.2 P(ÌȘІègC?ÒÑDÐ 1¬ºP]oÌdên{2ƒ¸®;n†X ³6‚ž[wì'‡jlÂYô„“Çìýˆ|> „¿z(^î·ϧÍ ˜ Lt|€«ÐýÇAˆÌn¬¤7'®SUùZÞUîw-ÎÏÇì:A­Áo ¢à`+¦Ì‰Rºæ1>•ÞŸŒgƒSDUao!HÌ#Ýãf|¥N·÷]×­Éùù˜õ0¨qÖJ°Ãci5€0p[NÀÏ÷*)Uï°¨%ô1#¨*¬ÖpÚY°p©—(…ŠFQ 1d€¦ÓÉ`t>£u‘úµ qap¦¡µö&?-ó_¼œ<B+Üx3nC#F!§Òû>õëÅ´0©°þϯ~ ›Š3B·e>nS+–œ~ï—s|u3`¦1 µGýÓ—ÃÊ/A>Z£›Ñá¦a”®ŽÞ÷©?LË5 «Ø!¸ò› -0Mìw˜=Ý`ÚSê}Žãååz¾–H0+³Á² @¼ „D&ÖGïÓ°û †³¹ºç~ÙTÇ}SfÀ”¦­¯7çÕ·LšžÞóÞ›d Õãv¹w¸®K¡P@”²êQ Sb@5å«öæÅå/mXX=]4>ù É‘”ª}P(ŠÉN­ O%Ìî\À? ©!8ü&Ú´=GhÙÄŸ}„Â[dQÒN¹ö}åg u`JÔ—ô…î·Àðš+É/^†Ð«·‡ø£í ¦R¸U²A_ùjoÚNp:¨J]CÂ[‡`h¤däü?$yÉ×A¹(;LÓîÇà@#ùòi¬RjÆÖ+JQ4@=±´®Þ÷Ÿyeä3¸sæâ´Î'÷嵨Ï~œ<23Bëw‘:ö…À'øRÊ×Óó³’•[¶*gqg!Ñ©$z ¡ÁY°ç„“°›[àºËFY6Ñßí#òøvRÙ<‚1/_.·Ÿõ!Piž]­nEß`pä0â혙¶sPv˜0 õ¥KÑý1ä²`˜´îØLöÕ}¤²ùY¡{9L0€Öšd2I6›­èm뢾!aßNHö¡ÃQÒg¬Ä4 lÓ!p¿óè‹ÐZcöÒÒ~;CG{PÓèõiB¡@:&™L’J¥ŠÆð¯9ö á}>{q7Â)àœ´ü’Ó°…@…LšÜ§N!ÿ—ß)Q–Eã½Äº—äHzì=B€£ÇÌ~€-k€ åÇ!N“J¥H¥R¤Ói²ÙlÑ9i­‹ëzã¿D9Œ8¸ß£ÿ²åd1E ™É¦q/½šÂe×x;: “¹Ý‡~î1†…‰ˆDZ#òYïP."AHcFP\«f‚ (¥&,5ûå¥/ÓZ£íFdzؽ=èP˜äÙ«@JB¡Š€À¹ñDÏaŒß>trÌÿÙRva Žö †‡¼ê¡î¹ଽkœ°«^Lø0R "Ȁі —ÁØý$¢à[t é¶„ض B"LÓs’ÉdÏaôÉ‹áå=h!°z?¢µýG£Kh á*´a ¥¹çi†³yrßøkšm«â°¨E‡²_†f"ÇÆ0kñj˜#+.@5µÒkDD¢A¼ñ*ÆožB¾°ãõˆ|ŽŒíJ …ІÅÀWÿ”|Û b/=Gã3#5œdxx„øœ8¦aUtÌÛªðÄ–-dǯÇQÍ­ ]pF(LÃP/æÓ?G>ó(ÆÁ}ˆd  “]t*™ÓŸáå_ÀJ3¯ýß‘C}­‰ï}ŠáÖym+àɇpc ¤ÏþR+„˜^2;K Icìú_ÐYv62Ÿcþ|Ÿèþ燻Ц ¿øT†/ZÅðy’_z²e.‘P˜p4гì ìõxï-¬cÒò“-að’ud–EÜ40FW”¦*ïììG/ïA&^AG¢„Þ›…ßÿ6ÆÐ…ÖV’k.#¹êb2g®DÎ[@$¢Éôroþ®ÐŸ_Cþ®˜íw":žÔn¬™¡5ké¿ü›DL‹æææš¿.W¸(à£nhí[ÓD›6â£÷‘Û7A6ëèä~†þ+þœÔª‹q—,Ãnh Õ²ˆX&r´ƒŠˆl½`…ºõAÙÞc¤í(…¹óiЋÕÔû“-¹ÏŒ0-oÍïH7æÿlE>ºÑsì#g®$¹ú oÌÎ_@ƒmÓ`[X]eß+Òuq²YúŒ¹–)äóÐßGNJúûúÊÎGJaY†aàºî„M’0] „"ÐwùÈ}?¿Ñý6:EHAöÓmùÞ˜ñfZ¢a¢¶]¾·'éÁT?G#?{—;Ê=kYÝÝÝtuuõÀĽTS÷v\ñËû1ÚïÀxõe óO$½f- ~¹,W} i`NØ&–É&‡‚‚ë²páBÚÚÚê3‘Hpÿý÷wlß¾ý!`˜#”Õ ®×‘wß‚ñøƒhÓfè®aàO¾CÓSÿ1ØÇð\ÌðÊÕÄ ICCCýóÿm£õý‰™¿Z*g¹v‰ëׯß{ß}÷ýØ/­S¤;„|b;òŽAv½Cfùyô}ýÒç™Æßî¦éñ(´Ì£ïê¦M<Þ8mOí3Ç_ /ÍVË]' n»í¶ŽQå÷oùš P–B‚ñã`ܳíèÿ³øÚ·'žÌ }Ghܼ‘apÝä—¶Ñ ‰DŠ‹Sÿœ¿éÁ_ Êümš&‰D‚[o½õ…öööÿª¦ü8Lº$fYÈÿy׿¢šZè½î&’kÖmn¦%ÙKèßþùÆïH~å*/½†ˆ!ijjš‘ì28ã,]žÃá0lذáÅZ”g€ &0À²á¥ç[~R2põ_1´öZâZß{ sÃMðrés¿Hß·n …h3gÒµ Ç}”ëùP(Ä¡C‡Ø°aþ-[¶T¥ý¤˜XË@ìÛ CèhŒøÓ¿ ôÁ»DriŒýÏÃ`/™ó/äØßü1w>óæ4c‡B3ú©Íu®ë ë! ÑÙÙÉí·ß^íÇ©Vîæ( Ë?sæA²«û-ìwhÀw©oÜÈÀU×aÆ›™ÛÜD8žÖ¸ÂW6ïƒ ¥–eqèÐ!î¼óÎŽöööŸ{jUje@>«.Bÿçã¨ÝO«“‚i“[rÙåŸG}j)ñpˆx,†iš³¶ Y:B¡‰D‚7vlݺÕïùw¨Qy¨' (Î8ã³çbäò¨BÛUD…Æ–˲¦ë«!(KpضMgg'wß}÷ [·nõ{¾.å¡Þ<`tFHB– MØÇ2¶?,Ë"‘H°iÓ¦½<ð€ïðêV¦˜ \kö¥PJ!¥$‘HpÏ=÷ìݶm[ÍÞ¾Ê`&Â×LÁZk¤”¼öÚklÞ¼y϶mÛ~ÆiDEðIoÃ0xóÍ7Ù¼yóÞ™R0 C(¥ÊΙÿ¿aš&d×®]¾ò{w™¦ò0@$IïÙ³§ë•W^‰×²Íüã‚RŠ‘‘óÀ;vìhgÌáåf¢ý"×W¬XÑ”N§W'“É%Úû›é'–e‰£G~˜Íf]Ìò0Þÿj›€xÉýO r@?ÉFÿIøGÅÞH6dIEND®B`‚recoll-1.17.3/qtgui/mtpics/pidgin.png000644 001750 000000 00000006754 11740755063 020120 0ustar00dockeswheel000000 000000 ‰PNG  IHDR00Wù‡sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< iIDAThÕ™{tUU~Ç?{ïsν¹7$À%$ÈÃH!Œ5ƒ©::¨£v´vtúPW•βkÚªÕb«N×èR§øhír|€"`«ãˆÊP;*‚‚¼‘G !áæqs_çì½ûǹ‰JDÛþîúÝó¸';ßïþíßcÿްÖòÿYœÓ1ÈO¬¯q"êÇJrQÎ7uÖ¢úzÎZ‹µ¦p´Xc¿wÌ5XqÄö 0¯û>-¾£á³ÞcНj;ŸÞpaQD.ù£ÙÕ%#+‹EÔ;-sr”dr>;$íã¯nêìÊä®|jÁ¼7z~<šù©éOn¸è_ÞÒ•ÍûÖc¿N1ÆØL.oï^üN×õ÷¯¼¨C¿-pÏ‹›½l>Øý³ù㱨{º&û %•ÉqûÃo4v¦3£^øÛ«ò²ßuåo9ü AEcì7¦ñ¨ÇÜ©µƒ©nè7ˆ§æ7vPÄX0Ö~ƒ Sj"G΃SŒB³Ì5ˆ$ÔÔ6Ì=«±Î#vΘþÎA¿D(E = NÑ¿m|ë5u_™7à“ì[Šºñßò4ÉÆvŒáQ­-®«HçrCàKZ`Ö° ®ôTäî·t@UÉÈT‰Wú¶7ã,Üu;9¼1Éó?|…KïŸKå™§>¥ý­„/I࿾µä¦3nz]Ê’Û¥”÷ù:fûêÕt˜$™NÊÛ²cÁf^û{Ô5–Úñµ8îéϽÅhÍ—&°µcÏ¥®ë,QU9j¤SU=ÂMT%ˆÇc´4µr`_#뽞e‹_&çç¸ëç?e¹¿>Æ|9õ‰†aŽtþmdMÍŒï]wM±§"d:³dÓyZw%9”o¡¨$Bu¢š±uu•DÙöÉvø³{9ÿòn¸ë¸ÞéÏÆ„8i"›øö•Žã<9÷¢‹‹¦Î˜êÜq˜ÎÖRJ„!%BB !RPQ='*Yþò š“Müõã÷0¼vÄi_Yaî~Ék?ÿSqB Ô'ê¢Ñ¢§o¹õÖxĉ°cígXcQŽKQ b! „XkiÙw„XYW]s%ï¯ù€…·ÜÇ?-åœ>¿è¶@Ÿa´>Ñ é¼xùw®ˆ)ãðÙ¦XcJ •B9Ç•HG …rŽ'Q®ÄñÂël*Çm‡˜^?òâr^|ì9´µ§EŒ6'& …üɨÚÚº gއv6€K¤’(GÎŽ«Ž*:FÝpèäÁv.ûîeüúÙWùlÛžÓRNô¶Àq6­O4Œr]÷žùWÏ5noBkC[[’®tÖBIi C8ŽƒRᲑJ€è5Öb­ ³#ŧ[>¥+•âŒxjÁ£Üõ̽xE^ÿÖM/9aB\3ó¼zWE{s'ÍÍMŒ1š†këQŽâÃ77²fé{Œ¬Ié€â‚/Pø é®4»¶ïfúÅ“™yé4„üæ¹wxê'sãC·âF¾‰ZÀ‘ÎcÆÕ¹mͤ³*F⺻¿[pT˜û' ŒšXÃó÷¿Bñä1¸Ž*8³@ èŽjÍûsÉ.dæÓ{ƾöÎù´Üþ/|°ì]f\uþW"`Í |@3>1b(éö4¹®,gÏžˆ‚Ýî籞å“UÛ7}4õóÏ£eß‘p)¹áºw<:³#ÑYËÄúñl~k|ûQ6¼º€is¦ppã~´±ýVS89Ž€Åz^ÄC¬`ì´°Ú\vßTÖ æ¹¿ZÀôKÎ!ßé[H8¡ºŠ¨Š¢s¯.z›ª©•,_ø&g#ך%,ÃO]…cq”H÷MÀW9 k,Q'J¬$ @GsŠ—–/!Õ–AûšxyŒ¢H!ŽκrU– .ãã7¶“íÌò«%Ï’M劋Kú=ûB€h”¤½OÝ"„ д£€Ù7NcPófÊU$÷·‰Dp" ¡>ÿŽ«PJQ^SÊ®w÷1ãêÉŒ Îá[7Nàж¯<ù?‰Ä"жŽ.vô…Æ«„´xñë–~¨s«iøá f]7…HÜÃZËïþ}Å•1„(få\>G4Zh¢ebƒ¢4~ÔÄ ]ÁÙ—Œ§eO’µ/|LíNè7ò¸Ë³ÿñ~&™J/î“cUBHD:“)Vüý›Ì¼~ åUel}{›^ÛFº#Íà åX, ùxÃGŒs^b]r“ëÿ,”VÇQQÁ¦×¶²þ•ÍhÐÈ!&ÕÍ>%ÐR@ÄU *vÉåó<óÊ×òå> „6Ƹ¦*…#‡ÛX~ÿ›Xß"=IÑ å£Kð}ŸŠÚ2ªê†3uâ&ü“ o}—’ú›9¸çûÖ7-¢bŠxyŒ•ËWpÅŸ_¤êÒã@Z -YšÚó£‡Ä‰zŸ÷Ǻ2y>klæ¶žIut¦>^ú©¾-ÆSÀo±T\à p°V“j}‹Îö‚è(„€‰#Æ0¢ü0v×oHJ¿ãMJ¯FŒ:Ÿw—­%ÝÙF¬å &\þ36º…õKc_z¿§G¡¿3°4ÆÊ_ÜNS{žq—L6Cý/*<ƒ‰EÝy?x+“Î=²qÙÂMÝ`OdèNJÝÕ¶µHÇ¡¥Ýã/¯~û?äH‡G×ÛK1còìÞÛÊ@)RòÞ¢ïÓE C´Ku컼Zr~?›ßºúÉgû?§^ÿÀ0Ï•;­¥H¨,°è©•i0w¬{îÞÇN¶¼úô@Ø»4Æ"Mh iU5ÓYº*É—vùž?RQBp$’¸0ÄÛòF,™CþP³µÖ¼Óe‚úYg!ëk†•GéèJ³bõ†¥MOœ <ôF…KÕn „¦6Ú`Œ¡¨(FkvÏþg1…m)ñ˜×³O(îUæ¬mŸÎ¨sç±wïÞ´6ú·}(Џ?ýΓ‹\%‰y‚k<œIgÒ7¬}üqÿ”Ô'Øx¤(ŠöõçÝcCxn,F[ª«ªHúçóà¿Vp8ù¹£ÉÂê–Ý]5ø57F8p`¿6 `Ú5÷LÊåýI%ñ(kÖm .»uQê`SÛœ K¾þEàáø%4)Q•È뜎ä³>Ž+1Ú„…œ¡Ã­£µ’ÊŠÁ”–}›E¿ZÏø˜7+C¼mµ¨øUƒ+‘JÒÕÕ%!Ìž½Eëà6ÈÝü7O¬Þs°e©få¦eîÿ2àû"0clÝ8·³56\ÿ„•ŸÑ! P9 µÄs#L2“d[’_,ÙÃÐâ­Lröp cM·1|XoRIg u,€¼ðXÿüƒaûÙe>Š€£Ü9£FŠv´¤ÐÚ6ë!C¯%¶¶…ÀHKYIe“Î&&ðßû§á öH N„aRСÃDðñ ÷ÂÂþ`zù@}¢A Áê†Ñq8…5¦0ó ƒÑk :0è@£}S¸¯ ×a%ÕëZ9hL`|M&•câÄI¸¼ßH¿ˆpymÕ˜èáíä3ùÇ5:Œ@Ý€¬Ý÷´ÿ9™n üÂý@cKgkŠs&ŸS¤¤³ >Ñ0òk!àH÷ïΨ<+Þ¼µµ.ÔÐ aôÑFÝÇîþÜ"¦çØ‹\ élI1¤r_8¯ZIgÓ·†Ïùq}¢¡ß­ýÞ"¬µÔ'&ŽÒß]ræüxÛÁd‰Å-wzºÊ)ôTï~á6RˆB”½†µ=%‚5„W1tL%Mû›Yùꊮ¶TëŽÀß[Ó¸jëé pÝôÑõ‹‡E«‹:[RHGê ]Ù«¥‚TJB¡Ñ݉G/€žÃ Ï2‘M;7Îú¬—NJ çg_:tøà”DbD»‘ÖüÀH)…uQFYim€*Ф=ÏÅq…”Ž”RIB!º݃vgUa… ‚­Ac­¬õtà&ÈÆÏFçΧ† M”í<°³¶¿6~ºoSf_Ëîöò’AížÑ!Á€Š2áëˆ(¶Å2tIOºx®‡ë8Âu]ᛀX¬ˆ¢X (%m&› ‰kd l4Gûƶi³ñ’¨ösí<’2"ÀøAÞfó¹uïæŠt6uÊ/zÞÔ'À-hˆþÆùŠÏZ@é5«t¿Ÿx°þ¾©ÿ¿"§%þoÊÿAÜØ\ÜVIEND®B`‚recoll-1.17.3/qtgui/mtpics/postscript.png000644 001750 000000 00000006243 11740755063 021051 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞ pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF IDATxÚbüÿÿ?,\¸0™™ÙÈÿÃ09ø÷ïº8L «D"‘ÀPKÈë?ˆC/!÷!ñY¾}ûv¶¹¹¹] €X` 'ggç0fVVˆ˜"FFˆ!0‡03cz€8™ÿÿ6ª«ùØä°ˆ1ñß_¿–-[& dÎâwÈJˆ)”ùøù˜öíc`xó†ƒbàçÏ ?~00ðñAÄž=c`øý"÷÷/ƒ™Æ&þçª<6µÿ‰ NÂjÿïäÄð/'hü_n ˆ4à €àð dÄtõ*DÀÏâù/_Ža`°´D8téR òL ( >ŒÆ…qÉcÉÔÿ€‘ö73ä?PbÀH¾Ä‚”‰ 4(‰sr20°¥._f`ðð``xõŠAD„áâEp¨2°³CÍÄ„P²ñAd>Œ+p`©€Z”B€Y &ìÁö’äutŽc`8’ tu!CJRÄ €˜°–œ >,2€eÆÆ ƒÄ@±ÏÄÄ0\@±`ý>}‚$KP`œ8)DE¦MƒÈ –Ÿ‘Ëbò;6q¥(F]К  ”:Ä%û/ ž|°ÒT¼~ÍÀ ¬ÌÀ ªŠG® p”ðÿÑÄÿãR’C o5£ažDÖ,¯mmþgÄY¶j!ÂŽŽÔ+ƒÈ¥Ñ=‡ä)d1\âÈ4æÄS° ­òVÏÀŒDÿG£ÑåbC-Tf6º qp³OM@4 X®c„µ$Al`á‰-¦ažÀÒÔþóçfÃ9™c XdýÿT«Dõx,?N Mv`mñOÁ†ÍãÈŽÿ ,¼ÔÕÕTTTÀ€+‰cË&0€x8@±àê@ žFŽ19OŸ>ePSS#±íƒð(ÙØØðª ª§P¬ LBBBD9H Š-¸¹¹¾ÿŽRØ‘û sþѪ lÝIŠZVHùŸÇAö¡{9@âL$6¸í…%F¡”@Lèõ1¥r4rÞ…•öä¼I„»H)ø@±P3öÑkJ<žÅ>rÁGJ­@T/˜™™ám lu<:Ʀ ³`) _«äyrÛ1ÄB؇ÑïÞ½cøúõ+¼j†Â< ó:źÈ3 ¾Ä/`þåË—ÀÎ+hØk6%Tê*ˆ*YähP'èæÍ› ÝÝÝ ÞÞÞ âââ(UrÌbã#cž?~0œ}ÂY‡ `bb &&ÖóàÁ===”˜'¦¹‹«-Dq Åþû÷ïÁùUBB‚!..ŽèÃ<cƒò5ˆ¥P§èÙ³g ººº`û@rĶõ ÉÙ!Á <úæÍ†£G‚“)1žF/üÐY ÆÙJQgΜa““— rÔF6@d¥€W¯^1ܸqƒáÛ·o \\\ ÆÆÆ 222Œ……Œam}ô®.®®/kjj‚SÁíÛ·Á­°°0ƒ‚‚¼p$7ÉpäȆ>0èjë2HJI2°±³Q¥—H àçç(îÞ½ËpìØ1ð€‰’’Ù…!@‘Ôá•ô¯_¿fðññaø-ð›áÀ£ Çîcøùû'F,Ò ÃK@¢‡‡¸æeEX•Š ãDR ¸zõ*ƒªª*ÿ?ÿ¦ßšÎpÿ:Ã÷çßz™zŒŒ¨Ö£$¶ö<²ÂÇÁ59© €˜ˆ­A¥ñçÏŸÁyÚêlê 7ïÜdû!Æ ' Çðÿïœõ:­0ÈÍ ,ðüùs¬î'&ËF-ò(H#¨‡l¨à‰qrr‚“|¢V"C„J; ;3ï?¿è>¯r3¨Õ j‡€ÊPŒ­o‚Få'P= ª×AU7 j’òññåÀms defeøûXmýûÃ0V³€Ü ª&A51#ÑÈ €X°5l`íqPjaP»T߃êzP6ɃVð3LE Ï¢·&ayäq»È©iˆ… a-/Pª¬Û (°•º¤ôçq5_alXž‡5Ž`|XJ‰“SÍ 1›ÈýzX¿›£‘{w09  ˜"³‘=¶Eȃ¢°9¯c Xs}ݺu?€1¿ógqyˆâ°ÝƒÆçpm‰AÆøf…G{@4¨Ð–àXSrìÃæ$AžïììDöü <›Zˆ¢K ª ÔìóÃø ¬+qeçA´~ýúÝÝÝ Ï¯EJöxc €¨27ŠÕ´Èlä®1rÀb~ãÆ?zzz–Ÿ;wn¾<ˆâ@ë‘ ä±ä,σķlÙò£··wÅùóç×Êóè €h¶V˜–]_ØHˆ¿uëÖ}}} ϯ%%æa €ˆ(€ž×‘WŽ€èíÛ·ÿœ4iÒr çבó0@C.À²Ðó?@ž'5Ï£€"jLp°¤XY°cÇŽS¦LYvñâÅõäÆ< РOÈõ=ÌóÓ¦M[ õü9J<Ä‚ÞuáÁ–`ÍÛ]»v}ÆüòË—/Ãbþ%ž€‚°¾e†-H"uv…–r ¨ÏìØ±6lXôü:b9Ä€b„Õß©©©À$ælK³¶‚ˆ™®_¿~ØÂuiÏSóÈm€bü?Lv€’  A;cæîE…@IEND®B`‚recoll-1.17.3/qtgui/mtpics/presentation.png000644 001750 000000 00000007067 11740755063 021357 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞgAMA± üa pHYs  ÒÝ~ütIMEÔ 1 • ÆIDATxœå›{pS×Ç?÷^éêmÉ „ÁÁ1B%I·[²M6ÙdK3%]šY’Òi:m&ÌþÕݶÓMJ™Ì44tC Ù–4¬ÛL²3Ùlºy4Ý‚㘇1²cc[–eÙzÞ{÷=¬Ç•,a™l§ßîùßyü¾çw~ç¡+,<öØcxä‘G„ô³!?óᇾ²½¹ÂغukNº€€^ÿÇ„¢Ã¨(hšŠ¦©¨šŠ†–J+É´¦¢¢‚¦¥ò“r4 •¬rš’ÑÍ©OSÑÈ}дê;âÜš¥ÜèýZ\—€±è ÑÄVÙÉhx€yΫéíd±û:TMáÜH;v“»É hœ:‚Û¶³US踸Ÿù®j-õôŒü‰h"J“ç&âJ„³ÃG™ç¼šîá🧡v%uÖ¸m „b~züm4yn"¦„é|×JLF¢ q¨ûEá¾Ë¤@ŸT±˜ºA4â²ÔÓ2÷|þD#ÁÈ%Ž÷íÅë¾»É͉?pfè‹êVQcöpqô$g‡2¡Ñ}ý1Š&,Æ‚‘AN]:Ä¥±nÌF+êoC8Ìþ÷Ì$Qæ­O¶# #éèÛÇÅÑ“Ìv4òÖ'OÓ5øÍs>™ÆGQf1%ŒÙ``¶c Ëë¿ÈÙ¡XQÿEnnüGNÀb¬Á&×""ö¾ÂÏgYâY€Ù`Çarc”LhšJ¯¿F÷õºíZŒ5ÔXfc”,¬[ùniúí}oWÇê,”$`p¬›YêYƒ ˆ\;CÛ…7÷püâ>:ú~OƒkEN9›\Ë5óïÀ?qI0æäYŒNN^z—¦Ù7—ìœÍT ÀkíOÐqq^÷µWtc@(:ÂDíÑO«ªúéP å­j”I##BQ¯.ºÒÃ;ïðô[OãùKw8³_(^—–Ÿ™•¼}ÅíÜwó}xœž²V£Ë}¨€€¯ïü:{ÞÝS®ú´p¸û0?yë'¼øÍ¹©ù&Ìfs&¯’ÑO$™‘Ÿ–<ðù¤ñ‹€5àr¹øŒý3å­¾ˆžHt@èýìy€}ÿ´úúzL&“n™RÓcªÑ‡2 xô•GÁ|îšw»–íÂep•S´b´ö·ò 0ðþ/z‰oÜú fÍš•År¼ =÷Ó˜–ô ÷ÀjXàXÀ—þAUF˳¨B|Éó%âl‰m÷¡£¯ƒ@ €ÓéD–eÝ2ù„(ŠRró“Š‚àÆú 0cƧñÕ9_eK÷ iL$!‹!Ëò”£¯iZÎÜO£*«ÀóF£„FC„FC9yv§»Ó^Iu%±Ú±šc£ë¼Â ÿugÍ(FƒMÓøÊß5âmpb0Lv?MH<¯¨Š)!J€` ÈuK¯ËÉ;Úu”„=QQã¥Ð’uuŸ×èû`M@S54Eåß~ù1ÿpW?úîØl¶ÌR™zz£])!F#„•0a5\§$¦Žº?¢3Ô™Œø)X%+^³—f{3Ͷæ á7¾å¡Œžtñ<¦Ãûyé¿}4-2òµõ«q8@é-o1èPŒ­1eŒ‘Äq%NDäEÝri áõÁ׎ëæ0ú $ÉHã»kàŸÿ>ùÜ„Mÿ³€N÷,/?ώݧXû¹zŒF#F£±ä¦*&@S´SÆÅ;ðjÿ« -« e"ó:q€~4 d`—öŒ‚¸¢ñ|/£¿?ŠT[‹ÙéÁºü,s‘$©ì]Åø~ ŠA× ý°wp/ÇÇŽWÒTÊ™D» %oÒ5ø&€´Å@'Ä4ˆ£¯oÃø¹oã¹ó{X­ÖœmtU=À¬˜u=@o œ ŸË1Þ;èÅ[ãͤŒ€ºâmΚÍ ©£B‰Ýo"½'!ôÇŸÓ+9™ë·¨©©AKŸ÷*" ¨‘2vÅ^@@P Jä.q5Îaÿá™·ÆËÚæµ™ôÃJ¶iºþ‡8¾òÃÒ»tŽý 5îvŽ€Ð‘Ý ¬\‡ÉdÂjµ–,Z1BB@UT&Ô‰‚¼þžþÉŠNk§sæ³.¦˜ªÀ ¾î¼‹è+¹WÁþÃÞ[™×xž3íCøO½Ûí®""Õ JBAR$]Xë\‹×ëàÙ£Ï2\3 Ƽz@ö 7 Þ7GÅgðAreÃåráõ.ÆçóZb*W?„½÷DƒÃD"‘êœaL#`J˜ H «a&Ô âZœ &ôkɽ† æk7å¨l9²jS -Z$ùQ¦ØhÕ5'mÐ’wåì +öQq(Ý VÄ £ ZrDôj—È% ?îUºl6ê˜-™Çt¼¼,P%gŸ Š"‚I@S44Q˽ÑHººQ@@@’¤‚:ÒõdGfI’ "µ$I j8ù ùÀß á¡Iåš…`ñ€cá¤ñ%WŒ) GEdYÎAeQÆ,šA«lÅd̽ °HdAF’úÑÂÜÁ¹¬´¬Ìè´‡Û1[Ì´^vÀ&ÚE‘þóøŽþ†À™C`;XÜó,¨½jÒ"œ»ÀŠc€¢(„Ãa"‘äÚ. 2ÉQ´ÓiY6ÑÂmËnËè u aÊ#À €P„êpÍYŒÅÅ 8÷+¼êRP&Ê> È‚Œ]´í´érÙ:&Ñ4%VÑŠ,&e.§ïøúÉLäýÂô< &Á”!À*X1‰¹S -KË­BrýÍÖ³ VÌ‚¹@–_—]´g@$wÙ,#ÉÃBE;›J<@œœ19Æ›'ÞÌÉÉ1ŽŽÑy¢3“rôbrŒ ± 9²º…uu9]N RªkåýzaL~´Ô˜f ÈÆ|×|úÛúYyK* yHEèIرçÈí$½%[OO6‹Yu¹pÑÛÖ €3Ú†ïß”}tÕR=ÈÇúÕëùÙ;?£ýÕv®¿ózd‹þådµÐ¶ŸŽ7;ð:aÓª.S üÂ)(7–5¾ç÷éêëâcop¡óîú™{"‰â¿èÇe1óÓµKp9NTVAjëïúÓš‹…÷í`×Û»xíøk(~%³ Œ‹Œ†¤úÜ—<žˆÇ"@ƒHÜŒÙZø‚BéþÙMx×,äGw¬+$@ªÂF¨ NIÂétò¿ýëW¯'döٯ㷧ÃÌY·)§Ìº³òåî-Ü𠂯o.Þæ\DRÑJ¿]ß(Éy] RPÕ)`4©««Ãf³F3ÛO£©½Øó:jS#‘’»Ü>|g¶”Ù­$Ì&*' µˆÇc„ÃaÆÇÇä\ïÇ’Šb¦(ŠX,,–ÉCGcè=ÄNœÂ½òªŒÜ˜^»S#ˆ¸Àºª"["€/ëþô?^ý›ò ®¢pvÿ~öïß_Rµ¢[a=ÜþWóybgçß>Dݼ:õ³Å”¦GPvá]º¶ìz‹a:o³oݺ§Ó¹![VáªYˆ:—•}°…ï=ù'>|æeê¼õhšÆÓ'`aòBÄ@Õ^ÇH»r©ò±uëV®¹æš‡î¾ûî—³åÓ&@’$¾|ÛRœV…¿>Á±ŽshЯļQ´É; É ‘Dß9ß4[K¾)ª(JÎò¦÷œ,ãŸÍÏ›ö€ä2ù…›¯¢¥©–‚Á ÒÅáÝßáoÏ_Cóò~àWÕ[ˆÇr^{ÓÛêæË¶mÛFKKËf=ã¡ Éàh³Ùe™ÚÚZ¢Ñ(‰åËúøçœmíǺl‹ªÑR¥< [öÄOÐÒÒ²ùž{îÙQ¬®ªn4ûEUU”uâoý6Ç·AÝu`š5©ŸfϾ÷×r„…kz¶¤¿óIxòÉ'Y¶lYIã¡JS@’$1{Í=ŒÇEBo>ÎÀ|©—¤)øÖ“‘µŸÏ•ZEó= ý~~ê©§X¶lÙæ 6”4ªèz0™L4ܸŽ~ïg  •ýæF>b±tu“è‘°}ûvšššÊ2f˜€tlhhhÀív‹Å.ûQ‘H„®Å‚à3ÏŸÏæ±ûAi®ßŒ‘PÕ,ùk¾‚çD¦–CQ1VòUÔ¬Y€Ü¸™Ã¸ˆ¯z¨ª`IòMÊI‰"¶PÈoE°¤ÎÉ PŸ×!çî/ ‚ È„IêÍ!½9aräѸ(Š ý\Iô@ä^©¹ ¹QÀ’CäLy&Ê¢,”š+r…^q"‹@ETåbse®üb&ê‚L¥Ó§.Ų„« &4VÖGý=]€a€t´€q"ä"MÓ z‚M.ЀI@&+!`„¥iLlò ,<å<@·IÀÐišaY~bâó­íÞ Ä¥ƒ”»$xZÉÌ 2 4KÈ[$67oÿýÏî¾w!£i,÷ 8¸¤¬ì£(pý–Þ¼³½³³{wïÞ·/ò)MâÊBß uu5† 0s}skûîÞÞþþ¿$ögy˜¦ÏçR¦LÃ@kûÉg²º€iŠßÜÚ½}j²»­ÍÉØ©6ï…ÎvÙ<­ï¿–ìszÀ!ŠùõνˆÓ5äe!µ&}ôÅ _|ù{-¶ä¡¥^8mC¾½½w.› ¹”ŒåSgÞøàŸ´âj; ÁG„¥›¿ÄØèt7É2m·Ÿ¡^~3•²àiõ4@ñtö°&üÃR¸”:êÙ“§Þùø|¯eiô6¶76ÕBˆfF®^ ·ÑFžŸ×~~ŒzúÕ^ËZ ¾úçÞz\=œ%†‡Ã<<Ͼ¾ ­ð#ý¾!l]|†Ö'`1Dˆ†ÃÑ¥YoH[½ „£QÖ"<«Ê™~ðÑåå•õ¡P*3·¾<;‡?ù”•-BliNäu!É­¹ØÙ•¯ü¡ZljÒ˳dh—¦@Â"t¸›šë =$=ßi²ŸiÎhcÝ=þÑxˆ¦Y~2âŒcó;¹Þz‡ž‡¤çF&/ R.w ûS¢)ÀO®t]±Ðã€O©HõHZ&—Ó´kH‡I)\Ó×.{9Ö¯˜%GsƒCEb*£åþLIR|lØçr’=JÙÉ"_ƒŠ= ›šš²HÊüw9SH³]Ь7ö³"BKûD©¢ø=°`qG³,˜Z W¢Ø.ÔAQ²Àn€¤¶À’è¼¼úHV–$¢Zµ(8:½ú¦"3«¿¸ÆþWÈHÑ@Eî¼HÀéé™™ØÜüg« ÝÃX©X|º +†@éØÜÜüü|lz¨§Û €+Ž+j«ÅB]Ò…4`#>Wys=þ±E©Ž AÊ&\èJBI§±qŠ•¢\*mbY(, W 9Xl¨,H°™£ýÏ[Owù‚å«üÍ '-Rq•æª(²Š§þ»÷0õ$ZùIEND®B`‚recoll-1.17.3/qtgui/mtpics/soffice.png000644 001750 000000 00000012400 11740755063 020245 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞgAMA¯È7Šé·IDATxœÕšitՕǵuõÞ­}k-^åM–±1Æ66;„%9L Àd’ œ,3“d2““œ9'³BB Æ ˜LJÍ!d!@Œ°Á ±-KÞdÉRkm©Õ‹º[½TÕ|hµÜ–e©Û6LæN~ýêÕ«wÿ÷Þwß»õưiÓ¦%IZkF*SgF¦ˆ®ë“Öeê§z&»~bû©ž9S6ÆÚécõÓ¿' B2™Œ>üØc›xSÎìvû5×^{í]²,u2¡# »A˜ô…SbúöéÝ.CÀdm'«Ï£ÈöíÛµM›6½œÎÒÀ8†aN§“}ûzðû£‚€¤’ºn`èºa ëšn`ŒiBÓ ãÌ}CO·?SÖÇÿëzú22ýhcmŒ³û×õÉ”`d‰=¤û³YxàJ¬V‹144T˜èy Ðuöv?£ñ$W^Yƒj’hjêÁj3‰$h?ågåª¼Þ 3ê øýëGY{õ öîó28J× ´1¡µLY;·œ¾¯‘0VÖÏ3¨SB× œN•{îY‚®ë Ll'Ÿy m‚ÕåvŽÂéR),°P$zT™ºÚ¢Ñ4A}}#ÔÔp¤e€@`tüźh êºn fÊbº,麔M€E€pI 0™$„sD>H’H—7Dq± O•“TJÃ4M'™ÔÑ´4QmmC\¶´³*“J]ø@ÿ¯‘í@Úwjª]¨&‰¾¾0µ5nÚÚüÌ™S„ªÊãsAOOˆDBçškfNËò_2αM38qb‹EFUeÞ}÷½}#hºÝfâOï´12’Äb‘ñzƒ FŽ‘Lhg&°Iæ-•1û3õºžöÿì9 •y>ÎúθÀtA'‹€´i7,*#Œ‘HèÄãqªª\Ty\$“:@Œêj7éÖÔ¸IÄS¬¼²0Ð1K2 ºf`p&Æ™è¡Ý×Çëô¬(ÀÙL&¹§ë³ŒËm‹(ÓY\44”MMÙ%…1áwòrÆ=Ó?“×uO7Æ×,ªªæFÀÇìÅÌ™Ÿ¿n²{¹¶›¬NÓ4dYrŒb®ÂL†X ÁˆotR»<Ÿ0ë¦[NÕnº:MÓ¦™¡/؆:‚Ù~€‚r­ÕÔ,ªÄVbËéÙé>)¹¡iÚ¤ûމ8' æ o‹Ÿ²ÚvöµÊìÛí£¾ú·ÞÓHÝÒªóîB÷ ¢ý\„‡,Èõt…8ÑʉA¿y9Ž¥ÐDªÀÄÓ?ÙÅÞW[0Rú9¦—¯ÿæJÖùúÐ4-§çóvÀéûßi§n¥ÄëÿÓµÀÃ羸ˆ"‹ÀÁY¼øÌ~‚CÖÞµ“]ÍK빺Æt}꺎aˆâôS\ÞT»ðž¤-bOk)koªÃÞÖÍàÖC,¸e á›f±å©Ñ)®ûâåÈ]; Wóž Si_„ñk*äbÁQfÕ°fy M×(±ŠŒî>†Ozã ‹ ‰j¼´~?»_> º1>ˆ‹™Ü¦ …Ù˜,I3Æ È•õ~Bñ(ÇûŠˆŒ ô Ç1/ò ZUÌKk9ð~’IÄÓPÆ[/âÀ«­g™¢,KSö1 –‰ÚÏy[€¿7BõŒ8NýÛ·¶ÓQ[Mñ7¯§£º†žÞQîøÚå4T›˜µ°ˆ÷^?JoË¢”~Õ®÷14D…œÝ Wíkš–7ù`Àp§Ÿ¶a3;Ô’Ò4Fc)Ö?´—7wô±ÿNnþR#'›hÛÛÆìT˜2·Ê¶¢ÅS¢ÀÇF&ÕÐÅh?cúÙ¾Ÿ‹œsÉ×…G™SzŠž~Ö¬¬áч®cÕŠ*þðÒ?UKËÞFzŽñå *î5#ØK´7÷ðÑ(P7ÃCuuÙx˜ºÚÏ'ìMD~Q@0ôm½n|å®8ÕªÁwï›ÇÊynt—…Ài/÷ÞÛG‘`PºÌNÕlep|g 7ÏÁí²áídÎì ’É3ƒÎLÅi2Ù¢g¢Æó²€\á(wQnêÀe#Ú¬¼ßâ§i¿—§ÁÀ¶¬%.f¯˜O<¤·ÅËc߉ÑqBgñšNNî<ŲåõŸ9 ï…Pí’26þ° ïp§áþ .-Ûã /•¤øp?{ÃæÒ‰$l¬Xã«ÿ² ÒÛÜBWs?ó—ÔðáÎVŽ”œB4ËÄb R©­G»x૟Áé°b` Éõ¤%:ç÷“ë ì¨tpùå3ؾñ}N‡,˜_Ì`\#Œc‘ó[p¸œôv0Ø;HGóaöïô1ÜÄn†ˆ&ˆŽa³(˜$§K¥¶¡˜ÙË«¨[V³Ì–þ¦Èß".( ªwþÓUÈO~Àæ­|ýË)6Ö=Œ"ЏuŠÌéÑFÔŽ­´·YYr5,»QåÑ»Â\¿ª€Pï‡G’l:…¯ãJ²—B×(•¥&V]n¡Ðû\T]VIŸXNëû^Ž¿ÛAÕÜ"ìvǰ÷¥Ì’È’Ûæ°â¾Å”ÖbŒ¹äfãëÒÛo¿ý®ÆÆÆ’4õRÒîbv˜©[XBûÎb‰å6T·Ã$“f–Z#02RA¡å#q€`GŒï±¼Vã•ý^Jª;­Hñ.V6ôÓ*eÃFV%ʾAp‹ôvˆ&'†" *_þáJ–,r²pU‹ïk$<cdžØ#¨6+®J×ø8A@UUŽ?nìÚµkkwwwÜ7®çšpÌssè…VºuS4ßJÃÂ2 f8ùéðaB‹jË©YZɲ’:†ŽXèo=ÆÍóE^»ÖÎ Rtö/Á·½_oŠò ‘þ0'ôrtw³—RXi§k¿ anù–‡w_ñ,6°Xs˜Ã&% c±Xú†,#ËòYÉ Aö‡éêíÜÁWþ ^1N°µýúÙ‰7Ù+0‡ ¹.ê¦ÎsˆÝ§ ¶¿égMÙ,‚ÝaÂæÊ—ˆ¼êóc.ⳋëèhõSÔ°·ýjôx’’‚‚†T£á¶I¨”³‘=;ºØý®—#ÁóW×°d•ÁÂëJÀd¦ ÊŠ»À‘>×Ç®òœ9@R©©T Q‘$ I’ÆËöB+3+8)50÷Šc”|”¤{@§©©…[oYÃ÷ên‡$¤"M3ùð•J*e'RR¤?bÙ5Èå0pRÃçs²(Æì*•êÞPíˆVz<‰œJ Ç8},ˆKàqˆÜµÂÎÐiG»TîüŽѾˆ¦7ÔßP†³Ò1¾rÎ(í¢&Á “2 ½K3»LØÊKØõú;´µÒ?(P63ŒTêB–²õF§½źžzÂ÷—ãëòN:‘E¤¦ñVëAVÙ*ô“pX°[üÁ8 f:`0’àƒ†9ÚaH—¸áoÊéöÚPµ(‹œzÜXTsNIЉ8뉌éœoca:ŠE¢»=½YùÂWâ,ÿt=§zÛÙò‡×ˆZDôä{ˆ©#‘ŒQbP$f•¹õÛõ¬Y0ÄŒö"Š"HÉh Ûh‚Ƕ¿‚dI>Mß‘¡ÑN¡®!±‚)ºmNf/·pݽ.ä¤Ù"㹬‡ÍŠÙlBÅ3¤ëµKËYg•Ù¹ã¤ÐkìÝû>þaèÚÃoßy—/}E¡¾°èà % —áë’øÜÝ)îXyÑgÂ(£R IÄéóž`µ½Šßô¿NW¡›’²(¾cý [-T ¼Á$M©ùþýA‘¶cÕ¼ûËQ*Ô®öà°[9s°+œ¦cÎÐ ¬±ÁíCežÄ´.bƒ®ËZ™;ï ŒˆÊ¾X×ßz]‹7ñe÷1ôˆ@,x²­k€×¶íâs+n@ìÁ‚ȱÝ}H×Íïيl4„qh$\UÎ$ß0H: ?]‹»Î…M5c±¨Æäþþ±X€ é}zJ £-Æê/ÝOqy~§›{›¸ÿz‘ê·Žž6Xû·w#8$|2´†-̱ ˆÂb(Xá.àŠåK°ú»AÙ€¿måƒx§>BMò©•Kh,³‘úùª÷4µæ:¾®áÝú!7™p¨ÞÁ¾C}ÜX¢RZëf°§½?ůÿøû‚Ýܰð^FT·‚*Z¨¹¢ŠÑ‘úXš[”EDL²‚Å¢"Šâ›ý¤d0 ˜Ì _=Áæ÷sëçgqÓÌYØL&~ÿæŸyìô;ÜS¶œ[篣qY ýÏí=Ì*ÜØ‹zøÏÿlgë‚ÇXÛ¸ˆÎž>vúˆ†ËÖ0°§³;€;RDóö_VA¡ÓÁ¨”$shSD$I;œyf]2.¹ ˆ’@¤7Â?ù>7ÞÓÀƒw]A(CQî«ø©Í:kW5P¿¬ÍÐé‹3b7,þo½b^b}§ZÙÔ¹›+/¿Ñk%Qåãû߯ä¹_KÌ»¹‡UÆUãBKêˆbú¨ ¤ƒU¾¹¿\¾Håe&“Ÿ^ÛÇßa¾{ÝDG¸œvEÆí´óÿx¡‘(ªªbRJÝ&VT–ðòq?ž†oãëõÓÕaÆnécaY€ËœA(¸³³’×6R1»›¡áªubhéuG   ’L¦­!se›*].V«•p8,™L¦I ùí GC,ºÜ‚æbµšQUSÚ“Å„[–PUDÄpœ?‡¢8ÝȷȬþ»Eh»ÞøWj*ëˆ[ën½†öäg(Ÿ«0ÜÜÏÌ;çb’e 2g†;;;q»ÝH’4þõ'“ ž*+,Ë2½½½|ôÑGÝ===CLuR4Äã >ýà:V–Œ Ÿ&DADU¥tn 9Dþí¿Æ×égÇ®Ãü*µƒïÜt+¥¯ =x%³jªp—×Sª8Ü uw̦ÐãÆ¤(c>žVŒ¢(,]ºYÎ/hE"6lØàݼyó3ƒƒƒ-LH†œE@æCÄ´“ É„Ùl›&o7^/ TÕcs«ÌYPÉÀÓ¿ãág¶±.ÑÀšuu˜ì Ue&ìå6ÌN¢ `³ZÆûÈ\º®/Ç'®óÏ·î‡Ã<þøãÞGyä™@ °ôIñÄy Ⱥ®c·§™‹Û†ÓaÃl2±zÙŸˆÄãqÌ&ÓYk‡|0ñüOFó›6mò>úè£ÙšçÓï'F€(Š˜ÍùÌFöD(Ë2ÃÃÃlÞ¼Ùû³Ÿýìé±8„<…‡OÈ&ö!m3 ( @€çŸ¾ëñÇ&KøœÍ>Ÿ˜\,ÆÓòÁ /¼ðB×Ïþó_øýþ·¹ááÿ’$ Ù²eK×úõë/‰ð0€Œù_Hzùã@f,²,‡Ù²e‹÷‰'žxvLøœCÝTÈ&@I$ãaç/™U`$á—¿üe÷“O>ùìÐÐÐ%²8uêÔ¾ÿøÇžT*%]Š\Û¥€ $“IÁçóÅßzë­7}>_Î+¼œß‘õ[,œ—ªóK èÚ€à¥ì8;&É€…Oh' >v]Rü/¦,Ÿ ?^¶IEND®B`‚recoll-1.17.3/qtgui/mtpics/source.png000755 001750 000000 00000010036 11740755063 020135 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞgAMA¯È7ŠéÕIDATxœÍ›[l\Uw€¿s›‹=ãvìñc7;‰ˆ@U%TýE¨/HH\_òÒ‡ªO}hyD„48Š‚ DH ôƒÔ4ŠJøiû#„4 ¹ÈvâëÄÎ$öØžË9gï>ŒÏÉÌ™9ã™Äü풎Ι½×Ù{­µ×m¯}FÁ~øá߆ñ˜¢HK €”§MÊ»ïˆ\ãžôm+n·ót¦C:x*‘GƒpЋqÝ‘…¸û|—†Àêêêù×^{íŸóÛu¯¢Ñè§žzêwªªàÌ‘£_¢(0 rM ŠâÕ;ºÓìPî (.²¼‹TòÍB¦ Û¥ªªªñå—_öï F‘¢Ñ(ßNZLÞ±Bd,IÚ’(R¢¶„´)±…DJ…Ú€B2-1íœìm!B"$Ø"·ŠR€µÖ&ì\¿-À–kmbm<‘ßÃ¥¿\JBÓ²¡µ^çŸ~÷ª¢„€Và–¿¤DÁõ„Éÿijx0ÈCM:¶€¯~]a{,@GTGHɯq“¿œâo‡#t6è,§‡ÿk‘¹Åœà,!±m‰mƒmK,)±ì5¦í³ÖÚÝÅqž…¬‚Y°lɃ-ÿðWÍ lPÉ“c‘œU°ÛÛ f–l’A}H¥=ª3‘°XLÛ<ÚB× «Aç_þ¸È¾ClŠh,,Û(27†wi4%§öڽ෠ºÈÝmQÍj—€ªÔŸÑJ˜ÀšûPrjøci¶·h‹Ì,Z˜B2Ü .¨ñ‡ +4ÖªÌ,Yܸcqû B‚¦(¯³ø ª·!ÏI(<ÜäòM“US²¹Å ¨+üÛ¥?M§énÔ¹~Ëd 9Àaþñ/›îb‰ê™W~ë”t‚³ßÛ«‚ÿžÌ°½Õ`~ÙæÔÕ½:c “ŸfÒ<Ù_Ã¥›&Š²Êž® ºžæOiL["Öžkß–Ä^ó–×8mBäð-¯P nÕ€eKRY‰ôyÙW;ÛÄ"*¶ ñ¤%awG!${º‚)ÉÚ’Ç ‘µ$7n[(Àß쨤 çÙå]¯/¥Ä^óörí.äÝh!<}Ü ›woÞ6÷Y)Ì;l[ò@D'T°K˜e±\Cn3ÃO>÷^Š=÷5&²8)NB”'!טÎõËxR@@¡”eújÀFBÁ^âÊô•z.×ç×&„À–¦í7€Áåð¼ ëzÎ|l»$žÓ¦ë9vlÛÆ¶m·Ïy.9vyòïÂÒÒW¯^%ÓÛÛKMMMIEQP…‰‰ „´¶¶ BáI)Ýy;;;illDá+4_”Bžššâرc´··ÓØØH<gïÞ½EB°m›ãdz°°@__ñxœ¡¡!º»» 6A•Ì©( ™L†'NL&ikk£±±‘Ý»w‰DŠ6X'Nœ`ii‰ÞÞ^زe mmmضR´I)#¯t…œ}šL&Cgg'ÃÃÃD"‘’fSiôpÞõ ³* ¨Önó!™LrôèQêëëyì±Ç¨©©áêÕ«騪ª¬¬¬ðÑG¡ë:û÷ï§¡¡±±±Û­vß`Ûö=Ñ^Q*¼8ªñâEºººxúé§èêêbvv–l6K0tUÿ×_¥®®ŽgŸ}!]]]ÄãqLÓ$ ùž)x{mßo¥«J…ï4McÓ¦M®-655%B†a‹ÅRb𦋗6½PnCu?Z[]–Rò ëïïàÖ­[n_ (X˲èîî&0;;ë®\ (¯\áüηûr—Ü·BÐÐÐÀ®]»H&“¤R)TU-Û£Ñ(»wï&N$9Õ¬äý®¼÷e¥˜kjj¢¡¡¡ˆ@¯·®¯¯'ú:ÖË+Éó+ ‰ë…"?&üúýÂ#ÔûÉU¼pÏP.&; we« mùãn˜,·q’0oÅÈJ†A¿8{ãÆ „tvvºaÍ‹«iñxœùùyÚÛÛ©¯¯¯h…Kõ9„OMM±¼¼L,£¶¶¶äûš¦1??ÏíÛ·iii)9o)¨H’É$ü1ªªÒÞÞÎØØ{÷®®(½=yò$çΣ¯¯ññqééé)(Rz™õ+‰™¦É_|A<§¿¿ŸÉÉIimm-xGUUN:Å¥K—`bb‚-[¶ÐÕÕ…âÞò'—8uêuuu<÷Üs(ŠÂôô4óóóD£Q_Ó4ÆÇÇùé§Ÿx饗hii!™L299I:v÷òå˜ÏoSU•óçϳ°°ÀË/¿LMM wîÜaaaÛ¶]Ú4Mãúõë\¼x‘^xÆÆF–——™››sKqåÀ·7N9é¦R)üqW’±XŒd2éJ×!|nnŽ­[·ÒÒÒ‚eY„Ãa:;;Ë&8ùÌçGUUY\\ddd„H$B&“!‰ Š,ªª2??ÏŽ;hllt³ÉŽŽŽ²µ@÷}¿Ç™8åè………‚½v$)R­X,†®ëniÊ© 8IN>³ÎÝ™#?´9ã¶µµaš&–e¹mÑhÔÝ=:‚Åb!0MÓN$Á0 WH À¥” aš&ÓÓÓd2¤”X–E6›uÓ4éèè ££ƒññq2™ŒK´³Qq,ò/?§+„ ¯¯ºº:fffÜR—7¿B‹ÅèììdzzÓ4 ƒî¼U—ÄbòW¢®®Ž­[·bYªª’Íf]"ò÷ߊ¢000@*•rµ¥Üþ|=âÛ¶m#N”ÄJmw7oÞì–âáV’(UòKS•p„Ãá{*N”OUU·Â[n<Çܪ×W~›ˆJÓÏHS7jÞ I„ Ã(pT~)©¦i®ºjšæ:¸¢‰ó25M[÷ ï·‚ŠL@×u.\¸ÀÙ³g©­­epp¾¾¾¢ð¦i‰D‚3gÎJ¥x衇ؾ}{Q‘Ã0 ®]»Æ÷ßalݺ•ªÏ6ʆAEQ0 ƒ .ðÕW_±mÛ6†‡‡¹uësssnî­(Š›/|òÉ'¨ªÊ¾}ûŒ¹¶¬( º®3>>ÎgŸ}Foo/{öì!™L233S0ž÷RUµâ«¾¬«B~ùåž|òIyäLÓ$‹±¸¸X°ªº®såÊšššxæ™gRºGjNI r1ùìÙ³ìÛ·ýû÷cYííí$‰²i«÷Dªœ];&Z ”€3Pmm-ÍÍÍn2 ƒæææ’DlÚ´É •<ð€»~0dÓ¦Mn¸Ò4æææ²+µ´´ÄíÛ·Ýšßáˆ3wSFY^^.J ×M„t]góæÍÌÎκŸº®ewNâb†{ª( Á`°¨6088Èüü¼{¬iš«!¥ÀYˆ™™4MÃ0 t]/Pù|!8Ú¹4MãÒ¥KüðÃSPøÅdE&000ÀÜÜœ»Õt¼¼/²k×.–—— ‡ÃD"‘"ïnÛ6===„B!îܹCss3†aTtœ‡Ù±cǺx^˜žžæèÑ£ç;vHB¹OeKd‚Š¢ÐÞÞîö•+L444¸%±rxmmm—O‹mÛ¾¾ÀÏ7ŒóÆoœ;tèÐà?x~Å¡JcôFãyßñÚº÷î<«ªÊØØ¯¿þú¹Ã‡¾®©ü1+€¢(n}#êrN¨r[ÏkçïNý´Ôy6 ƒ«W¯òæ›oþ|øðáÎc>í·ä7BÞ›Ÿœœrž>ÿ¼¯ZPU!“““ضMKK µµµ¾ãåo}!ø™A àòå˼õÖ[óßWK1_R¥&_^^æÓO?ukõõõŒŒŒ¸eíj@Qr_?~Ü­óE£QFFF\ßá÷ž³úù;½üdÉ0 ®\¹ÂÛo¿½îʯ+g]×ùæ›oƒ<ÿüóhšÆää$‰D¢ $V)†Á™3gH§Ó¼òÊ+„ÃafffH$Ô××û¾—o¥´4píÚ5ÞyçŸGGG•/ËÍûíÁæ€ 6€y(ýO<ëŸ,þùÁ²@å¯ÿ Ù× a 4…ÄIEND®B`‚recoll-1.17.3/qtgui/mtpics/sownd.png000755 001750 000000 00000011224 11740755063 017767 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<&IDATxÚbüÿÿ?ÃHÄÄ0Â@± sÉ2äüù‹ŠÀ”¤øë×/&PŠ%*Í€ÄG—CÐÿþAR">5 úÇ#"¼Î•þ)'×ã°”@ŒÈY€Ü¸téÊFfff?ˆGy¿AAHÿÇ‹ÓÒÂg­þ Äÿ( €b¡F2:Zˆ‘ñ?ƒ˜˜(Ü`õŸ¾È|t9tO#ó!lˆø«Wï€)àƒŒŒ\oOÏ,®’’´)@íŸÈ  ªÀß¿™˜˜ Bn¢xæitñ>3|ÿþ,§¡¡ÓÜÕ5ƒ±¬,c2%@T)aI“Ö–z”•eÀ´ŠŠfyjj PŠ”ƒÉ1 €˜¨ç0z$5HJŠ0ÈÊŠ3S·»{À‚¬¬r' 4'9@LT*À…}RÀ&EE)qq!p 88x,‚ 9@C.€¬ki)AvvîË22H€‚e(03033±¶¶ƒ„„0° gæ¶µu]–ž^FR 5c†^e#<€CGGX.€R ·ë²´´R¢ €¨T0À[rô¨@ûÈ §§Ä %ÉÖÖ®ËRRJˆ €b¡VÌœe=ÍðìÇ=†‹ÿ.]Ç€À ÿa`°g´gBVªe5P É2èë+ƒ#âñã×ÜVV®Ë€J£æÎíÙ”üŽ«Ù @äÀ1†@ fg0°å4Õe`нbÍ ¥™ -öŸ@ü  ØüùýøÈJØh¶ 8E>~üŠÛÒÒeÙ… 'ìΞ=r €H €M Š  @Oû=ÇÏÀedð ÌPӱπÖ@¼ðýÃ…÷&<œÀ û_Ž!V8–!V2žA™W‰P`Íj @@îx©€SÊ£G¯¸‹W13³:µÿÔu( €ˆë -zœèq†8pÌÂ08F¿+|Sa0ùiΩ-¡Î Ë«ÇÀÊÂÂÀÊÌItÿ!Ô£OŽ0¼eÇpùÓ%†£_0s$‡þ@¤t‰L†jÍZQn¬MáÓ§o0¼}û‰!<Ükêøû÷ß?ø°Éü‹áÐ¡Ë ïß²¿ÞY¾|ZÀñã»oÃæo€"‹Š€ž¯b~°§AJÞ2=e8ÇrŽáÓu†Œ×W¬XU&--­iccHd¡ùáÐýC ïldØðfÃÖì Þ?| ýÚ“Â5ÃÁîA€S§®ƒTõ!{Ñáú „ÿ`óA4¨ãtûö3°<(V¬˜pâÄp Àôþ,0—a!Ðaq`Oƒbé2ói†-ì‡N2\ ¼šóÔøBJ;€‰‰‰ÁAÙŒûpýù ¯M`8øã Ãg`¿&åd<Ã×wJ-ÊØØX1ʀ˗ï#õ‰ë~³±qªXY¹g hÔhæd Ü0ƒáÐãöà>Öm¦Û k962œc¸ Œ¦GÀ8|ýíÿdaaùMI;À_ߟÁOÏáÀ É{’2?dè¸ÖÌðèÄRëRVVH ()‰1°³3c[%䔀ÞB}øð-(%‰™B@ü„=&1L’öàXßͶŽa9Ç^ _ïsÙhè}†¦‰¿P ÿS£`§fÏpJú,Cɦ"†Å_1t^jfd“fˆ6‰//7°È1vÉûø;#¼e PÑÌ\tfô08É|`¥ñ•a׆ãL€©T<âwÐbë/­ú\ü ³Âæ0èÑc(;VÂP{²ŒÁ\Â’ASQ˜ŒÙñe”×ýú ¬ ˆî¯0"7Žˆ KMÓöâr®é@ÏŸe`ø †{@üˆ¿¡{žVMáë<†lµ\†Ï¿?1¬¹±’áÓ§¯XÕJ}bšý°²jt+'F;† ¬kN±^zˆCkö_¸ZS´ê vúö0ØŠÙ1x¼‡áë×oXkxuF`<W$jüc0dxËø‚aß:Hž'ûO°ÿxmúÓg3œ}q ß1<ôû÷?°Ça~Ǹz¬Ä‚F ¯™¦S90¯ÿyŠ\Zâ™ï3Üå¾ÍpìÃv`áóD“˜B~ûÿ äÔ0à ¾? /(Ïà£æ ,ýÙPÄÿþ ö8ÈOÿ‡³±y[35>K÷ý,À<ÿã9¡dϰ˜Zظü39cå€ %Hp±C1 KpR{¸ýêÃÖ»[6~ÜÈpàÛ†£¬G|Žx2$ˆ$34š61Hð‹aèáçà×õ?þzÙÓÄ®B €ÐÛ¡žGU:èù¿À–!+ƒ>8X.°gX±“áÆ¿ûÀöÐk“e¦JÀ$*ÃÉÉA09«Š©0ˆ0€àƒ·72,xL ßæ2œxvœaËfE Y´Âî/´ºcÀó„W!@LXûœ3àf±>à ¦‡ Ü 5lÓn|;Ì%§’ ”ïäÔ  óæ3œó9ǠϨÏpãÓ5† -> /_¾·ì~ýúìÐüÇ>Ìã°l¡kt>*â>L7á!±~`²gzþ:Ë!†b¾N†ó¿=,(ÿ]µ0ø##Ó_Jš:Rz ÇbO1DIÄ0Üøp¡åP3ûwŸPš·È'' ÝkL»o°Ük¯c¸Å²aÏ`“Ø"ü÷ÚøŽè Þ‚Å0(yÃRÏd ÿ·00̹1•!J9AWM#iƒìyÆ&.;`/üebøl-àYlc”ç^A;Bÿ±µ²~ýú쳿…Ç;;;ƒ   Jò8,Y# ql«s'Ãч‡<ÙÍ $-ÏÀÍÍI•@€MÈ¢€b!0¥Äpœm2Ç¿ÀæðïÇИ{¾¾¾^Ø vdff6|ñâ†.(´¦N½ÀvL˜á42›Ÿ_€‹‹X§ó1ˆˆˆÙ<Žà`(³®b¸úô0°~ƒ‡°{ˆ´@ÀÕ üðØ0ÚŽØõÿò|ZZ§°°p°kô”̃߾}·ËA±r LÔ……a†÷ïßcþÃçÏž>}ecàãã‡;6Ê0†aê÷ÉÐüŒËƒ¤öæ:@ဠ›€‰ú‹¹¹)‹••U 09çͲüógÐTõw0þ‡¥tÅ:8 €èW¯^Áù|||àÑïß¿cNN`ª†ÐÁL ¾š~ ÜœœðÂŒÒ@À•¬c¸”ÂÏÏ?ƒƒƒìñ÷ïß;&_ñjƒÅ>ÈÃÈ©„AóçÏ`÷ö°aóèqN`–àVw_ž?Àðñã;i`Þ—öËÊ{ ¼žžôÄ\#¿}ûv4!rÈ“0ÏÂ0z@À0¨ÕÊë0|ÿþ™áÁƒ[ bb²Àì!€µQCN à*g¤¦¦&ö<¨T‡HÄ{[Ìc d1PŠÆo†7o £¹ÂÂÔ lU5@am%$$( ìåÑ?åyä¤OlìcS* €Ùí-0küÄÚ²ÃÕðÁÕX•ˆGLÅÿ÷ï_¢=/--Í ¯¯Ï ®®¯ @Éä©7oÞ€„Ab°²WJëáäéý^ ‚«O|JÀžWrqqKzB@II‰XC€d¨`ƒÅ(E “±0¸ü  3Aå ¾ P@:•¿~ý„O‰S°Ét@Xƒ°Â 033—âOž<­{„A)Dƒ< JΠ¬¤¬¬ Vûå˼± „´/~3pp°ãííز@a €>芋‹ƒ+ÄÄÄÀÕáÝ»wÁ}ñâX=Èó?~ücPu7oÞdPSS«yúô)0YË2ÈÉÉá,`3Hÿþ±=ø/pÕ„5Þ½{÷èYnnnP`àœÞºví¼MðàÁ‚Ùd°M¦AÊ>Øb”z@ÙàÙ³gÀ€VBé푸ʀÂ/^<ª¥¥Jº –,_#PËë ‚r(ùƒ< 4PÒÆû €F0És€W†JJª0ÀZpy”@@„µR­7sA%2(Ð=’ƒ$Ñð¼ ƒÔƒ UPá÷úõkpì‚øè1R’Éý{÷@Kà|}Ãåå$»¡{’@ÀU¡ER Šü=0Éâh ÇŒ>|˜ùòåK˃rIJJ2HHH0€h%iPÁÚ @ ‚hXWúùóçàÔRQQc ‹z\XžðCÛ¸=Hn à bV‰RhDè'°ÿÄ í*¢À¼¼ (JÀÀÇ$¬'ˆ^¯Ã†Ä`XFFû²²ò ÑщÀ,Ä žö‚Å81$'`]bt@Ä.“û'ü Œ7À¤ÜLÚ3@µ(©ƒÊPì‚ò5¬ò0(¿ƒ² Èã Ô ,œ••PœX»ð"%MÂ-:ò{ R—Êþ‡§˗//z¸ Xà}y–ÿ‘c–*@b X?qâ0|`ð÷eÐÖÖ¨üãúÄtuaâĨA ©a J–Êþ<{öì4`Ci``ÂÒïßß)}ÿþ^¯#ƒªEAA!`énÉ`dd ,/ÄÀ­;\ÃW´H ¸R@Q ‘ÐÏÀ˜½¬¦fùš••])+ËÜéõÞ •ðìì¬àj••…ˆq>ꮆ@QºX_™þ€ yNGG›¨~áö;uWS €¨¶Z„?~‹R\ Û‡j7jï yÍ®õ¨[ñpëÇ·D €¨A†¯\yŒ¤M’¤nšD^G˜Æûúõýkô逢Jܹs¥üóç>~|+l±"bûFIÂ|ÊÕbK5çÏo8]ä © ªle€,‰Õi¼Ô TŸÐµO µÍàé,€¢–cCW‘~dÜà?Ò*00ôú=U,YIEND®B`‚recoll-1.17.3/qtgui/mtpics/spreadsheet.png000644 001750 000000 00000006466 11740755063 021155 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞgAMA¯È7Šé íIDATxœÕ›Ml\U–Ç÷½ª²«âJblDZ11‚H D‰ÝCƒhZ,PoØu/zÁ¦5ÒŒÔÛ™ÙÍžæC DH–f‡ÄŽ0³IQP6nÙq &ŠÝ„†;.Wù£Êõý>î…}Ÿ_U½÷ªÊqèæH¥çwï¹çÜsÿçÜsŸMôÑGýÙ4Íß*¥]¦”ò꥔ºµ[¸[Èz…Ü)‰B7RR²Û"b@Jw‡a·­WçÓØÎß×λp]Wær¹¿œ;wî®.5+ ¯¯ïõ×_ý÷1Ó@(…RPW` p˜(bbw@ß»Â_ÀÛR¶;њݞ‚Yšëüó˜fŒonßæìÙ³—€Ev–¥EH<È- «`¿;‹Ux¦–êð}L=FÔ/ŒG¶Ö© zܧò÷¯û Ѹz„â/¿N÷±¶¶vè* J éJ.o˜<°à߆¶ðRþ}þº±3 žlÐÓ/LPY³ 2 ¾]ÿ‚˜©ø_ RJ"¥ŒùÕÕ¢€móT$ ø—ð‡'@øÓøhnUvZ5¯²hz*ß{P™Õšy‚þÖO£{ô`ˆàj#¤ ‚«ø® 7Jð‡Aøó´ ×/˜Z ¤D5 ÿ“ݶ€‰Hy¾.Ò¸ß~áÔºvÈUðmþû>üq®àæ\˼Ÿ£ÞÝž½`@3ȶ#uC Cø[Apçù¯GàïÕí•¿Y%àWiøõÁ¦ øZ'¨@íðh·º+¸v]ªÕ4x¥ƒ‹ÆqÐnO¸Få ‘Š'ô² „@ À ªÙ+©à§ò=US™ïoòÔñ„?vPJí¼+¯ )%ÉTŒl' ˆDö@:èi~-¨Ðñ6·(¥lË%.B´‚W ØO YûÁ„ ¾=Oã»ÀvœÐ… Áý  ÉùWA©€¨¾‚x]×m8CÀ¶ù;ŽCµ‚ ŒvòÅb‘™™b±hÝY–E<4;M¶mc¦i¶­Û¹®‹ëº$‰ÐU–RÇ™œœ$7È •6®1 V«aYãã㡼J)#£”"‹áº®×Æ0 ¾ÿþ{Òé4CCC¸®‹a!R¢”Â0 Ö××) <õÔS¸®‹Ã0PJy‚J)¹{÷.®ëÇæaÛv¤<{Ú½½½8p ÔZ”Rôöö’L&I$¸®ËÜÜ'OžlVó¤R)”R|ùå—lllðÊ+¯Ð××@¥R¡^¯“J¥RR*•øê«¯8|ø0(¥p]7Ð"¥”žÒ:¶€NHïÛ( Ð?!¹\Ž;wî`CCC õú'¥¤P(ÍfÉçóôõõµð!X]]Å4M>Œã8ž5ÍÁ‰?MÝ !¨V«¼öÚk¤ÓilÛ]ÁÁAÆÇÇ=‹h&)%£££!( ˜¦ÙPï_ ~Q«{AÍ„¸þ‰¸®K½^G)ÅÈȈ·R–eÛà8®ëbÛ6RJN:åµ·,+Ç4M^|ñE`h… Ø¢ÛÛ¶íYMu½40}ûí·¡|èñ(¥( ,,,„ („ ›ÍR*•BAPA>Ÿ§P(„‚ ìz0Euuj¼$“I<ðÓú'§CQ©(!ŽãD¬4Æ“(øÛ„D]{)%‡â™gžA)Åææ&RJ¼€ëºœ:u*ÒÄ-Ëb``€±±±PíNœ89§Ñ«DÁwƒm¬@¯0Àýû÷™™™iX%½¢xN¾ž½†Ý¡P*•BÐÓÓãtšIçú,˶íУïÏEû‚úˆ[¯×±, Ó4‰Çã^fÖðGepp°%2 £!AD¦i¶õ±X¬­§h—}Žì?ªR£ª4˲¨×묯¯³°°ìj}qqÑk§”bmm7nD†Â+++d³YVVV"CáR©äWͤ²Z­vtpj«€°|€îXÇùýýý^BÄ0 /û ÛP.— Ýú0tèÐ!FFFBCñxÃ0 = 9ŽC&“éJpM¡´Ÿô{2™dhh)%¶m³¶¶ÆÈÈHÃ( ŒŽŽFšx&“a``€áááP½ GŽ åñƒ»uƒ-^@›bT\­ÓØBæçç¹qãFhª;Š:É>é4W;žvs£=ðúœH$H¥R^†ö—F¡‘`Ôð?'''qÇ» œ`íWFÈÏóØÏ†aËå©93¬”"ŸÏ3;;yÈd2¬¬¬ðÓO?…ïÖÖVdÒDƒ`¥Rië.ƒ¨kTJÑßßÏñãÇŽÁŸ¶n‡¦§OŸ¼Õ…mEÞ¹s‡þþ~ïâ3ˆçáǬ¯¯sæÌ™H78==Ýs‚¬cO9Áxûì3çÒ¥KççççïâûÔ3Ðüh4Û¶)‹ÞÅçèè(Õjµaå-Ë"ŸÏGb@­V£T*Q,CCáR©DµZessÓËAø¯Ë›•D/^tÞzë­ósssŸj¡ h{Ÿ¾s9êÿò"È ‹EïÊ,ˆ„Øþn ™L²²²ºz¥R‰Z­Æêê*årÙKƒ7»\Í߬Œ .Øo¿ýö§sssŸ_+´³€æÎšn¹õ+AJÉ?üÀ«¯¾ióóó<ñÄŒ‡zååeÖÖÖ8qâ³³³^†(L°{StáÂçÝwßýßÙÙY-üC¿ð èä<¯Çãܼy“J¥ÂË/¿ÜÕt‚þI‡åXÜÏÓ$¼ýÎ;ïD ¨€æƒÊü´´´D­Vöm‰D¤°JÚûøñÂ?G¿ðï½÷^[áaq€ÂCýçž{ŽR©D"‘hXmíz¢¨ ÑiqÝ—ßýùI÷sñâEçý÷ßÿ¿™™™ó´öx. ,//£”"N“N§Y]]õø¤”lnnòã?Fb@.—ó>™ ss¹›››ôöö²µµåñ6o5!Ÿþ¹óÁ|º#ü—;ÂG&&»²¥àøñã Bùà§Ÿ~:ô»MúN!›ÍFŽÙßßO&“¡VÛö^þï4>\¾|Ù9{öì§333~³ÎÊÒe$H$˜˜˜h×ï¾’v‡…BÁ@„÷Å_8çÎëZxØ#D]x<Ò¿›ÕtõêUçÃ?Ü“ðð˜?–ÞojÎFíÞäD^…* ì Ì5²”’ééigjjꓹ¹¹ŽÐ>Œ"½À?iELOOÛSSSç¯]»ö p“= Aÿ9*„¡¯ºÛ]lü\¤£NÃ0¸råŠ=55õÉõë×µð ±}·Ô¢€\.·þñÇ—…Î?Ó°,K¬¬¬ÈË—/_º~ýúyöAxøÀ‰‰‰É—-Ë:ø(ï7í`’“Édî·y³÷SÐFOƒ@Ï£vþH[À&]¸º(ú´@@£%,=PIEND®B`‚recoll-1.17.3/qtgui/mtpics/text-x-python.png000644 001750 000000 00000007314 11740755063 021407 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞsBIT|dˆ pHYsììu85tEXtSoftwarewww.inkscape.org›î<IIDATxÚå[[lgþvv½öÞ¼Þõ5¾åžÚ8I«¦)¨)."úPŸjÕB[ µ}¨Th¼¤òVU<  q“)´PE ¨M i./ñý²ëëÚë½ywf8çh&ûï®ízT8ÒÉ?»3ÙùÏw¾sùÿûLÓÄÿ³øPF<$4>ýdŠi©a’T@5ÞO°F ŸL1HWIsdÒ*ƒ°UxIäͤuöuŸ &؆–HS¤IÒ%þ¼"¤mÅRél&k™nží|vR " še®Ù!ê~¿^¯÷4€,éÊv°C ÂÆ§WÒòÑÈšßÆrê¨+çʳ 0Ôk×3=bÙâÙ<¨÷òÒ¿2aÛØtz33IÔÕÅ0<<„®®nD£µ˜šœÂ®Ö]è»qmííX^^FGGFGGáóùàÕ4¬‹Ø½{7Å€Q¹Þ´F‹ÍžmTõÇE2™D&“A}}=/õõ÷azz š×‹‘‘D"°¬ ÀA×˵º®ó䣃+XYÔÒõ±°·i{øÈÒ£Ì3úN»uâQ¡~œŒnhh@;±b~~,M½_9o¸+¾2%pM×…€M‰yRÅ F2^=V½-ÿn ˆ-bOØV“äc†ÀG'º¡¡!Äãq°ÌÌÌHܳ$ ÔF£L‰÷ ƒèŸ¤ë‰Q:O3‚GÓìº%Ÿå÷U ¶:æóy ˆ‘Ùl–ã0X46*•Ãjkk1L@é†!¹ÃGybzj ]ÝÝò;)•+Θ¿ª U¤ô„Û²9ëŒWc¼§§G¡¾uÌY_@™˜˜ÄøŠ7çV‘Îy°RÔ‘-x£Š¡Á@µ×DÀ ý¢zÚ¢8º¯Q.0˜ÛÌj¹ÝI¨ãÊwöX(ˆê³øõ{S¸2ïAÑ RÓ$f^kÔH 96Ì«øË@± øÆ‰6œ8²‘pÂÕÂÛÍÕxµÁQA0 Cú€WÎO“ç½–&¤<:ís&à87Ÿ3ñ“¿Ž¢°ZÂ?݃P($¡rçC@1~s‰úWGgÉxM úÒ¡¾|Oú&ð³¿MðÒ̈cF8ϯ½3Ž{¶"H¡GNït°LMNò‰ÍëׯãøñãrLqGgwx{Ò2!Ö¾3´ FjtM§„ƒSaýV1?‡úÆ98¥5F,,ÜÄtê ‚Á»¹"¹šÕ0xA#ñøÓs}˜Ò£eãe›s‹áZæ_YYA&“Ú00:ù`Uå?áƒ<Ü“0 dV]]íÔ_vxÞ¹‘X3Þ07‹a圭XŸð0lI$ÔZÛn``Xu{$&Ìâúä~„˜ä0q-”—¡Ä÷Ñû*yx‡Þ7á”¥9˜3£¡+ ô´#—Ë1ì}f‚ëePzøôJS9ßö<\¹Ü)`m”öxáê!Ë`‡ñX¡)4‚ñ\†“½÷;ÁR©D ‡n²ÓøvÒ|%èjô4êó€Yrz~¼ÙåIäã²ñÊ ÑýNÐÐu Ï“W<\¶ÙÙX€©ïþ†Æb¡ôFã6¬, U×ÉÆsp³ä^Ø`6]P<¬&Ã5ÅÖBEÔ)Ñ kÆÑvàxç€MgT©¯-ð>#oÉ»Þ òD… 9§AƆ¾]õ¾—>ï«:ëªÑ©’%³ §ÁòÛ6]åü®ºâa?êü¢«å}ø½EÕóPÙà3f¸Ø¿çn0­ôi(³ˆQ=÷åñ•O…Ñ×áÕ‡Ñ\/dâÞ)Ê×p^áÌ-ßg2+¨¢Ô2À‚þ€²´WÙ`d¹à™ÕÝ* ñÅ”]‚¼Å¥¯ËêPãQ-‡Ï7¦ÐÓ<ŠãÝK¨X•Ì™òÔVË^Y6¤2!ì …¸st•"6=›jkÈȼâ}g2Ô`àë÷·àXç µ.U²|+ÔÞò¹P¼›K ²säVnéž‹JÌÃHgØ]oà@ËÊKec6÷¸zN«ÙÃs¼}}€—~¼…ðÀpôê"&bf03Ùí  UÌrÔÞ Eò|¸‰;@žƒË›¢Ž Í›{kM ,–/… !Ú[ª¤U¯«Ælƒ êhÿßéÂI„ƒA{>·e-À£ìúžØCÿ»s–÷ÕdXS-^0Kʳs6À@Éð¡>ƒFk9LIÐ~<·CT‘ŸÞ»÷àÂànÌ?2¦ë‰Npí>“Ùãˆt´³ÁÜl|˜cÚʲÓ]ai/cuuøöé.¼òƇ¸š,(Ép9æMzΖ±…ŒÄºïÔÔ¿„Á ØÏ]Þu¼|´·³ />Áûƒ“è›\Ä¿¯õóÓÙ( ge߆,^Ê#åÛ—cr¾­µ•$ÛlÁ`€Në”ѽ€Õ5&“ ÄcuÜ@ÉèÚXrèÀb¡»v5ð£3'¬\\Êê6ODvgOÝ[‹GKxäØûéô s¿ÌÉÊÔ†‰šÚCä­ä „=JÞüU~J¦€à Bgû6HXÖÕa²w™\òx‡J»8p@îm¿†c1Þt'¨%…'Ä*7 ‡Ã°DvqWan\¿+lРã³{þ¾¤5d†sà=Bkg¹%‘1‹Äáu9æ]ë‚õ¢d‰/ÝÙ¦¨Ê¹ùØØ{àmk^‰‰7V y^¿»‘èäy€_×íìÎ#ß{ø~ÊétÚ<{ö쯬%³¤ÆŽVƒ* ä&¸|ù2º»»e;ª¯¯Ã@‰Bñ~%6ÈhP$ýߨ máu4jo‚Ä6ÒŽmY@™¦c¶úCF6QÏŸ?ÿ»^xá×ÖK’º[IÐf¼úræÌØrðàÁ[À¤ÆÞ }[eoÞèE¤å”Ðx¥ê›0gÞ¢ûñpUae íc DÆy5Éû<'y/áâÅ‹o>÷Üs¯r‘ %Í`àæSWa€Qµ0ßÞVGç5Ä“¢z^Œg)x÷ÃCÞžŸ_ p—¹ IÈ566Hü“q ºèÕ«W/>ýôÓ?·ŒO²÷é|ɽ*PæÁ=ºâ7¿Ø3âÝlC"GKmbË]\{‰ñW¡ûïB8Ѐdf7¼Áýô»E1þᇆ%œäØh[ùyeßO<ñCËøi«/¹_Tá›czz§Nâ'$‘Ù‡™ªo!Žp©s>ìàPX·u|||âÉ'Ÿ|‰rÂ(€)ÒeÒ¢Iâªç7?•°ôöö2-¥&§R÷¡þ_ˆë¿GC`Taƒ*ìõ=HÀ½±p˜C‚™ÅÍŽm¼Óó üÑþ»Ĉeüéªm|eÜÛx'H¼-e½ÙKaq 7—úaæ†àÓÇá7§ôÍ¡¨û‘3(tÐÝÛ ÝתØn4†BÒè†ITÏ Ÿ/ ¹¹I1~nn.ýüóÏ¿DOúL.*Æ»·›œ€øÆœ}YÙ;œø¸3,×, EJXº~—/)]9«œù5 5¤ šF£µ¦·Jœ•ýó9.±NÚ‹ñ/¿üò÷¯]»vÅa|ÁÎøî@¼rå —;~-–©i·£ò|a£ìJgç¬ñ¶Ñ¢R ä³Á¡$û$¶çÙóäùï‘ñ'WËû à,Ìžâ¾{{¢Õk[â¬l´³Íµ–ØÿNïs÷9ñÔSO½è ý‚b¼«¸/bp…0åsvÌÀ0{ìR×ÿøã¿èHxl|Þ6~ǘ$é@ ºÉ»¹¼4å.Œ'Ê Š¦¬¼ËÓÕÕÅ!³·ªÅƒ‡æóÜ/ðßT•sÿ?¿K=öØ(DÆìl¯Äüíd€©‚Àõ—ß”?˜¸pá{‰½%´¥‰ ¶×y½`Ç=Ïc%–X•ÀÀ¥K—Þ¢&çÇV¼O;ê¼qÛ_•­ ¼âR'“}àÔ| VaˆÔôÍoÎÕÂ$`ÿðÌ3ÏüÂÙÞªMŽû0²«ün¿G}AÑ6Ò~Un+ QIž¦)No;—¹²ž?wîÜëÏ>ûì/-ÏÏ’fHKŠñ.`Xkè9šàWTÝÁ?¡5sÈ[å-aYeas›(Y fØ¢œw^L¦¹åñ+ÙéwäuyN,DÉ,n-Kàùï *‹%Ù¹€ ‚ð?.ÿ^@j-¿OçgIEND®B`‚recoll-1.17.3/qtgui/mtpics/txt.png000644 001750 000000 00000005540 11740755063 017455 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞbKGDÿÿÿ ½§“ pHYs  šœtIMEÔ 9'[ íIDATxÚÝ›il\ÕÇ÷m3ÛqâØ!ñ’@B'PZZª¤¨…R–(í‡TÔB@eQ¨ªŠtQ¿@U‰H@K)REÕÒŠVªTª"Ô*…ª"Ž“8Î`;±;^ÇËxfÞÌ[n?¼ÇÛx¶çôJWó–ûî;çö33‚ùC¤çÿÓé¹ ³8p °uëÖ·B¡ëºîôu)ç?7óZæ8Ÿks÷Zì~!û.vttT{á…vµµµE{.Zæ ‘H¨kÖ¬¹bÛ¶mŽã\XñH¹$ÏišÆÁƒû#‘Èe€IJFÀà˜Í[Ç\WΚîÌs)qÜùk\;oº3öȵvö3î¬÷/>]WòîÓWẮšL&—ŸR6ôª+×oЩ ú#“qÉXÌaõr•³#6›ë5V¯ÐèØüí½(±¤¼8_J!¥Ô²ù5%›JE¦$ÿmK1—lMq¤+Å  *‚‚ú,^{/F"éò—CQLK^²ÞQÉמ „7/Ñ!Jàæ­šO¥ˆ%%[ôK#öåá\µ¹j–” o·&Qø°3Å”éÒÞg¡¨Þš?¿EUÄtâÑwZSdvm’Þ§;#ñ˜5Å쩤÷U(2ý9kŠYçÞZ%2h­¬|sgÀW dû\Ê5ŽãPQ¢«-OPjLÎÅü…^ãºnaNð¼ ˆ%µG)%25†Õ{ÔPxÉÉ7™Óü–|N"æk70Ù;B<¶‚hDÅØp«v~ƒªOíð¢¸ÞXJ‰ìþ=ÚúMÔÝþ„^†9ÔËè±Cœ~ñ»T4ÝÌ{ŸA+¯*Iúùªÿ¼0è‡,J¤t±Â¿¦lÓ1„v€àªFêo½‡Ï<ó:Á2–Ç·3qâE^®w9Ž“·)+Rúôÿm]0öˆ¿1*#ÀÆoÿµ_¹ðÏïÁIL pFú®ë~2ä’šÓö=ã¡kÀq@Jz»&©Û½¯(égl?3}-†J’þT'Rv ´ïâÄ6°FÒ”Ù1O‚Á†#‚e›?]p(Fú¾‹HÙþÆfã|%02BTP·C2 Àà°FÝî'|‘~¾ZP² ä$29Œ9ˆhõ.ƶAò Ô ôyÌK£’3cåw,}˲Š ²T`zt½„ÞT{þU£OúŠÆz>1QÍê;›®óÿµ/Fú%›@N"vÏŸP+;¼–\òjˆwƒ¢y i TPt|ÐNí-÷.YÊ›w?ÀO-g_Aß¼ĘÀX=(ã ]06ÃØ8¨Q¥‘껚‘wÊëºnAŸï“Héât¼„ZÓÀ^S]žä…“Õ ê è|/Ìe·ï-(Á*Æã/i˜'ý×QÖ5)LlôÔ]èXC# h˜ÆZ‚[nE¯X‘°3Õ~!»/ÚB>*ꄟE«3AÀ­hoÚùi`6zÒW5:Äš]åWIú`óKRÏ$ò.¢ºDijýèV'=æÕø8ª†­­Æ©ª!°jmÞ…Žß ÅOÏ?=:žE»¢ÊS}ÊarÈ {Bw“g ŠÆ™¶©Û½oQ¦3R÷Ëæ-†| …S¸Œ i˜Ú²3­þA8UÃÕª‰ŒFYsåu‹ªü´OY¢V]AN0Ÿ&…8ýú¦&OõE¦bç=¿ÚR‚ªq®{œº¯>‘uŸLnïg«®$È+/OãŽAÇ<õO\ ödšùD,Pt¤QEoëiVÜpÛ<¦ ñòùÌ¢¢Àb¹õbÒWz^BÝòYOú`Jœ÷üZX6¨£ƒ«ïzl–ªg$¾T¶^ $ ¢Ñ(‰DÛ¶%j;Ž<÷:J¥éIߪ‡Ôp:í5 ª§Ÿ§þsˆÚ_ŸÅx¦%Ÿïôž“%狆A˲°, !š¦¡iв°Õ(ÿ±ñ DË<Ï/]ÐÀL‚¢19¡°bÇ}8¯ Rà°,›X,i¦¼¦jÐ`ùòJÿ¢@6ôlÛžî·eîO¯•.F÷˨7}pÁ Aj(]ó»¬u€Î7ÿÉúŸ¾YW—Rbš)âqËšMC2i15§²²¼tŠ }Úð(—ïH”±eéHm%L˜ j$âÁ-_D -Ëë=®ë›Äã&®›¾XÌÄ0tßL°Ð˜kœ}eûÝ@ \ ’#éÐç€S Ê$H—޽Iã#ȹFÍ“I+ï<  ü  /:þ>Ôlñ¾³&ñeÀDÚùUA4 ª†eéȪ 5õY÷2ͱXbZÍ Žã’JY†^<Åd]Æ™_¢^sˆ¸̱óÎ:Pc zþýu»2oï…ԼجÏ4S›Aéåðè ¬ö¤o.÷Ô^è T@ÂEÃ!ÆG”_~õ,5Ÿ˜˜bxxœ©©Ä¢6žïH¥,œ`!°LÍn=Éþóž_Ôƒ’ýï¥þkßCi&‰ÅÌ¢ˆÍ5cí¤+œJiŽÖµ oôúüJ,T ©„èûð(ú•714al,ê+óBB¡ 55Ë©ªªX4x-‰ØVÆæT¯Ïgl{´$ÒNpò·ÏúÂD£ñ¢ìÛ¶mFFç¤ËpQEY+YUU¨Hç/bI¢€•2æ+•V‹cÅ8úÌp.ÛÊÊíw½2i²vm ?{âÄ 988ØFMÏ.— +ì¸ó½®55NËϾƒÚô%jîÚWr·i¡þ®‡innîxòÉ'÷{ ÖBf - QSsޤÆG8òÔ”}þ[,Ûy_IÌ«ªByyp^x& ч9|øpûý÷ßÿF3/ ƒÈ‘S\wÍzœ‰!šŸÞò;¿Oùõw͸aè”—— D",ËšÕ#X°I···Ïd~&sj@Q ¸– Òv¼›“-m¬;úVÝûeMŸ+Ê›ƒååeèº6¯ºsÛÛÛinnžËü¸×›ÏвO×&e0R“Ô·þŽ5{ÑxUÁj  …‚ –Ús¿ ɦþ477·ïÙ³'oæK.†¤t!r޵¯ÒøøËèµ—¤æ¡P²²ÜLFòSBN:EKKKÁÌ—Ü–ŽC9«÷½‚ZU[´šç 2Ìõ]]]´´´´ïÝ»·`æKv‚J ĵÞ†ô’î‹éó@@ÏÚQÊ3 Ì »»›cÇŽÍ|É& T C½ ¿µÄqœY¿éééáøñãí>ø`ÑÌû’ ^¨1óÛ¡³gÏÒÚÚÚþÐC•Äü%@Æööörâĉö‡~¸dæ}k‰-åÈÐâº.===„ÃaߘŸW_Ì£§§‡“'OúÊü%còÌ™3m>úè>?™Ÿ€išnGGGïÀÀÀH0¬–R^vÇe___ÿþýû”.j†üb~n“@ÊZ " ÎÅâ \¼}FÒ…/ÌÏ@¤™ú÷>©‘ùç·.im¿˜ÏÆØÅ꥟ŒgÆÿ”úæüAç*IEND®B`‚recoll-1.17.3/qtgui/mtpics/wordprocessing.png000644 001750 000000 00000013040 11740755063 021700 0ustar00dockeswheel000000 000000 ‰PNG  IHDR@@ªiqÞgAMA¯È7Šé×IDATxœÕ›Ùo\×™àçnµ/,²Š»$RRl-–Ù=Ž’1”Ž:hc`Þfþ‹y`ò>pYâÄîÀy`^ò0ý2ã¼(·²eKŠIE)Š[«X¬í®çöCÕ=ª*ÉF7úŠw9Ë=ßw¾ý;|ðÁiÓ4ÿ›¦iñ0 C€ÞE”’þ÷Ñstµ„½6ôþÎ@›”ÝYzía_[ô>1nxÝa¶mÿÿŸÿüçÿ`ììì”Þzë­ÿ|ùòe#üQýž-C׃}Ü 6…#G=GŸA¢ÞGà’?þxø@uxQ@³ÙÔS©DàŠ¤ñO„ñ‚„H@!R†¸2D"?ø2D† DH‚ AÊIHØk dHvçaØë# Â)é¾ëõí¶÷õjð7®®î»°oÇ“\œKò_ÿÃ<¾ï¥€R €”R„RŠF–7< -djLˆ šÉ_·<„€—fu O<6j>ŬÆÅ9‹rÝçËU×ï.$è-H½ûÞOÊ? »D äàûB¾ ‚þ1ÏúEˆ?{Q¿àÙ÷Û¶dçR–ÿò÷3„Ô}Ÿý,#è|ï;keŸKóa’Mjœ6جúüÝëIþ×ÿkòw“b»æsºg·é³¶ë¡…M€‚ Ég?)»ï5 R Aô^v¹G—hôµiÇ@—]N ´g,]æøÃ 0,OŽòé#+>Léd“‚»¾XqùO›æì”‰!ÿûnA"D]$þ-vXƒe.ÍÌë”’݆äåY“ë/Ç0uÁú®þÝùÿñßg)å †ü¿ 0ú¼ {]ÞôËhüeÃãëuC‡ï.Z3:ÿøy›Õ²Ï?Þmqu!Æãm—õ]/è* ~ÙîÞË;wYÔ“r´ƒ:ãÀo„A4vH8Ç—tmÕ1ð}†äRpmÑ@ÓÀ BªS×xã¥8ìjÖŽ#™78]4qýr]"CøÁ…‚®v§+Èž¤TV"%2èùá3í.Ãîø®&ú÷4¾Òú‘Eé³Ê<³ ®/9?“ÄÐG1¦â)!‡¿Y °mÓ40M Ûîàû>–##4 ÏupÃ0š†&t„$Ou©t:„èºÞuP„ÀÐu4]§Õju¿H‚À •ÎõúïyÊß0 C× û|A×ô†ôæî½{‚Ð@œ€ú¡RÙå‹{÷è´Û$S)\×%•J±¿¿O±Xd~~ŽO?ý'æææxüø1ù|Ïsi6[ÄãqÞzë-LÓäáÇ´ZMõ½:Ù\Û¶I&SÌÌL£i:;;;¸®K&“a¿Žëz´Z-òùBh¤R)jµétš+W®066¦8*‚è>ì!=Øæ“H˜'#@4pzf¡i¬®®’Édp‡b±ÈÎΦibY1æç癟ŸÇ²,4MC×uÚí6š¦©ßøø8‰D‚T*ÍÄD‘X,F6›í!˜GJ‰ã8X–ÅÔÔµZV«…çyhšF††®ë\ºt‰T*u¤= RÊ#Û ‚VWW)•JlllL&ÙØØ`rr’B¡ÀÚÚçϟǶm<ÏÃ÷}‰a²²²@,#ÆÇÇÙÛÛC×uêõ:¶m¦i’L&‘RR«Õ˜››#‘H „ˆ3„=™ŒEFâиâyÐl6ÙØØ ÖÖÖ¸|ù2ëëë4›M<ÏãË/¿¤Ýn+++hšF"‘P;êÔ)¾þúk,Ë"›í²ýöö6AP*•h4<}ú”B¡@T«U’É$†a°¸¸ˆïû: éQ†!¾ïcš&â$:Àó<5áüü<ÓÓÓX–Åk¯½†a¼ôÒK!BpêÔ)µ3¯¿þºÚHÑ !øÎw¾3ðÎó<‚ P;îû>®ëbš¦º…èIw¿ŸcŽƒ`š&¦ÙUº®\Ÿ¢EEóEDÑuX,¦v·¿}™£æ=¬m!ƒø6 ℈ý¢geûúI)ÕîG„ŽúÇùÑûˆc¢ñýlzwûÃ+°»»Ë£G¸xñ"÷îÝ#ŸÏcÝnÙl€•• à Cb±®J¥ˆÅbloocY®ëÇñ<Çq( 4›MÂ0IJ,<ÏCJ©´þÜÜFƒ èú!ŽãL&Ñ4 )%®ëây©TŠ|>ÏãÇ#—ËQ.—Ñu p]—ÙÙYb±Ø‰6ëD ßÛÛ#|ß§Ùlbš&Íf“ÙÙYµŽãH$Øßß§ÙlR(ð}Ÿd2É“'Ozf³k*+• [[[,,,P¯×iµZ ÁJ¥ÂÄÄ»»»ø¾O§Óu¾ööö”rW¯×I$Ôëu +6kkkÌÎÎR¯×‰ÇãÏÏ‹Er¹B …N)%ù|×uÑuï}ï{J»çóyµK¹\ŽN§ÃÞÞׯ_G×u<¯ëáAÀÂÂûûûÌÌÌÐétgD6?N¨Ýô}]ו8D?!?øÁp]MÓ(‹!(‹ìíí)ýòB°²²Â½{÷°,‹¹¹9¶··q‡ÉÉIÇÁu]ÆÇÇ™˜˜à³Ï>Ã÷}N:E¥Rá7Þ`ii‰íímJ¥SSS¬¯¯+Ù‚€v»M©T¢Z­ö\n“ññqÆÇÇyüø1™L†l6Ë_ÿúWfffØÚÚRÜ‘N§ÙÛÛàêիܽ{—W^yEqW:¦Z­‹Å(•J'çß÷ÅÆÇǹxñ"óóóÄãqΟ?”Riêˆý-Ëâí·ßƶm ÃÀ÷}âñ8™LF)4!–e1999à™õï¨B±y±XTаT*Ñn·9{ö,щ„Ò±XŒþð‡˜¦ÉØØ§OŸ&Óét”~z!(  …l*•RÞØ(ˆØºò˜L&œ—Ó§O+mÉe„x|úé§d³Y&''ÙÝÝUŠ0rªîß¿Ïøø8›››œ?žr¹L©TâÑ£GX–¥D¥Óé°¸¸H£Ñ ‘H¼"(—ËìïïcYÖ¡ƒ#3äºî€Ö=Ìyñ<ÙÙYLÓTDš˜˜ ›ÍbY–e‘J¥°¬n.â"èrf2™T^g,S\ ÇÕ˜h¾ÇQfæ0¯JmÛìîî2333*'?ð¼±±çyЍžç‘ËåØÛÛ£Ùl’H$H&“”Ëeòù<±XŒ©©) à ™LÒjµH¥R4 ²Ù,†aÐl6I&“ Úí6Íf“©©)|ß1+МišÊs; LÓÄ0Œ1Œ|äÀDþD4£Ñ`ii‰z½N2™¤^¯3>>N£Ñ \.sîÜ9?~Œ¦i´Ûm ÃPâ“Ëåh6›Ø¶­d¿^¯311q,Ò'"@†ØvË4‘‡°S—ºæ¬Ó騘|ÐÍ8 \×U ŠÈl^¾|Y)U)%ûûûd2„8ŽÃµkׂ­V‹N§ÃÌÌ ðLyGœqöìY\×U:äq€ãz'MaGpTlò¼p€Q¾¾Ýn+"¶hÁD OÛ¶i6›í£è8Žj‹Öu]9-ý©´h¼¦iÊþwëRŠQ¢¤_'ôëoäéºN.—#N†¡ZdºF‹³m!ÓÓÓä;º>S˜žB z·±±¡ò±XŒF£¡ò„†a°¿¿ã8¤R)fggY^^¦ÙlªÌ’®ë8Ž£Rk‹‹‹GÆ/# Ðo7£6#Ñ„ýWMÓ”¹r]WÕô¢Í–çþoDãÇÁ¶möööH&“Ôj5LÓ¤Ñh099ÉÒÒ…Bjµª²Éëëë,--Q­V™ššRÈÛ¶ÍÌÌ ccc'ÒeŠ£ C:íö‘ò&8¶3 ‡Ad2ûAJÉää$“““ÊŸ˜˜À0 ªÕ*ñxœk×®‘ÍfI$*ťѢ˜Á÷}*• Ùl–T*E§Óyñ¤hÄæ¶ãñ—å'Xñ8‡3È Às;<Ý©ý¥=J¥Éùâ‹/¨T*LMMQ©Tèt:´ÛmfffØÙÙºŠùÒ¥KLMMñùçŸséÒ%îܹÃÔÔår™x<ÎÜÜ>¤Z­277ÇO~ò“Õ4MOåˆãWËÀGÓ‰TþØnëÀq…W^yÏóT¾¯R©P(0 CA®ë"„ ‘Hðꫯ255ÅÛo¿­iäGâ¥ÝORÐ9¦0öýëª÷8‡ú†ÁÎÎ<À0 •…®ÕjT«UUˆ¼½½Ío¼Á½{÷XZZêžUè[\×åå—_æÏþ³ÊŸÔ)]¹»Ó& ¶ÑRx®ƒh·Žý˜îŠ‘aLOO‹ÅÈd2lmm‘ÍfI§Ó¤Ói4MS¡r6›åêÕ«*U¥Ç6771M“Ó§O#„8±ü`ؾ[¦ÎÙS$SiÂp´IÑ„F«Õ¢Z• Ù# %„ Õj ð€”’3gΰ¸¸¨¾{îܹ‘ŽWd㣚E¿É=s挪>#Ýëc 0 ¦iP,I§SÈCÎ¾éºÆÞ^]×XXX8–ú 0ýŠKJIµZÅuÝÂéI½À(yêyÞ¡§áŽîÿÀ({ ûǦi4›MVVVH§Óʉꯚ¦I½^guuõÀáT8< AP«Õ”û: „4›Íž8†{Úí6¹\îØ~Ã똞žæ»ßýîJðQ „`kk‹[·n-ÿþ÷¿ÿŸ@‹D8 úóðÑ©£À²,ŠÅâ±ýòùü@ñò¤0êÜÀq ­­-~ñ‹_,½ûî»ø¾ØÕo¤ÃnE¨¿êómÁó&,ú§(0ƒA ßommñË_þrùÝwßý­ïûŸÚ£æ?@€þrtÿÄQ€ÒŸ¤èÏÊDï?¸Ðà!ºÏß¿«A¨º^¤õûçE€þgÃ0ØÜÜäæÍ›Ë¿úÕ¯>è!ÿà0äúƒ¡­­-Êå2­VKyTQ¥xii‰|¾ëñéºÎää$«««LOO£ë:kkkd2b±±XŒ­­-ÇQ~ûÌÌ ¾ï³±±¡œ˜ÙÙY•þž˜˜àîÝ»d³Yvww™Ug"D‘èðÎÇb1ž>}ÊÍ›7—nÞ¼ù¡mÛÿxxò#9 Ýn³¹¹©”_£Ñ —ËQ­VY__'•Jáy™LË²ØØØ NS«ÕØÙÙáéÓ§ªHºÞK%“IUñÉd2Ü»w©©)vwwyøð¡:8õãÿ˜û÷ï3==M¹\æÁƒt:®]»¦0¬«"Çgccƒ÷Þ{oùæÍ›ôÿ ]Åw$ ÀôôôÀ.ú¾¯ÎÞ¸qƒv»ïûêBtdebb‚+W® i;;;X–Å~ô#677Éd2Ýè²Ó!›Í²°°€eYÔj5ÅaQ)ý§?ý©b{Ó4Y^^ƶmeîúÃÜhÌÆÆ·oß^~ï½÷>´mû“òG‡§‡`mm;wîP*•#ŽãpõêU>|¨*·Íf“X,F:ƶm®_¿ÎÿøG‚ ŸÏ³½½Í… p‡ÕÕUæææp]—7npÿþ}Òé4KKKLNNϽ½=Î;G"‘ Ýn+.é/yY–Åææ&·oß^¾}ûö‡ívûÿÐeû!?’³³³\¿~ Tn°X,âº.ív›ééiI&“t:RuµZ¥V«qãÆ ¶··ÑuÅÅE …Fƒ3gÎ`Y•J…z½Î‰D‚\.‡išªÐUˆÇ¡Ñhà˲ØÞÞæ7¿ùÍò­[·>è“ù##þa¢\.«:AµZUah«Õ= ½´´D,Ã0 .^¼H½^ÇqvvvT¹üÔ©Sj™L†ÝÝ]‚ PÙŸ .Ðl6ùꫯ”Õ_ ØÚÚÂ0 ,ËRiùÈ F–akk‹_ÿú×nݺ)¼Ï‹üH°,«—ë¯ÏçY]]e||ß÷iµZø¾O­Vcss“D"aŠ…÷÷÷©T*êÀS*•â믿fss“K—.© o­VcbbÇqT³Õj!¥d||œJ¥B©Tbee…l6«N˜J)1 ƒíím>üðÃåÛ·oЇüñáèIRxóÍ7Õ®Eé¨D"ÁÓ§OI&“\¹r×u)•J¤R)u¢üûßÿ>º®cš&çÏŸWióè„8tË[–eqîܹCëarõêUîÝ»§ˆ#„`{{›>úhùÖ­[¿u]÷ÄÚþÄØÝÝåÎ;¾ºŸC¯½¸K©p+æS©g‡‡»‡^@)Åê3ž™ºÏÀ¥!>xÿ#v=Ù†Öc A ­Ãçÿš»ñx,àö•Aò Œ(£ãSœï¿ˆÐ†ÙÉî^;…·0]¶Cˆ%Õ¡Š/_>ýðä'ïòR¥Ë—®0šÍ!D´6ÔòJ×ÿø™˜b:}ƒúž±bÛÖ/å_Ú¶-žho¢¥¹½Ïï^“øT<ÏÛGwÓÜÙËý¡‹ŒœÇ§2‘Üütºþ3ƒ1 µááÂ_ÿÎû/ëκêdSü›Hm{O*×2r¦ÿ³§Wçü Jhoëà/|IEND®B`‚recoll-1.17.3/qtgui/images/cancel.png000755 001750 000000 00000001563 11740755063 020035 0ustar00dockeswheel000000 000000 ‰PNG  IHDRÄ´l;gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüÿÿ?-@1 üÒ…Aà¥3ƒ±ú/É3(\”c@7 €˜Ð Šíÿû‡áü" 5ª?Ïð—aÿy TÈ ÝP¾¨þh_ö?0Åm8ÔÐý²Žò2ö²ÿ€ì3"È ÝP½ N_ÁW@—ÜÖÇ4ÙPYA qySQËOñC  ˆ‹ÿ3€\¨ðÿï_†ß?~}gàÖra µøT|Ca8º¡ ߀ñÿßþýÇ Ø`€b4###(LAÞ¹d(Èp†_?>ßËðlåé@ aÏ€Íз÷ž1Ü?ñîÐŽfŸ.€Ì ¸Á S÷A.åQ·ÌðóÃNjǞ¬¿ü(Ç@ÈPXª ƒA¦  ð© ÿÉÀðã;Ãç›W€–üfàÇk(Ì`€Â0@a r¹¤®¿¢&Ø`†Ÿ þ4f0@a5®* ÿǰ_Î[K€WBÅÐ^2Ü9ò«¡0ƒˆW:…FØûȆ2|Ío°Üÿ¸3@1JüÈa 6ôÛ6EEpR<ÆŽ=¡Äìý_30|þõƒ3ƒ²3(Íî?ÆŠi8@¡„1.Caò>È¥ C¾ƒèã†×ïÿ1ÜùÅð¨ÝÑú/"¹Ü`B†‚" ™ ïƒ\*òhË À7†× dÊ1܆’AlðeFP)EL⇆é~e&Ñï¯#nhýÿÿ€b‚8(ð—áÁÿßÿ¦S«Ÿ@ö?G÷_cÆÙˆá /èAåéYq†óo|Dÿ¿vú,¥ÞŸâÃ]lef08ÂÀðþ%Ð] dŸ?-€@fJäËS`‚K)‰  Ô¥ ðý3 €0ª&Py ÄDWM@Ã`.EÎyÄH«Ê À€øØ4…IEND®B`‚recoll-1.17.3/qtgui/images/close.png000755 001750 000000 00000002137 11740755063 017713 0ustar00dockeswheel000000 000000 ‰PNG  IHDRÄ´l;gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ñIDATxÚbüÿÿ?-@±€FFFœ ¬­£€”Ì ˆœ8±ò.= 5Ä&Ð ¶±‰RÿÿÿËgdd`eea`cckøùóï_?þþýó¨f"PlÂéÓk?  @ 5R󙘘 LMüý45常Øáj®_̰k×q†Í›·3üùóûÐŒÄ3gÖ]@6 €P †º_HHH °0‰A]]o8>~üŠaòä¥@‹®‚\ìxöìú 0ƒn0Ôûû $%…ÞýÇÀÌÌ„ÕP˜Ü÷ï?º»ç1ܺud¨ã¹s>€Ì d] ïy1pp°]£  Î *ÊÏðþýgüäÉ+mm`¸³0üøñ‹!&ÆŸ››×h`Ì0€bB„Ë¿|e A Ÿ>}e°²Ò*ædæg——€úîÝ'°%%)vv60ÿþýˇ™@,°$Š}eey°Fxñâ=ƒ²2'˜-%% L ¿.\¸Í` ÷â³go6m:Àðôé  ¥€AÃ, §çJžˆªÆ–¤Þ½ûغõ(ƒ««0Eȃù ` ½d¨­ÊðõëW¸;0•ü @L°Xdeeeøüù Ðàp¼rå. +ï`D6CA€“““–‘ˆf0¼}ûÃÓ§¯1¨ ˆ=xðÃPø÷”+ÿÙ pŽz÷î=ŠBKKc†ÔT? ììôdäI‹PÄ¿}ûw$@Á‚â(›þúõ‹á÷ïß`lffÀ“ŒâýC‡.¢ž—Î0üãǰY y€ *P@yÿû÷ï ˜ecÈÏCÉaMM3¦O_ÎpäÈeÃ]]mXXX¾|ù .?®]Û 6 €3ÈÄÞ#€,?-Ú|úô Coïb`æaàååŠod8yò:XDŸ9s¬çõëW`3`† RÁ1þ¯^½6PSS¦†ëàðº}û!ØPn¸ V®ÜÁððás O/‚ů\¹ ÌÚß@YzL @¡B&&A l¹_ZZV@KK”¶ñP¦¹té*0•ÜBׯï‚B„Ql‚ ŸÏÉÉe ££̶ØK¸;w2\¼x˜ö? K„ 3 €°ô††þà‚”÷ÙÙÙ„„D€¥XógÏÞ¼y Lßá=ÐPŒ‚ €°Œ  y\5ýû÷¦ñ,öqUMÄH«Ê ÀàØúÄ`ÃæèIEND®B`‚recoll-1.17.3/qtgui/images/down.png000755 001750 000000 00000006760 11740755063 017563 0ustar00dockeswheel000000 000000 ‰PNG  IHDRÄ´l; pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF IDATxÚ”“MoU†ŸsïÌÄSÛñG§"j+" TEˆ*l@‚bÏ‚5B|õðØöP>¶H°aU‰Ï(P[Z¡´8 "qœ×&öÜ{Xxâ˜Ôã–#]͹çý?>nmmÅUûõWÄÅ/°xй×l µóoW§ÞDfG{{¿\²kß#k)ä’­ºðÄ;À'Y…tözõE{cj1äðÏ_ñÕ'/Ï*z0ÀÞË+?ÿ‹O½9©~Vü;\k.¥ `LIEND®B`‚recoll-1.17.3/qtgui/images/firstpage.png000644 001750 000000 00000002454 11740755063 020571 0ustar00dockeswheel000000 000000 ‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs íÀ,tIMEÓ ';]ȯ²¹IDATxÚ••Kˆ\E†¿ª{o¿»§ÍÌ$v0=3†$FCŠÁ A¢â"jwÄ•;])ˆÄ•м ˆ  DÑhıã˜ÄG0‰Nb2Ó=Ý=ý¸}ŸUå¢M4ÔâÔ9õñSçÔ)Á¿Xmϼftcr`ãcô¢£{/ÝmÑ?ÿÝ ì³AáäÐá£ÎóB'ûkæÕC®ëªÿ×ö̯ñ8–óp!Ÿ+_9Q’kÆ3lœè“u'Û~nh–›MÝîú¾NüCŽ<{½yó ×u“Ë‚k{æ§@ì#UÚ¾åê,wÝTdó:Ã것%G©èôN-Æ|Pøôh‡Èï}ŸÖí'®3û?¸·þ¢ôåB©tç½[ÇÄ£·eÙP±H;±‚(1¼x@qÃH)˜(ÙlžrXs…Ã醙èâÆ–™©oŸÍž­×ëæ"¸rÓŠÝ}sY„:Ö©,ŒGëµOà™3<ÿnÌ5kab0ưv•C1çˆïΪñ 2ÎZŽœ­‘Ú¯· +½÷†õ¥ÌÎ[3ì¸%ÍR'bjÂXóöœÅÓ¤‘Bpûu6'ÏD±&ˆ QbXUx‘ÍB3žnªuókøþ´]Û=ç`ÌÎB>Sª­O!„!Ÿ±èûš Ò|öS†gÌ\¬Cc%¦ë]ÚJ6VßžLÛ­ÂŽF<}Ø&-¥Ò˜,g†Áèv~ÂáÓ9žº?=*š1üÚŠøúÄ€(1# 2œm+Ž.–éù9ú¤feSOT«6PAÈêDQàGš?Rsøtî¥JÃ+ ÿ·žŸš€Hƒmƒ°*X©ª äé|ΉYñ4¥¼¸ `[âo{l€°àÃcd:+4EûB°8,u ¥¼äÿZ!S“< –6—¼,žÊ+þðR>ûT“„6F/gºC=£D/%?õ–æ±m’+Ë#ßàñ7`aù2GBA…`TCjoQ:º×æ ÛÚ± ¶U|aÙðÜ{ŠfoägSðä½°z !„‰Fk…Ö £)[!¢–¶ N”Í/çå—î¶Hèd¿ »]Gu(g&²C:+/¼ïÑŒ :3 /=ª™)÷YWP)xT «sŽê ƒŽ—QKǬå¶pOMž=Çõ3Â$³W;D‰á\Ë'-cT³ÐŒÙ°6E6-I;‚CÇV(¤ò©„¼“`‹˜3ç[„^çÀfñÎë@è×ëæªÚ#§Â˜k½ ™ c-R¶ íÒŽ!ˆ Íõ•4}Ó§3ˆF1Û ˆ9±ÐÓ­vwn\ßWçŽý‹CèîšÓj™ê\×·7õ†Ét1ç°ªh“r$)[%†#'}Z½„”-p,XîÆ=Õe±Ù››LŽì­ÊúWÀ²ëºê"¸^¯›í³¹vËLéúV®Ù§ûÃ$•±‘ÏÚØR"£hu<Žý<Ô?,ô++½ãêø¾ß¡ ×uãËþ »ví’@þ(÷ݑȳIJQ)f­,@ßWVºaœÈ¨¥ƒ凟KÀÊ?þ ‚ ÕPÓ垨V±RUE–Â$¡ÔÞbÙür~ÌZn}Àw]Wÿ™ñdz`Ó!€±IEND®B`‚recoll-1.17.3/qtgui/images/history.png000644 001750 000000 00000002753 11740755063 020310 0ustar00dockeswheel000000 000000 ‰PNG  IHDRÄ´l; pHYs  ­#½ugAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFaIDATxÚbd („løÿ÷ŸÁÿ?þýý{áɶЄô#. •¸ÝÿÿþÍÿ÷çoÐ@ Cÿaþçï {O|}"ù6ý„a°ZÒ>ÿÿþõ]–ð_€‹WY„ACEAUŠ›‹…‘áôýO Oo¿ax|ê>Ãïû¯€ýYðïÏ¿Â÷—³Q|@(«%ƒ ý¿ŸÙ@ÆZ!ÝZœ!@žƒá߆¶WdY|¼Ô~ùgßüfX¸÷!ÃñyGþ¼ùtè ÇO·‹à†3ÜДýÿÿÿßÏÄËnà­ÇÐæ(Æ #Ä 6ô/Pþé“ ¢ì ’² €bÂÌ öšB ì Ž?øýî‹+¯óÊߟöü™@pƒ… â¦3±³x¸Dè2” 0°112õ3üýÁª* ’2pþ£‡8ù…88ô†ï½!ñçów‰?_öm™@`ƒU÷Ãu†œ£ C•­+ÔPkÿÁ Ò —‚ð•K"œ,^<{Æ`äèÉ ÎÇÁð’Ÿ—áþî+Ììvÿþ8ø €˜@ Íçåf6…ú h2þùBÿâ+/0Äy:2üû÷ÁÀΙá×ï ?€¶jš(0ð©K€RL>ÈL€‚ü÷_€°Šƒž0Xóo˜¡ÿQ-¸ŒdhÍôE Bú¶ —>32ìxø™áá§Ÿ ÒöZÀ$ù7d&@±(En¥SU! —~ `ZÇ4” šfn^¾À𦵙‰ †æLXÀðMÙ‚áý/v†Ÿÿ(ؤôe.þý+ÀÀX$@LÀ`0%~AAN†+¯1lÝ~‹áˆï@ï¼øàÁ†Òè@†§2|þøÁ.&“á5PâÅ‹ <@€ðÛ›¯nn<Ï "- `0 ('ƒ‚è¼/?0ð2p2|üu5ÐÅ·ï=``°··g˜0aÃŽéðtßtô7¿ó×o ÿß}bàf †ÿÿÁrÄt1(q3|ûðÁ-ÞŠhà¨ÁÌ@uJ¦ö jöž Mí í“ø„ÅÁ©ä0Ép³01°±½ ƒªµ2ÃóGïav^ p(Êx®zo¢'`d¥ζ ›9™A4Ð"F o€úã;3 +Ð6`Dþ†í†ïÀ´÷ ˆ¿‚00ÆO¬;ǰ¹~0÷õ 8U]¼áÖɇ@Cþ dº„h+#/#Ðù¢|Ü ‚\l@q&0¹Ù@|eËyq@@A –R®¿`xvû8†!®ekæÓ˸¡–‚ÅXAj˜À²ñ£³2n"ˆ °Á/Ä^øÿûÏ‚5ÓŽ0üýþ¬¤äzN  .f¨¡Ì63 ýýõÃÒÊ5 £ƒ\Œ,´ÿýýWøöù§ =å›~}û.+€ŽG&Ȱ}ÇŸ2\¾üœƒ "Æ Å??ÿ`h˜ÅðæÉ{…0ónð›Ó©@E߃›//Ä-e¸tö1(õ€ gªºyé)Ãó»¯á©TÈ\”‚ €pVM\’­@Ãóô в? rT`¤?@c",LÑ@1S™2³— À²>0»^@w6`ÿÌB¯¾…¶aIEND®B`‚recoll-1.17.3/qtgui/images/nextpage.png000644 001750 000000 00000002401 11740755063 020410 0ustar00dockeswheel000000 000000 ‰PNG  IHDRÄ´l;gAMA¯È7Šé¸IDATxœ”Yl”U†Ÿó¯³´3¥í´‚-XÚR  ["!  ÁâBƒ 7¸4/$ã….QbbÀh 7"$QjP¤‘U@ì-]è:3ílÎ?óÿ¿ƒÔŠor’“œ|ï÷æ=ï÷ þö(0¤åïeìÍݯBÌøâßã!1þÈë‘õȪ3ÃÌüÖ1 ­£D?ˆÿb}×6„ã-QR=çÁº…Ì«-§´Ø…eÃðÈ$]ƒÜj¿Š=Öу•ÙGæ½C÷!Þ£àˆ °rGãºuìØTMó"ðºÀ4!g‚aÂhN]Ã_wÒÑzâ7?eÊ»ón‹ä{•6”B Û·íÞÊû»C,œ ƒè…þ0ŒLÀD,ªËaŲîzzz"‹íto%fÛÑ민ŒoÞ;^{†}Û\Ä’psRHNAYØ6„ã0•…ñØÔW©D´úºú0ª£˜m¿Þ!v¾XŽ(8üð¦-®·_2þXÄ'!äƒGÁÜR‰Á­0ä,HËÁ¥*]±b7./E]òÙ¶¤€­nÕ+š‚Ï=]A"Ý#0e@8½a ›Ø–"ÃÚ&¨(h’i˜H*AÃâ ´Y ÅXb+@žXqµÔ.k v´ä•ÄÓy+iø­Wâó LÓF–`Ãr˜WžoOC,å~(ªjD8œ|¯{Ѽ5 êBŒŽÃyËU%¯Z’@Qû5”SY6¯R‘%Áæ•`äàLhJ¾¦°4ĸË[“U_ )¸åEõx<.vÃ`ž_ ógÝþ]éN2MK;RIÀ³«`,—z@Q@ÕÈnOñD@qÚaéº0‘è‹€$Û,™ š:óPN·(´‰¦“Y0…„¢éÂT5I‘Ýʲ•™4²jÔP¼ù¥Ac¥ ä•IBÉÙ¸uhY®¡)ù¦­WrüI˜’±]Ë"ÉVF’Õ„’,ìŒ9ÓMщd­¿ÜI$ ?ÞÐ8Ùe#D^•mƒK‡ý™&=Ýžcï7CȸݠªNbÛÙŒê’8ÿIV’hèÄë¯ü>¿À甕ÞÙ"h®Í“žíαÿ;ìñz °ŠŠ`j|˦•ë»2€¬+‡†»;íx2ÍìRp¹Á]?šškaÅCy_/õåx·U 8e<p@Iìlšho§-ËÊ¡éÉË »¥•¶TfL¥q~}‡–šº&•^‹a‹Û9YÆ©ƒªAÐ\>}èÀàg± Û?ºgW(UO§Â-–â ÖÎ÷Qä[EÁ™~›óÃ’&£ëàr@¨œN8÷K7Ý®¶ª½Åè=2™ç]¬>Z#Ë|[½¬®ªyu%%•´q{'X·HàÒÀ¡Áh4Ë©“7é<{íºi²>ÒúxÇÔÿ Á5_•aiúCþ'ë—Ρ®ÆGЯOçÚÈÚ„£®uŒsù\Ñáè$ã¥ð‰§†îÉøLá/^s| ²´ÓåVWz|Aw€T2M|<žLe~ÆäÀ؉u'þuxf"þ %}_jçÌ* »@BŒ E¾>zìÑ‘ÿªû)}ÔE0q,XIEND®B`‚recoll-1.17.3/qtgui/images/prevpage.png000644 001750 000000 00000002402 11740755063 020407 0ustar00dockeswheel000000 000000 ‰PNG  IHDRÄ´l;gAMA¯È7Šé¹IDATxœ•[lUÇgn;;»Ûv/[J¡\*·å"E@Ò‚! ÆH‚D‰‰‰ø ‰‰ð‚ꋆ/#JH$"PÁ¨)5`±7*mi¡ô–vw»;»³3> tA.z’ïeΜßùÎ÷ÿŸó þsl÷¢§"Øš–ƒl%HjC°Ç|Ø*ñÀÏöj^F֟“W„æUH'Ò˜±²©Èì%ùѹÿ6Þ)"›ú£pSxÎU•S1;Ä„ †•…«&ç/ÑÔÐB¬ãw›äðçø­D÷Œ>ìÛQAÖ>d”//{~ë*^Zç£lX¤ÒµÝßÌ,\ì/sòÛ:¬žsù9’ôÞ ÖßšŒë#‹k§ì~w—Àõaè쇄éB%²’> ÁS°ßQ’­?6b¤kng.ƒåª/ý³kžx÷jÖ/‚Ö^ŠA& ªs&»Dã¶ –‚±”O+8“ŽŽh±=Ø${æûX{s=y¥;·mßÌÖU º`d Ì h ÔTBIò øã² N[î|Ò„â0\1'1ØÑ´1ÿÖ™k’òZÉ‚'Ù\£ÓÚ ƒ£K‚*Cuøu÷PÍÝ# ˆ§r1š„¬sƒeUB¼  ·+„ª-­ZVŽ®@{›Í¤<óø­ZGÏšÔý© ( DN !¹µ 8}6©®S«íü]†„œ-’ )˜5=Ÿæ+ÐÒ ²€µ sІ¶4¿]RåÉäûÜï†Çq$£cnÖyáJ T‚™¢(ªÈó‚Yâ|§›Í–•àÕr.¬œ¦ñØŒœ…lÇuÊ'uÐØá ,«²‘¯)éÅ‹êQH¤áê0”„œ[5Í9Ñ£ÞsÆGØï0Œe í€êQqdM(B÷Ä!ÍXÆáFRÐÙḭ̈s³:¯oÎp¦Ý&àu3µ°m×9Ç›F’2Ð=+#kư⑔떋ߌù#!éaÁ¡‹*º×âíZTNUùºÁádx|[> >?h*ŒưmózBRºåtôؘZ¸n™8uÚŒ ‰ † ¥_b4aQ5]BWÕsÝÂaSà÷ ¯Àð‚ÇãFÀýŒ\ë:œn}ã+ @’å½WÚ:È:6Å0| êþVØ{ʼ*¼¸¼>ð݆&†Ë$Ú} YÓöß¼ôŠ-I}±UhÞÒYsè282º ý†D-,-Z6ádY@8_CuûfÆa(jÒÒv“ 纈ö V…õúµ6ôÜɹkÚô\˜ð¿ „ôŠð.,ü†OÇqñ$7£±‘dÌ:É’.hq¬iëðQÊ\¡Ó¢±àšˆe°m»Ñòr)®‚V9ÒE¼6qz\^¢[Û¦¿¯¢q-»ÏŠ7{2I·F¿i€ZMuÕXÖS•¬­¿enn–µõ·üüAÅOfã‡ÃIEND®B`‚recoll-1.17.3/qtgui/images/spell.png000644 001750 000000 00000000523 11740755063 017717 0ustar00dockeswheel000000 000000 ‰PNG  IHDRÄ´l;gAMA± üabKGDÿÿÿ ½§“ pHYs  ­#½utIMEÑ ¬å¹ÐIDATxœíR» ƒ0}6=J‰†>0Æ Ã@ƒAn’4—"9Ç86d¥ˆò¤“,¿û<¿3ðGÂÌR»FŽ4/®9ÓôLmiš&œ,ÖZQ.¥²mÛ÷L "af!¢UR×uþLDÒ÷½÷Uk”K5Ïú6ޏ”Bg‹z«Ú‚†Á¬&Å*Ž8”|1¯˜™À¼båˆHEìâι¡ Ë¢÷u<žçÌ,fš$çvóqÄy\\¾¾·`á÷qLîáGqIüõ¯á0ØÎ„PÑ[§IEND®B`‚recoll-1.17.3/qtgui/images/table.png000755 001750 000000 00000006427 11740755063 017703 0ustar00dockeswheel000000 000000 ‰PNG  IHDRÄ´l; pHYs  ÒÝ~ü OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF2IDATxÚ´•½kTAÅwÞämv7Y5Š"XË XÙ,íì¬mýÄ^°,$¶6vö»e!ELLˆÆMÌÇ{ogîµØì’ ÙÄäÂc8o†3wÎaΈ™qå_¾™{·´´r¿b¡ª¨*Q S#FÅ€¨Š™ âpNâÀ9¡”¦$Îaf$>I§oL}òk+k³OŸ<žÌó‚Ž*!D¢1(1*!1F¢)$8¼&¯\ħ %ï‰1266J–å¼~;÷Àï¦NsTq ¿7¶IGµœ2’8²¼Cš&d6rÓ‹8>ù ˜uG†ùˆÿf ‚7îÍ>dh5€¸îwØ~ ÞãD¸;] Ùl233Ó_xRü}5G×Û¥WÎ vr«tur" û˜Uuhâ¢(!DèJQä»4›óÇÛ_'Á•k·Àƒ "}þWão?·@À!P=Óë,€5>“œ(•{æqÆ;<Àîî­ÖéÍkµZûÌ»…ˆâ1c¬ZåN½1´YõzZ­ÖÇFcÀ¼®Æ§âXODpb''?ööyШ,o„þÄr»™ë!tŽœ?ˆÍ_„¨Õ¸î²?J–”*5Ú«‹t__fuqÔ—H}Jµz•üWïÔ:L^¾ŽlµI© \’Àö֦ʳ¯žÿmo>Šj±—§``€™íEªí¼Ã9§1„~‹Î'–à Ô!ø‰‰ å¼ÓŸÎøùÑ8IEND®B`‚recoll-1.17.3/qtgui/images/up.png000755 001750 000000 00000006666 11740755063 017245 0ustar00dockeswheel000000 000000 ‰PNG  IHDRÄ´l; pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFÑIDATxÚ¬ÕÏoTUÀñï¹ï½™Î0Ã+ hhTBÍDwnŒ cÜÛ™?À’¼Vf²#qk ü ,Ûò¦ ‚`ºTЪ-–þ൯ÓöýºÇÅL«‰¿Æ©wõrßyŸ{òî9÷Šª2ÈhaðE»1:H¼ýá•þUñýf®ý/p+£Ÿßmø·V ’dL¬7ƒ0ÞÜ Âè׉†?½â.­°glZáËCãµfv‡‚[A-|Üð§æ F­âRPw Ëë±UnW›“ÿ·‚0Zj7ü©{ÊÈl—²8b Vâ‚'¹á«ÃG*“­àVF?¶þo¡ú0¥¬9Ð?|°×V6r–r¥søHyb²“ü#Ü Âè~»áßùªÁu-V{!Ò— @*Ž!N,‘ué<÷|éƒÉNú'X^¼òjóüt~·Ýð瀃‡Àyæªò’AP° q KåyÊPº†w Fwl7ß:ã5?™Î·a ùÞÑë÷Ž;wÏG=MÉÄ¡ÈJÀ“—³Ï]ÇXßTž=)œšåÚ½Y½ƒëPT–Iùéö)Ç2]\þôuÇØï—_Šg»¹ÎedYB‚ƒ°ÅG§eþóºçf©ÁQЬà™J™×Þ‡«ŸéMtóu,¤y‘Âcøzìxi'ã çÎ>ºð;{òéNå oÚí^³Ð]…dpâØ¬¹øöâÐçyôKBz›g¡ØT ‘ÚЧVªý'ÀcéeÞ›ö¬°}b'áά߫âo‡°Ì£€Qtg­ÇÃð†°@éáš‚Âò.`Y1@¸ Ù~ ™„ïñ ê¸àÒÄ¢ ýe7¿â±ÓÅÓ-\GÕJ¦TŒÚáá$ã’,oŒËžjlÖÖ3\#ñFî{g.¾ñ`7[¬fˆ¤"bú—oúoåöÛ®_3}[É¢[IEND®B`‚recoll-1.17.3/qtgui/i18n/recoll_cs.ts000644 001750 000000 00000320322 11757435273 017731 0ustar00dockeswheel000000 000000 AdvSearch All clauses VÅ¡echny výrazy Any clause NÄ›který z výrazů texts Texty spreadsheets Tabulky presentations PÅ™edstavení media Multimedia messages Zprávy other Jiné Bad multiplier suffix in size filter Å patná přípona násobitele ve filtru velikosti AdvSearchBase Advanced search PokroÄilé hledání Restrict file types Omezit souborových typů Save as default Uložit jako výchozí Searched file types Hledané souborové typy All ----> VÅ¡e ----> Sel -----> VýbÄ›r -----> <----- Sel <----- VýbÄ›r <----- All <----- VÅ¡e Ignored file types PÅ™ehlížené souborové typy Enter top directory for search Zadejte základní adresář pro hledání Browse Procházet Restrict results to files in subtree: Omezit výsledky na soubory v následujícím podadresáři: Start Search Spustit hledání Search for <br>documents<br>satisfying: Hledat dokumenty, které splňují následující hlediska: Delete clause Smazat poslední výraz Add clause PÅ™idat nový výraz Check this to enable filtering on file types ZaÅ¡krtnÄ›te pro zapnutí filtrování na souborové typy By categories Podle skupin Check this to use file categories instead of raw mime types ZaÅ¡krtnÄ›te pro používání skupin souborů místo mime-typů Close Zavřít All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. VÅ¡echna pole napravo, která nejsou prázdná, budou spojována spojeními AND (volba "VÅ¡echny výrazy") nebo OR (volba "NÄ›který z výrazů"). <br>Typy polí "Jakékoli" "VÅ¡e" a "Žádné" mohou pÅ™ijmout smÄ›s jednoduchých slov, a vÄ›ty uzavÅ™ené dvojitými uvozovkami.<br>Pole bez dat jsou pÅ™ehlížena. Invert Obrátit Minimum size. You can use k/K,m/M,g/G as multipliers Nejmenší velikost: Můžete použít k/K,m/M,g/G jako násobitele Min. Size Nejmenší velikost Maximum size. You can use k/K,m/M,g/G as multipliers NejvÄ›tší velikost: Můžete použít k/K,m/M,g/G jako násobitele Max. Size NejvÄ›tší velikost Select Vybrat Filter Filtrovat From Z To K Check this to enable filtering on dates Filter dates Find Check this to enable filtering on sizes Filter sizes CronToolW Cron Dialog Dialog Cron <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> dávkový rejstříkovací rozvrh (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Každé pole může obsahovat zástupný symbol (*), jednoduchou Äíselnou hodnotu, Äárkou oddÄ›lené seznamy (1,3,5) a rozsahy (1-7). ObecnÄ›ji, pole se budou používat <span style=" font-style:italic;">jak je</span> uvnitÅ™ souboru crontab, a lze použít úplnou stavbu crontab, podívejte se na crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Například, zadání <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Dny, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> a <span style=" font-family:'Courier New,courier';">15</span> v <span style=" font-style:italic;">Minuty</span> spustí rejstříkování (recollindex) každý den v 12:15 dopoledne a 7:15 odpoledne</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rozvrh s velmi Äastým spuÅ¡tÄ›ním je pravdÄ›podobnÄ› ménÄ› úÄinný než je rejstříkování ve skuteÄném Äase.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Dny v týdnu (* nebo 0-7, 0 nebo 7 je nedÄ›le) Hours (* or 0-23) Hodiny (* nebo 0-23) Minutes (0-59) Minuty (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">KlepnÄ›te na <span style=" font-style:italic;">Zakázat</span> pro zastavení automatického dávkového rejstříkování, <span style=" font-style:italic;">Povolit</span> pro jeho zapnutí, <span style=" font-style:italic;">ZruÅ¡it</span>, aby vÅ¡e zůstalo beze zmÄ›ny.</p></body></html> Enable Povolit Disable Zakázat It seems that manually edited entries exist for recollindex, cannot edit crontab Zdá se, že pro recollindex existují ruÄnÄ› upravené záznamy, nelze upravit crontab Error installing cron entry. Bad syntax in fields ? Chyba pÅ™i instalaci záznamu cron. Å patná skladba v polích? EditDialog Dialog Dialog FirstIdxDialog First indexing setup První nastavení rejstříkování <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Zdá se, že rejstřík pro toto nastavení neexistuje.</span><br /><br />Pokud chcete pouze zrejstříkovat svůj domovský adresář sadou rozumných výchozích nastavení, stisknÄ›te tlaÄítko <span style=" font-style:italic;">Spustit rejstříkování nyní</span>. Podrobnosti budete moci upravit pozdÄ›ji. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pokud chcete mít vÄ›tší dohled, použijte následující odkazy pro upravení nastavení rejstříkování a rozvrhu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">K tÄ›mto nástrojům lze pÅ™istupovat pozdÄ›ji v nabídce <span style=" font-style:italic;">Nastavení</span>.</p></body></html> Indexing configuration Nastavení rejstříkování This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Toto vám umožní nastavit adresáře, které chcete rejstříkovat, a další parametry, jako jsou cesty pro vylouÄené soubory, výchozí znakové sady atd. Indexing schedule Rozvrh rejstříkování This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Toto vám umožní zvolit mezi dávkovým rejstříkováním a rejstříkováním ve skuteÄném Äase, a nastavit automatický rozvrh pro dávkové rejstříkování (za použití cronu). Start indexing now Spustit rejstříkování nyní IdxSchedW Index scheduling setup Nastavení rozvrhu rejstříkování <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> rejstříkování může běžet nepÅ™etržitÄ›, soubory se rejstříkují pÅ™i jejich zmÄ›nÄ›, nebo běžet v samostatných intervalech. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ÄŒetba příruÄky vám může pomoci pÅ™i rozhodování se mezi tÄ›mito přístupy (stisknÄ›te F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tento nástroj vám může pomoci s nastavením rozvrhu pro automatizaci bÄ›hů dávkového rejstříkování, nebo spustit rejstříkování ve skuteÄném Äase, když se pÅ™ihlásíte (nebo obojí, což zřídkakdy dává smysl). </p></body></html> Cron scheduling Rozvrh cron The tool will let you decide at what time indexing should run and will install a crontab entry. Nástroj vám umožní rozhodnout se, kdy má rejstříkování běžet, a nainstaluje záznam crontab. Real time indexing start up SpuÅ¡tÄ›ní rejstříkování ve skuteÄném Äase Decide if real time indexing will be started when you log in (only for the default index). RozhodnÄ›te, zda se rejstříkování ve skuteÄném Äase spustí, když se pÅ™ihlásíte (pouze pro výchozí rejstřík). ListDialog Dialog Dialog GroupBox Seskupovací okénko Main No db directory in configuration Nenastaven žádný databázový adresář Could not open database in NepodaÅ™ilo se otevřít databázi v . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. . KlepnÄ›te na tlaÄítko ZruÅ¡it pro úpravu souboru s nastavením, pÅ™edtím než se zaÄne s rejstříkováním nebo na OK pro zapoÄetí s rejstříkováním. Configuration problem (dynconf Konfigurationsproblem (dynconf) "history" file is damaged or un(read)writeable, please check or remove it: Soubor "history" je poÅ¡kozen nebo nezapisovatelný/neÄitelný. Prověřte jej, prosím, anebo jej odstraňte: Preview &Search for: &Hledat: &Next &Další &Previous &PÅ™edchozí Match &Case Dbát na &psaní velkých a malých písmen Clear Vyprázdnit Creating preview text Vytváří se náhledový text Loading preview text into editor Náhledový text se nahrává do editoru Cannot create temporary directory Nelze vytvoÅ™it doÄasný adresář Cancel ZruÅ¡it Close Tab Zavřít kartu Missing helper program: Chybí program s nápovÄ›dou: Can't turn doc into internal representation for Chyba pÅ™i rejstříkování dokumentu Cannot create temporary directory: Nelze vytvoÅ™it doÄasný adresář: Error while loading file Chyba pÅ™i nahrávání souboru PreviewTextEdit Show fields Ukázat pole Show main text Ukázat hlavní text Print Tisk Print Current Preview Vytisknout nynÄ›jší náhled Show image Ukázat obrázek Select All Vybrat vÅ¡e Copy Kopírovat Save document to file Uložit dokument do souboru Fold lines Preserve indentation QObject Global parameters Celkové parametry Local parameters Místní parametry <b>Customised subtrees <b>Vlastní podstromy The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. Seznam podadresářů v rejstříkované hierarchii <br>kde nÄ›které parametry je potÅ™eba novÄ› vymezit. Výchozí: prázdný. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Parametry, které následují, jsou nastaveny buÄ na nejvyšší úrovni, pokud nic<br>nebo je v seznamu výše vybrán prázdný řádek, nebo pro vybraný podadresář.<br>Adresáře můžete pÅ™idat anebo odebrat klepnutím na tlaÄítka +/-. Skipped names PÅ™eskoÄené názvy These are patterns for file or directory names which should not be indexed. Toto jsou vzory pro názvy souborů nebo adresářů, které se nemají rejstříkovat. Default character set Výchozí znaková sada This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Toto je znaková sada, která se používá pro Ätení souborů, které svou znakovou sadu vnitÅ™nÄ› neurÄují, napÅ™.. soubory s textem.<br>Výchozí hodnota je prázdná a používá se hodnota prostÅ™edí NLS. Follow symbolic links Sledovat symbolické odkazy Follow symbolic links while indexing. The default is no, to avoid duplicate indexing BÄ›hem rejstříkování sledovat symbolické odkazy. Výchozí nastavení je ne kvůli vyvarovaní se dvojitého rejstříkování Index all file names Rejstříkovat vÅ¡echny souborové názvy Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Rejstříkovat vÅ¡echny názvy souborů, jejichž obsah nelze urÄit nebo zpracovat (žádný nebo nepodporovaný mime typ). Výchozí hodnota je ano Beagle web history Internetová historie Beagle RTIToolW Real time indexing automatic start Automatické spuÅ¡tÄ›ní rejstříkování ve skuteÄném Äase <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> rejstříkování může být nastaveno tak, aby běželo jako démon. Soubory jsou aktualizovány pÅ™i jejich zmÄ›nÄ›, ve skuteÄném Äase. Získáte tak vždy nejnovÄ›jší rejstřík, ale prostÅ™edky systému se pÅ™i tom používají nepÅ™etržitÄ›.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Spustit rejstříkovacího démona s mým sezením pracovní plochy. Also start indexing daemon right now. Spustit rejstříkovacího démona ihned. Replacing: Nahrazení: Replacing file Nahrazení souboru Can't create: Nelze vytvoÅ™it: Warning Varování Could not execute recollindex NepodaÅ™ilo se spustit recollindex Deleting: Mazání: Deleting file Smazání souboru Removing autostart OdstranÄ›ní automatického spuÅ¡tÄ›ní Autostart file deleted. Kill current process too ? Soubor automatického spuÅ¡tÄ›ní smazán. Zabít i souÄasný proces? RclMain About Recoll O programu Recoll Executing: [ Provádí se: [ Cannot retrieve document info from database Žádné informace o dokumentu v databázi Warning Varování Can't create preview window Nelze vytvoÅ™it náhledové okno Query results Výsledky Document history Historie dokumentu History data Historická data Indexing in progress: Rejstříkuje se: Files Soubory Purge VyÄistit Stemdb Kmeny slov Closing ZavÅ™ení Unknown Neznámý This search is not active any more Toto hledání už není Äinné Can't start query: Nelze spustit hledání: Bad viewer command line for %1: [%2] Please check the mimeconf file Chybový příkaz pro prohlížeÄ pro %1: [%2] Prověřte soubor mimeconf Cannot extract document or create temporary file Nelze vytáhnout dokument nebo vytvoÅ™it doÄasný soubor (no stemming) (žádné rozšíření kmene slova) (all languages) (vÅ¡echny jazyky) error retrieving stemming languages Chyba pÅ™i vyhledání jazyka kmene slova Update &Index Obnovit &rejstřík Indexing interrupted Rejstříkování pÅ™eruÅ¡eno Stop &Indexing Zastavit &rejstříkování All VÅ¡e media Multimedia message Zpráva other Jiné presentation PÅ™edstavení spreadsheet Tabulky text Text sorted TřídÄ›no filtered Filtrováno External applications/commands needed and not found for indexing your file types: Pro rejstříkování vaÅ¡ich mime typů jsou potÅ™eba vnÄ›jší programy/příkazy, které ale nebyly nalezeny: No helpers found missing Nenalezeny žádné pomocné programy Missing helper programs Chybí pomocné programy Document category filter Filtr pro skupinu dokumentu No external viewer configured for mime type [ Žádný vnÄ›jší prohlížeÄ nebyl nastaven pro mime typ [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? ProhlížeÄ stanovený v mime zobrazení pro %1: %2 nenalezen. Chcete spustit dialog s nastavením? Can't access file: Nelze pÅ™istoupit k souboru: Can't uncompress file: Nelze rozbalit soubor: Save file Uložit soubor Result count (est.) PoÄet výsledků (odhad) Query details Podrobnosti o hledání Could not open external index. Db not open. Check external indexes list. NepodaÅ™ilo se otevřít vnÄ›jší rejstřík. Databáze neotevÅ™ena. Prověřte seznam vnÄ›jších rejstříků. No results found Nenalezeny žádné výsledky None Žádný Updating Obnova Done Hotovo Monitor Dohled Indexing failed Rejstříkování se nezdaÅ™ilo The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone NynÄ›jší rejstříkovací proces nebyl spuÅ¡tÄ›n z tohoto rozhraní. KlepnÄ›te na OK pro jeho zabití, nebo na ZruÅ¡it, aby byl ponechán sám Erasing index Smazání rejstříku Reset the index and start from scratch ? Nastavit rejstřík znovu a zaÄít od nuly? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Hledání běží.<br>Kvůli omezením rejstříkovací knihovny<br>zruÅ¡ení ukonÄí program Error Chyba Index not open Rejstřík neotevÅ™en Index query error Chyba pÅ™i dotazu na rejstřík Indexed Mime Types Rejstříkované mime typy Content has been indexed for these mime types: Obsah byl rejstříkován pro tyto mime typy: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Rejstřík není pro tento soubor nejnovÄ›jší. Odmítá se riziko, že by byl ukázán Å¡patný záznam. KlepnÄ›te na OK pro obnovení rejstříku pro tento soubor, pak, až bude rejstříkování hotovo, spusÅ¥te dotaz znovu. Jinak klepnÄ›te na ZruÅ¡it. Can't update index: indexer running Nelze obnovit rejstřík: běží rejstříkovaÄ Indexed MIME Types RclMainBase Previous page PÅ™edchozí strana Next page Další strana &File &Soubor E&xit &UkonÄit &Tools &Nástroje &Help &NápovÄ›da &Preferences &Nastavení Search tools Nástroje pro hledání Result list Seznam s výsledky &About Recoll &O programu Recoll Document &History &Historie dokumentu Document History Historie dokumentu &Advanced Search &PokroÄilé hledání Advanced/complex Search PokroÄilé/Složené hledání &Sort parameters Parametry &třídÄ›ní Sort parameters Parametry třídÄ›ní Next page of results Další strana s výsledky Previous page of results PÅ™edchozí strana s výsledky &Query configuration Nastavení &hledání &User manual &Uživatelská příruÄka Recoll Recoll Ctrl+Q Ctrl+Q Update &index Obnovit &rejstřík Term &explorer Průzkumník &výrazů Term explorer tool Nástroj průzkumníka výrazů External index dialog Dialog pro vnÄ›jší rejstříkování &Erase document history &Vymazat historii dokumentu First page První strana Go to first page of results Jít na první stranu s výsledky &Indexing configuration Nastavení &rejstříkování All VÅ¡e &Show missing helpers &Ukázat chybÄ›jící pomocné programy PgDown O stranu dolů (PgDown) PgUp O stranu nahoru (PgUp) &Full Screen &Celá obrazovka F11 F11 Shift+Home Shift+Home Full Screen Na celou obrazovku &Erase search history &Vymazat historii hledání sortByDateAsc Třídit podle data vzestupnÄ› Sort by dates from oldest to newest Roztřídit podle data od nejstaršího po nejnovÄ›jší sortByDateDesc Třídit podle data sestupnÄ› Sort by dates from newest to oldest Roztřídit podle data od nejnovÄ›jšího po nejstarší Show Query Details Ukázat podrobnosti hledání Show results as table Ukázat výsledky jako tabulku &Rebuild index &Sestavit rejstřík znovu &Show indexed types &Ukázat rejstříkované typy Shift+PgUp Shift+PgUp &Indexing schedule Rozvrh &rejstříkování E&xternal index dialog Dialog pro &vnÄ›jší rejstříkování RecollModel File name Název souboru Mime type Mime typ Date Datum Abstract Výtah Author Autor Document size Velikost dokumentu Document date Datum dokumentu File size Velikost souboru File date Datum souboru Ipath Ipath Keywords KlíÄová slova Original character set Původní znaková sada Relevancy rating Hodnocení závažnosti Title Název URL Adresa (URL) Mtime Mtime Date and time Datum a Äas Ipath Ipath MIME type ResList Result list Výsledky Unavailable document Nedostupný dokument Previous PÅ™edchozí Next Další <p><b>No results found</b><br> <p><b>Nebyly nalezeny žádné výsledky</b><br> &Preview &Náhled Copy &URL Kopírovat adresu (&URL) Find &similar documents Najít &podobné dokumenty Query details Suchdetails (show query) (ukázat hledání) Copy &File Name Kopírovat název &souboru Document history Historie dokumentu Preview Náhled Open Otevřít <p><i>Alternate spellings (accents suppressed): </i> <p><i>Náhradní pravopis (přízvuky potlaÄeny): </i> &Write to File &Zapsat do souboru Preview P&arent document/folder Náhled na &rodiÄovský dokument/složku &Open Parent document/folder &Otevřít rodiÄovský dokument/složku &Open &Otevřít Documents Dokumenty out of at least mimo alespoň for pro ResTable &Reset sort Nastavit třídÄ›ní &znovu &Delete column &Smazat sloupec Add " PÅ™idat " " column " sloupec Save table to CSV file Uložit tabulku jako soubor CSV Can't open/create file: Nelze otevřít/vytvoÅ™it soubor: &Preview &Náhled &Open &Otevřít Copy &File Name Kopírovat název &souboru Copy &URL Kopírovat adresu (&URL) &Write to File &Zapsat do souboru Find &similar documents Najít &podobné dokumenty Preview P&arent document/folder Náhled na &rodiÄovský dokument/složku &Open Parent document/folder &Otevřít rodiÄovský dokument/složku &Save as CSV &Uložit jako CSV Add "%1" column PÅ™idat sloupec "%1" ResTableDetailArea &Preview &Náhled &Open &Otevřít Copy &File Name Kopírovat název &souboru Copy &URL Kopírovat adresu (&URL) &Write to File &Zapsat do souboru Find &similar documents Najít &podobné dokumenty Preview P&arent document/folder Náhled na &rodiÄovský dokument/složku &Open Parent document/folder &Otevřít rodiÄovský dokument/složku SSearch Any term Jakýkoli výraz All terms VÅ¡echny výrazy File name Název souboru Completions DoplnÄ›ní Select an item: Vyberte položku: Too many completions PříliÅ¡ mnoho doplnÄ›ní Query language Jazyk hledání Bad query string Å patný Å™etÄ›zec hledání Out of memory Není dostupná žádná další paměť Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Zadejte výraz jazyka hledání. Seznam:<br> <i>term1 term2</i> : 'term1' a 'term2' do kteréhokoli pole.<br> <i>field:term1</i> : 'term1' do pole 'field'.<br> Obvyklé názvy polí/synonyma:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudopole: dir, mime/format, type/rclcat, date.<br> Příklady intervalů dvou dat: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> Nepovoleny žádné závorky.<br> <i>"term1 term2"</i> : vÄ›tný úsek (musí se objevit pÅ™esnÄ›). Možné modifikátory:<br> <i>"term1 term2"p</i> : neuspořádané hledání podle blízkosti s výchozí vzdáleností.<br> Použijte odkaz <b>Ukázat hledání</b>, když máte o výsledku pochybnost, a podívejte se do příruÄky (&lt;F1>) na další podrobnosti. Enter file name wildcard expression. Zadejte žolíkový výraz (zástupný symbol) pro název souboru. Enter search terms here. Type ESC SPC for completions of current term. Zde zadejte hledané výrazy. StisknÄ›te ESC SPC pro doplnÄ›ní souÄasného výrazu. SSearchBase SSearchBase SSearchBase Clear Smazat Ctrl+S Ctrl+S Erase search entry Smazat hledaný záznam Search Hledat Start query Spustit hledání Enter search terms here. Type ESC SPC for completions of current term. Zde zadejte hledané výrazy. StisknÄ›te ESC SPC pro doplnÄ›ní souÄasného výrazu. Choose search type. Vyberte typ hledání. SearchClauseW SearchClauseW SearchClauseW Any of these jakýkoli z tÄ›chto All of these VÅ¡echny tyto None of these Žádný z tÄ›chto This phrase Tato slova Terms in proximity Podobné výrazy File name matching Odpovídající názvy souborů Select the type of query that will be performed with the words Vyberte druh hledání, se kterým se slova budou hledat Number of additional words that may be interspersed with the chosen ones PoÄet slov, která se smÄ›jí nacházet mezi hledanými No field Žádné pole Any Jakýkoliv All VÅ¡e None Žádný Phrase Tato slova Proximity Podobné výrazy File name Název souboru SortForm Date Datum Mime type Mime Type SortFormBase Sort Criteria Sortierkriterium Sort the Zeige die most relevant results by: relevantesten Ergebnisse sortiert nach: Descending Absteigend Close Schließen Apply Übernehmen SpellBase Term Explorer Průzkumník výrazů &Expand &Rozbalit Alt+E Alt+E &Close &Zavřít Alt+C Alt+C Term Ausdruck No db info. Žádné informace o databázi. SpellW Wildcards Zástupné symboly Regexp Regulární výraz Spelling/Phonetic Pravopis/Hláskosloví Aspell init failed. Aspell not installed? Chyba pÅ™i spuÅ¡tÄ›ní Aspellu. Aspell není nainstalován? Aspell expansion error. Chyba rozšíření Aspell. Stem expansion Rozšíření kmene slova error retrieving stemming languages Chyba pÅ™i vyhledání jazyka kmene slova No expansion found Nenalezeno žádné rozšíření Term Výraz Doc. / Tot. Dok. / Tot. Index: %1 documents, average length %2 terms Rejstřík: %1 dokumentů, průmÄ›rná délka %2 výrazy(ů) UIPrefsDialog The selected directory does not appear to be a Xapian index Zdá se, že vybraný adresář není rejstříkem Xapian Index This is the main/local index! Toto je hlavní/místní rejstřík! The selected directory is already in the index list Vybraný adresář je již Äástí rejstříkového seznamu Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Vyberte adresář s rejstříkem Xapian Indexverzeichnis (napÅ™.: /home/benutzer/.recoll/xapiandb) error retrieving stemming languages Chyba pÅ™i vyhledání jazyka kmene slova Choose Vybrat UIPrefsDialogBase User interface Benutzeroberfläche Number of entries in a result page Anzahl der Ergebnisse pro Seite Result list font Schriftart für Ergebnisliste Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Öffnet einen Dialog zur Auswahl der Schriftart für die Ergebnisliste Reset Reset Resets the result list font to the system default Setzt die Schriftart für die Ergebnisliste zurück auf den Standardwert Auto-start simple search on whitespace entry. Automatisch eine einfache Suche starten, wenn ein Worttrenner im Sucheingabefeld eingegeben wird. Start with advanced search dialog open. Nach dem Start automatisch den Dialog für die erweiterte Suche öffnen. Start with sort dialog open. Nach dem Start automatisch den Sortierdialog öffnen. Search parameters Suchparameter Stemming language Stemming Sprache Dynamically build abstracts Zusammenfassungen dynamisch erzeugen Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Festlegung ob Zusammenfassungen für Ergebnisse im Kontext der Suchparameter erzeugt werden (kann bei großen Dokumenten langsam sein). Replace abstracts from documents Ersetzen der Zusammenfassungen in den Dokumenten Do we synthetize an abstract even if the document seemed to have one? Festlegung ob eine Zusammenfassung auch dann erzeugt wird, wenn das Dokument schon eine Zusammenfassung enthält Synthetic abstract size (characters) Länge der erzeugten Zusammenfassung (Zeichen) Synthetic abstract context words Anzahl der Kontextworte in der Zusammenfassung External Indexes externe Indizes Add index Index hinzufügen Select the xapiandb directory for the index you want to add, then click Add Index Wählen Sie das xapiandb-Verzeichnis des zuzufügenden Indizes und klicken Sie auf Index hinzufügen Browse Auswahl &OK &OK Apply changes Änderungen übernehmen &Cancel &Abbrechen Discard changes Änderungen verwerfen Result paragraph<br>format string Formatstring für Ergebnisse Automatically add phrase to simple searches Automatisches Zufügen von Sätzen zu einfachen Suchen A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Eine Suche nach [Jürgen Klinsmann] wird geändert nach [Jürgen OR Klinsmann OR (Jürgen PHRASE 2 Klinsmann)]. Dadurch sollten Ergebnisse, die exakte Übereinstimmungen der Suchworte enthalten, stärker gewichtet werden. User preferences Benutzereinstellungen Use desktop preferences to choose document editor. Die Einstellung des Dokumenteneditors erfolgt in den Desktopvoreinstellungen. External indexes Externe Indizes Toggle selected Auswahl umkehren Activate All Alle Auswählen Deactivate All Alle Abwählen Remove selected Ausgewählte entfernen Remove from list. This has no effect on the disk index. Aus der Liste entfernen. Dies hat keinen Einfluss auf den gespeicherten Index. Remember sort activation state. Speichern, ob Sortieren aktiviert ist. ViewAction Changing actions with different current values MÄ›ní se Äinnosti s odliÅ¡nými nynÄ›jšími hodnotami Mime type Mime typ Command Příkaz MIME type ViewActionBase File type Dateityp Action Aktion Select one or several file types, then click Change Action to modify the program used to open them Wählen Sie einen oder mehrere Dateitypen und klicken Sie auf "Ändere Aktion" um das verknüpfte Programm zum Öffnen anzupassen. Change Action ZmÄ›nit Äinnost Close Zavřít Native Viewers ProhlížeÄe Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. Vyberte jeden nebo nÄ›kolik mime typů a potom klepnÄ›te na "ZmÄ›nit Äinnost"<br>Taktéž můžete tento dialog zavřít a zaÅ¡krtnout "Použít nastavení pracovní plochy"<br>v hlavním panelu, aby se tento seznam pÅ™ehlížel a pracovní plocha se použila jako výchozí. confgui::ConfBeaglePanelW Steal Beagle indexing queue Ukrást rejstříkovací Å™adu Beagle Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Beagle NESMÇ běžet. Povolí zpracování Å™ady Beagle pro rejstříkování internetové historie Firefoxu.<br>(také byste mÄ›l nainstalovat přídavný modul Beagle pro Firefox) Entries will be recycled once the size is reached Záznamy budou opÄ›tnÄ› použity, jakmile bude velikost dosažena Web page store directory name Název adresáře pro ukládání internetové stránky The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Název pro adresář, kam se mají ukládat kopie navÅ¡tívených internetových stránek.<br>Neabsolutní cesta je vzata relativnÄ› k adresáři s nastavením. Max. size for the web store (MB) NejvÄ›tší velikost pro ukládání internetových stránek (MB) confgui::ConfIndexW Can't write configuration file Nelze zapsat soubor s nastavením confgui::ConfParamFNW Choose Vybrat confgui::ConfParamSLW + + - - confgui::ConfSubPanelW Global Celkové Max. compressed file size (KB) NejvÄ›tší velikost zabaleného souboru (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Tato hodnota nastavuje práh, za kterým nebudou zabalené soubory zpracovávány. Nastavte na -1 pro žádné omezení, na 0 pro vůbec žádné rozbalování. Max. text file size (MB) NejvÄ›tší velikost textového souboru (KB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Tato hodnota nastavuje práh, za kterým nebudou textové soubory zpracovávány. Nastavte na -1 pro žádné omezení. Je to kvůli vylouÄení obřích souborů se zápisem z rejstříkování. Text file page size (KB) Velikost stránky textového souboru (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Pokud je nastavena tato hodnota (nerovná se -1), textové soubory budou pro rejstříkování rozdÄ›leny na kousky o této velikosti. To pomůže pÅ™i prohledávání velmi velkých textových souborů (napÅ™. souborů se zápisem). Max. filter exec. time (S) NejvÄ›tší Äas na provedení filtru (s) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. VnÄ›jší filtry pracující déle než po tak dlouho budou pÅ™eruÅ¡eny. Je to pro ten zřídkavý případ (napÅ™. postscript), kdy by dokument mohl zapříÄinit filtr loopSet na -1 pro žádné omezení. confgui::ConfTopPanelW Top directories PoÄáteÄní adresáře The list of directories where recursive indexing starts. Default: your home. Seznam adresářů, ve kterých zaÄíná rejstříkování vÄetnÄ› podsložek. Výchozí: adresář Home. Skipped paths PÅ™eskoÄené cesty These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Názvy adresářů, které se nebudou rejstříkovat.<br>Může obsahovat zástupné symboly (žolíky). Musí odpovídat cestám, které rejstříkovaÄ vidí (napÅ™. pokud v paÄáteÄních adresářích stojí '/home/me' a '/home' je ve skuteÄnosti odkazem na '/usr/home', potom by byl správným zápisem skippedPath '/home/me/tmp*' a ne '/usr/home/me/tmp*') Stemming languages Jazyky rozšíření kmenů slov The languages for which stemming expansion<br>dictionaries will be built. Jazyky, pro které se vytvoří <br>adresáře rozšíření kmenů slov. Log file name Název pro soubor se zápisem The file where the messages will be written.<br>Use 'stderr' for terminal output Soubor, do kterého se zapíše výstupní zpráva.<br>Pro výstupy na terminál použijte 'stderr' Log verbosity level Úroveň podrobnosti zápisu This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Tato hodnota upravuje množství zpráv,<br>od pouze chyb až po velké množství dat zajímavých pro ladÄ›ní. Index flush megabytes interval Interval v megabytech pro spláchnutí rejstříku This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Tato hodnota upravuje množství dat, která jsou rejstříkována mezi spláchnutími na disk.<br>Pomáhá to řídit použití pamÄ›ti rejstříkovaÄe. Výchozí je 10 MB Max disk occupation (%) NejvÄ›tší využívání disku (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Jde o procentní podíl využívání disku, kdy rejstříkování selže a zastaví se (kvůli vyhnutí se zaplnÄ›ní vaÅ¡eho disku).<br>0 znamená žádné omezení (tato hodnota je nastavena jako výchozí). No aspell usage Nepoužívat aspell Aspell language Jazyk aspellu The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Jazyk pro adresář aspellu. MÄ›lo by to vypadat jako 'en' nebo 'fr' nebo 'cs'...<br>Pokud není tato hodnota nastavena, použije se pro její vypoÄítání prostÅ™edí NLS, což obvykle pracuje. Pro získání pÅ™edstavy o tom, co je ve vaÅ¡em systému nainstalováno, napiÅ¡te 'aspell config' a hledejte soubory .dat v adresáři 'data-dir'. Database directory name Název adresáře s databází The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Název pro adresář, v nÄ›mž se má ukládat rejstřík.<br>Neabsolutní cesta je vzata relativnÄ› k adresáři s nastavením. Výchozí je 'xapiandb'. Use system's 'file' command Použít příkaz 'file' Use the system's 'file' command if internal<br>mime type identification fails. Použít příkaz 'file', když vnitÅ™ní<br>rozpoznání mime typu selže. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Zakáže používání aspellu pro vytvoÅ™ení pÅ™ibližné podoby pravopisu v nástroji průzkumníka výrazů.<br> UžiteÄné, pokud aspell není přítomen anebo nepracuje. uiPrefsDialogBase User preferences Uživatelská nastavení User interface Uživatelské rozhraní Number of entries in a result page PoÄet výsledků na stranu If checked, results with the same content under different names will only be shown once. Je-li zaÅ¡krtnuto, budou výsledky se stejným obsahem pod jinými názvy ukázány jen jednou. Hide duplicate results. Skrýt zdvojené výsledky. Highlight color for query terms Zvýraznit barvu výrazů hledání Result list font Písmo pro seznam s výsledky Opens a dialog to select the result list font OtevÅ™e dialog pro výbÄ›r písma seznamu výsledků Helvetica-10 Helvetica-10 Resets the result list font to the system default Nastaví písmo pro seznam s výsledky znovu na výchozí hodnotu Reset Nastavit znovu Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Stanovuje formát pro každý odstavec seznamu s výsledky. Použijte qt nahrazení formátu html a printf:<br>%A pÅ™ehled<br> %D datum<br> %I název obrázku ikony<br> %K klíÄová slova (jsou-li)<br> %L odkazy na náhled a úpravy<br> %M mime typ<br> %N poÄet výsledků<br> %R procento významnosti<br> %S informace o velikosti<br> %T název<br> %U adresa (URL)<br> Result paragraph<br>format string ŘetÄ›zec formátu<br>pro výsledky Texts over this size will not be highlighted in preview (too slow). Texty nad tuto velikost nebudou v náhledu zvýrazňovány (příliÅ¡ pomalé). Maximum text size highlighted for preview (megabytes) NejvÄ›tší velikost textu zvýraznÄ›ného pro náhled (megabyty) Use desktop preferences to choose document editor. Použít nastavení pracovní plochy pro výbÄ›r editoru pro dokumenty. Choose editor applications Vybrat programy editorů Display category filter as toolbar instead of button panel (needs restart). Zobrazit skupinový filtr jako nástrojový pruh místo tlaÄítkového panelu (potÅ™ebuje spustit program znovu). Auto-start simple search on whitespace entry. Automaticky spustit jednoduché hledání, když je do zadávacího pole pro hledání zadáno prázdné místo (mezera). Start with advanced search dialog open. Po spuÅ¡tÄ›ní automaticky otevřít dialog pro rozšířené hledání. Start with sort dialog open. Nach dem Start automatisch den Sortierdialog öffnen. Remember sort activation state. Zapamatovat si stav zapnutí hledání. Prefer Html to plain text for preview. UpÅ™ednostňovat pro náhled HTML pÅ™ed prostým textem. Search parameters Parametry hledání Stemming language Jazyk kmene slova A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Hledání [Ježíš Kristus] se zmÄ›ní na [Ježíš OR Kristus OR (Ježíš PHRASE 2 Kristus)]. Tímto by mÄ›ly být silnÄ›ji zváženy výsledky, které obsahují pÅ™esné shody s hledaným slovem. Automatically add phrase to simple searches Automatické pÅ™idání vÄ›t do jednoduchého hledání Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Stanovení, zda se má vytvoÅ™it pÅ™ehled pro výsledky v souvislosti s parametrem hledání. U velkých dokumentů může být pomalé. Dynamically build abstracts Vytvářet pÅ™ehledy dynamicky Do we synthetize an abstract even if the document seemed to have one? Stanovení, zda se má vytvoÅ™it pÅ™ehled i tehdy, když dokument již nÄ›jaký pÅ™ehled obsahuje. Replace abstracts from documents Nahradit pÅ™ehledy v dokumentech Synthetic abstract size (characters) Délka vytvoÅ™eného pÅ™ehledu (znaky) Synthetic abstract context words PoÄet souvisejících slov v pÅ™ehledu The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Slova v seznamu budou v záznamu jazyka hledání automaticky obrácena na vÄ›ty ext:xxx. Query language magic file name suffixes. Kouzelné přípony souborového názvu jazyka hledání. Enable Povolit External Indexes VnÄ›jší rejstříky Toggle selected PÅ™epnout vybrané Activate All Zapnout vÅ¡e Deactivate All Vypnout vÅ¡e Remove from list. This has no effect on the disk index. Odstranit ze seznamu. Nemá to žádný úÄinek na uložený rejstřík. Remove selected Odstranit vybrané Click to add another index directory to the list Klepnout pro pÅ™idání dalšího rejstříkového adresáře do seznamu Add index PÅ™idat rejstřík Apply changes Použít zmÄ›ny &OK &OK Discard changes Zahodit zmÄ›ny &Cancel Z&ruÅ¡it Abstract snippet separator OddÄ›lovaÄ kousku pÅ™ehledu Use <PRE> tags instead of <BR>to display plain text as html. Použít znaÄky <PRE> namísto <BR> pro zobrazení prostého textu jako HTML. Lines in PRE text are not folded. Using BR loses indentation. Řádky v textu PRE nejsou složeny. Použití BR povede ke ztrátÄ› odsazení. Style sheet Stylový list Opens a dialog to select the style sheet file OtevÅ™e dialog pro výbÄ›r souboru se stylovým listem Choose Vybrat Resets the style sheet to default Nastaví stylový list znovu na výchozí Lines in PRE text are not folded. Using BR loses some indentation. Řádky v textu PRE nejsou složeny. Použití BR povede ke ztrátÄ› odsazení. Use <PRE> tags instead of <BR>to display plain text as html in preview. Použít znaÄky <PRE> namísto <BR> pro zobrazení prostého textu formátovaného v náhledu jako HTML. Result List Seznam s výsledky Edit result paragraph format string Upravit Å™etÄ›zec formátu pro výsledky Edit result page html header insert Upravit záhlaví html na stranÄ› s výsledky Date format (strftime(3)) Formát data (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Práh Äetnosti (procento), od kterého se výrazy nepoužívají. Slovní obraty obsahující příliÅ¡ Äetné výrazy způsobují výkonnostní potíže. PÅ™eskoÄené výrazy zvÄ›tÅ¡ují vzdálenost slovního obratu a zmenÅ¡ují úÄinnost funkce automatického hledání slovního obratu. Výchozí hodnota je 2 (procenta). Autophrase term frequency threshold percentage ÄŒetnost výskytu výrazu (procento) pro automatické tvoÅ™ení slovních obratů recoll-1.17.3/qtgui/i18n/recoll_de.ts000644 001750 000000 00000254556 11757435273 017733 0ustar00dockeswheel000000 000000 AdvSearch All clauses Alle Ausdrücke Any clause Einen der Ausdrücke texts Texte spreadsheets Tabellen presentations Präsentationen media Medien messages Nachrichten other andere Bad multiplier suffix in size filter AdvSearchBase Advanced search Erweiterte Suche Restrict file types Einschränkung der Dateitypen Save as default Als Standard speichern Searched file types Durchsuchte Dateitypen All ----> Alle ----> Sel -----> Auswahl -----> <----- Sel <----- Auswahl <----- All <----- Alle Ignored file types Ignorierte Dateitypen Enter top directory for search Geben Sie das Basisverzeichnis für die Suche an Browse Durchsuchen Restrict results to files in subtree: Einschränkung der Ergebnisse auf Dateien in folgendem Unterverzeichnis: Start Search Suche starten Search for <br>documents<br>satisfying: Suche nach Dokumenten, die folgende Kriterien erfüllen: Delete clause letzten Ausdruck löschen Add clause Neuen Ausdruck zufügen Check this to enable filtering on file types Auswählen, um Filterung auf Dateitypen zu aktivieren By categories Per Kategorien Check this to use file categories instead of raw mime types Auswählen, um Dateikategorien anstatt der Mime-Typen zu verwenden Close Schließen All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Invert Minimum size. You can use k/K,m/M,g/G as multipliers Min. Size Maximum size. You can use k/K,m/M,g/G as multipliers Max. Size Filter From To Check this to enable filtering on dates Filter dates Find Check this to enable filtering on sizes Filter sizes CronToolW Cron Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Hours (* or 0-23) Minutes (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> Enable Disable It seems that manually edited entries exist for recollindex, cannot edit crontab Error installing cron entry. Bad syntax in fields ? EditDialog Dialog FirstIdxDialog First indexing setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> Indexing configuration This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Indexing schedule This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Start indexing now IdxSchedW Index scheduling setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> Cron scheduling The tool will let you decide at what time indexing should run and will install a crontab entry. Real time indexing start up Decide if real time indexing will be started when you log in (only for the default index). ListDialog Dialog GroupBox Main No db directory in configuration Kein Datenbankverzeichnis konfiguriert Could not open database in Fehler beim Öffnen der Datenbank in . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. . Drücken Sie Abbrechen, um die Konfigurationsdatei vor dem Start der Indizierung anzupassen oder OK um mit der Indizierung zu beginnen. Configuration problem (dynconf Konfigurationsproblem (dynconf) "history" file is damaged or un(read)writeable, please check or remove it: Preview &Search for: &Suche nache: &Next &Nächstes &Previous &Vorheriges Match &Case Groß/Kleinschreibung &beachten Clear Leeren Creating preview text Erzeuge Vorschautext Loading preview text into editor Lade Vorschautext in den Editor Cannot create temporary directory Fehler beim Anlegen des temporären Verzeichnisses Cancel Abbrechen Close Tab Reiter schließen Missing helper program: Fehlendes Hilfsprogramm: Can't turn doc into internal representation for Fehler bei der Indizierung des Dokuments Cannot create temporary directory: Error while loading file PreviewTextEdit Show fields Show main text Print Print Current Preview Show image Select All Copy Save document to file Fold lines Preserve indentation QObject Global parameters Globale Parameter Local parameters Lokale Parameter <b>Customised subtrees The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. Skipped names Übersprungene Namen These are patterns for file or directory names which should not be indexed. Default character set Standard Zeichensatz This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Der Zeichensatz der für Dateien benutzt wird, die ihren Zeichensatz nicht intern definieren, z.B. Textdateien.<br>Standardwert ist leer und der Wert der NLS Umgebung wird benutzt. Follow symbolic links Folge symbolischen Links Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Folge symbolischen Links währen der Indizierung. Standard ist nein, um doppelte Indizierung zu vermeiden Index all file names Indiziere alle Dateinamen Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Indiziere alle Namen der Dateien, deren Inhalt nicht bestimmt oder bearbeitet werden kann (keiner oder nicht unterstützter mime Typ). Standard: ja Beagle web history RTIToolW Real time indexing automatic start <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Also start indexing daemon right now. Replacing: Replacing file Can't create: Warning Warnung Could not execute recollindex Deleting: Deleting file Removing autostart Autostart file deleted. Kill current process too ? RclMain About Recoll über Recoll Executing: [ Ausführen: [ Cannot retrieve document info from database Keine Informationen zum Dokument in der Datenbank Warning Warnung Can't create preview window Fehler beim Erzeugen des Vorschaufensters Query results Ergebnisse Document history Dokumenthistorie History data Historische Daten Indexing in progress: Indizierung in Arbeit: Files Dateien Purge säubern Stemdb Wortstämme Closing Schließen Unknown Unbekannt This search is not active any more Diese Suche ist nicht mehr aktiv Can't start query: Kann die Suche nicht starten: Bad viewer command line for %1: [%2] Please check the mimeconf file Fehlerhaftes Betrachterkommando für %1: [%2] Überprüfen Sie die Datei mimeconf Cannot extract document or create temporary file Fehler beim Extrahieren des Dokuments oder beim Erzeugen der temporären datei (no stemming) (keine Wortstammerweiterung) (all languages) (alle Sprachen) error retrieving stemming languages Fehler beim Holen der Wortstammsprachen Update &Index Stop &Indexing All media Medien message other andere presentation spreadsheet text sorted filtered External applications/commands needed and not found for indexing your file types: No helpers found missing Missing helper programs Document category filter No external viewer configured for mime type [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Can't access file: Can't uncompress file: Save file Result count (est.) Query details Suchdetails Could not open external index. Db not open. Check external indexes list. No results found None Updating Done Monitor Indexing failed The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Erasing index Reset the index and start from scratch ? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Error Index not open Index query error Content has been indexed for these mime types: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Can't update index: indexer running Indexed MIME Types RclMainBase Previous page vorige Seite Next page nächste Seite &File &Datei E&xit &Beenden &Tools &Werkzeuge &Help &Hilfe &Preferences &Voreinstellungen Search tools Suchwerkzeuge Result list Ergebnisliste &About Recoll &über Recoll Document &History &Dokumentenhistorie Document History Dokumentenhistorie &Advanced Search &Erweiterte Suche Advanced/complex Search Erweiterte/komplexe Suche &Sort parameters &Sortierparameter Sort parameters Sortierparameter Next page of results nächste Ergebnisseite Previous page of results vorige Ergebnisseite &Query configuration &Suchkonfiguration &User manual &Benutzerhandbuch Recoll Recoll Ctrl+Q Ctrl+Q Update &index &Indizieren Term &explorer &Ausdruck Explorer Term explorer tool Ausdruck Explorer Werkzeug External index dialog Dialog für externe Indizierung &Erase document history &Lösche Dokumenthistorie First page Erste Seite Go to first page of results Gehe zu der ersten Seite der Ergebnisse &Indexing configuration &Indizierungskonfiguration All &Show missing helpers PgDown PgUp &Full Screen F11 Full Screen &Erase search history sortByDateAsc Sort by dates from oldest to newest sortByDateDesc Sort by dates from newest to oldest Show Query Details Show results as table &Rebuild index &Show indexed types Shift+PgUp &Indexing schedule E&xternal index dialog RecollModel File name Dateiname Mime type Mime Type Date Datum Abstract Author Document size Document date File size File date Keywords Original character set Relevancy rating Title URL Mtime Date and time Ipath MIME type ResList Result list Ergebnisse Unavailable document Dokument nicht verfügbar Previous Voriges Next Nächstes <p><b>No results found</b><br> <p><b>keine Ergebnisse</b><br> &Preview &Vorschau Copy &URL &Url kopieren Find &similar documents &Gleiche Dokumente finden Query details Suchdetails (show query) (Suche zeigen) Copy &File Name &Dateinamen kopieren Document history Dokumenthistorie Preview Open <p><i>Alternate spellings (accents suppressed): </i> &Write to File Preview P&arent document/folder &Open Parent document/folder &Open Documents out of at least for ResTable &Reset sort &Delete column Save table to CSV file Can't open/create file: &Preview &Vorschau &Open Copy &File Name &Dateinamen kopieren Copy &URL &Url kopieren &Write to File Find &similar documents &Gleiche Dokumente finden Preview P&arent document/folder &Open Parent document/folder &Save as CSV Add "%1" column ResTableDetailArea &Preview &Vorschau &Open Copy &File Name &Dateinamen kopieren Copy &URL &Url kopieren &Write to File Find &similar documents &Gleiche Dokumente finden Preview P&arent document/folder &Open Parent document/folder SSearch Any term Irgendein Ausdruck All terms Alle Ausdrücke File name Dateiname Completions Erweiterungen Select an item: Wählen Sie ein Element: Too many completions Zu viele Vervollständigungen: Query language Suchsprache Bad query string Fehlerhafter Suchstring Out of memory Kein freier Speicher mehr verfügbar Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Enter file name wildcard expression. Enter search terms here. Type ESC SPC for completions of current term. Suchausdruck hier eingeben. Drücken Sie ESC SPC für Vervollständigungen des aktuellen Ausdrucks SSearchBase SSearchBase SSearchBase Clear Löschen Ctrl+S Ctrl+S Erase search entry Sucheintrag löschen Search Suchen Start query Suche starten Enter search terms here. Type ESC SPC for completions of current term. Suchausdruck hier eingeben. Drücken Sie ESC SPC für Vervollständigungen des aktuellen Ausdrucks Choose search type. SearchClauseW SearchClauseW SearchClauseW Any of these Irgendeins dieser All of these Alle diese None of these Keins dieser This phrase diese Wörter Terms in proximity ähnliche Ausdrücke File name matching passende Dateinamen Select the type of query that will be performed with the words Wählen Sie die Suchart aus, mit der nach den Wörtern gesucht wird Number of additional words that may be interspersed with the chosen ones Anzahl der Wörter, die sich zwischen den angegebenen befinden dürfen No field Any All None Phrase Proximity File name Dateiname SortForm Date Datum Mime type Mime Type SortFormBase Sort Criteria Sortierkriterium Sort the Zeige die most relevant results by: relevantesten Ergebnisse sortiert nach: Descending Absteigend Close Schließen Apply Übernehmen SpellBase Term Explorer Ausdruck Explorer &Expand &Vervollständigen Alt+E Alt+V &Close &Schließen Alt+C Alt+S Term Ausdruck No db info. SpellW Wildcards Wildcards Regexp Regulärer Ausdruck Spelling/Phonetic Ortographie/Phonetik Aspell init failed. Aspell not installed? Fehler bei der Initialisierung von Aspell. Ist Aspell nicht installiert? Aspell expansion error. Aspell Vervollständigungsfehler. Stem expansion Wortstamm Erweiterung error retrieving stemming languages Fehler beim Holen der Wortstammsprachen No expansion found Keine Erweiterung gefunden Term Ausdruck Doc. / Tot. Index: %1 documents, average length %2 terms UIPrefsDialog The selected directory does not appear to be a Xapian index Das ausgewählte Verzeichnis scheint kein Xapian Index zu sein This is the main/local index! Das ist der Hauptindex! The selected directory is already in the index list Das ausgewählte Verzeichnis ist bereits Teil der Indexliste Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Wählen Sie das Xapian Indexverzeichnis (Z.B.: /home/benutzer/.recoll/xapiandb) error retrieving stemming languages Fehler beim Holen der Wortstammsprachen Choose UIPrefsDialogBase User interface Benutzeroberfläche Number of entries in a result page Anzahl der Ergebnisse pro Seite Result list font Schriftart für Ergebnisliste Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Öffnet einen Dialog zur Auswahl der Schriftart für die Ergebnisliste Reset Reset Resets the result list font to the system default Setzt die Schriftart für die Ergebnisliste zurück auf den Standardwert Auto-start simple search on whitespace entry. Automatisch eine einfache Suche starten, wenn ein Worttrenner im Sucheingabefeld eingegeben wird. Start with advanced search dialog open. Nach dem Start automatisch den Dialog für die erweiterte Suche öffnen. Start with sort dialog open. Nach dem Start automatisch den Sortierdialog öffnen. Search parameters Suchparameter Stemming language Stemming Sprache Dynamically build abstracts Zusammenfassungen dynamisch erzeugen Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Festlegung ob Zusammenfassungen für Ergebnisse im Kontext der Suchparameter erzeugt werden (kann bei großen Dokumenten langsam sein). Replace abstracts from documents Ersetzen der Zusammenfassungen in den Dokumenten Do we synthetize an abstract even if the document seemed to have one? Festlegung ob eine Zusammenfassung auch dann erzeugt wird, wenn das Dokument schon eine Zusammenfassung enthält Synthetic abstract size (characters) Länge der erzeugten Zusammenfassung (Zeichen) Synthetic abstract context words Anzahl der Kontextworte in der Zusammenfassung External Indexes externe Indizes Add index Index hinzufügen Select the xapiandb directory for the index you want to add, then click Add Index Wählen Sie das xapiandb-Verzeichnis des zuzufügenden Indizes und klicken Sie auf Index hinzufügen Browse Auswahl &OK &OK Apply changes Änderungen übernehmen &Cancel &Abbrechen Discard changes Änderungen verwerfen Result paragraph<br>format string Formatstring für Ergebnisse Automatically add phrase to simple searches Automatisches Zufügen von Sätzen zu einfachen Suchen A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Eine Suche nach [Jürgen Klinsmann] wird geändert nach [Jürgen OR Klinsmann OR (Jürgen PHRASE 2 Klinsmann)]. Dadurch sollten Ergebnisse, die exakte Übereinstimmungen der Suchworte enthalten, stärker gewichtet werden. User preferences Benutzereinstellungen Use desktop preferences to choose document editor. Die Einstellung des Dokumenteneditors erfolgt in den Desktopvoreinstellungen. External indexes Externe Indizes Toggle selected Auswahl umkehren Activate All Alle Auswählen Deactivate All Alle Abwählen Remove selected Ausgewählte entfernen Remove from list. This has no effect on the disk index. Aus der Liste entfernen. Dies hat keinen Einfluss auf den gespeicherten Index. Remember sort activation state. Speichern, ob Sortieren aktiviert ist. ViewAction Changing actions with different current values Mime type Mime Type Command MIME type ViewActionBase File type Dateityp Action Aktion Select one or several file types, then click Change Action to modify the program used to open them Wählen Sie einen oder mehrere Dateitypen und klicken Sie auf "Ändere Aktion" um das verknüpfte Programm zum Öffnen anzupassen. Change Action Ändere Aktion Close Schließen Native Viewers Anzeigeprogramme Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. confgui::ConfBeaglePanelW Steal Beagle indexing queue Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Entries will be recycled once the size is reached Web page store directory name The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Max. size for the web store (MB) confgui::ConfIndexW Can't write configuration file Kann Konfigurationsdatei nicht schreiben confgui::ConfParamFNW Choose confgui::ConfParamSLW + + - - confgui::ConfSubPanelW Global Global Max. compressed file size (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Max. text file size (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Text file page size (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Max. filter exec. time (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. confgui::ConfTopPanelW Top directories Start-Verzeichnisse The list of directories where recursive indexing starts. Default: your home. Die Liste der Verzeichnisse in der die rekursive Indizierung startet. Standard: Home-Verzeichnis. Skipped paths Ausgelassene Pfade These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Die Namen der Verzeichnisse, die nicht indiziert werden.<br>Kann Wildcards enthalten. Muss den Pfaden entsprechen, die der Indexer sieht (z.B. wenn '/home/me' in den topdirs steht und '/home' eigentlich ein link zu '/usr/home' ist, dann wäre ein korrekter skippedPath Eintrag '/home/me/tmp*' und nicht '/usr/home/me/tmp*') Stemming languages Wortstammerweiterungssprachen The languages for which stemming expansion<br>dictionaries will be built. Die Sprachen für die Worstammerweiterungs-<br>verzeichnisse erstellt werden. Log file name Log Datei The file where the messages will be written.<br>Use 'stderr' for terminal output Die Datei in die Ausgaben geschrieben werden.<br>Für Ausgaben auf demTerminal 'stderr' benutzen Log verbosity level This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Dieser Wert stellt den Umfang der Ausgaben ein.<br>Nur Fehler bis zu einer Menge von Debug Ausgaben. Index flush megabytes interval This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Max disk occupation (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). No aspell usage Aspell language The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Database directory name The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Use system's 'file' command 'file' Komando benutzen Use the system's 'file' command if internal<br>mime type identification fails. Benutze das 'file' Kommando wenn die interne<br>mime Typ Erkennung fehlschlägt. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. uiPrefsDialogBase User preferences Benutzereinstellungen User interface Benutzeroberfläche Number of entries in a result page Anzahl der Ergebnisse pro Seite If checked, results with the same content under different names will only be shown once. Hide duplicate results. Highlight color for query terms Result list font Schriftart für Ergebnisliste Opens a dialog to select the result list font Öffnet einen Dialog zur Auswahl der Schriftart für die Ergebnisliste Helvetica-10 Helvetica-10 Resets the result list font to the system default Setzt die Schriftart für die Ergebnisliste zurück auf den Standardwert Reset Reset Result paragraph<br>format string Formatstring für Ergebnisse Texts over this size will not be highlighted in preview (too slow). Maximum text size highlighted for preview (megabytes) Use desktop preferences to choose document editor. Die Einstellung des Dokumenteneditors erfolgt in den Desktopvoreinstellungen. Choose editor applications Display category filter as toolbar instead of button panel (needs restart). Auto-start simple search on whitespace entry. Automatisch eine einfache Suche starten, wenn ein Worttrenner im Sucheingabefeld eingegeben wird. Start with advanced search dialog open. Nach dem Start automatisch den Dialog für die erweiterte Suche öffnen. Start with sort dialog open. Nach dem Start automatisch den Sortierdialog öffnen. Remember sort activation state. Speichern, ob Sortieren aktiviert ist. Prefer Html to plain text for preview. Search parameters Suchparameter Stemming language Stemming Sprache A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Eine Suche nach [Jürgen Klinsmann] wird geändert nach [Jürgen OR Klinsmann OR (Jürgen PHRASE 2 Klinsmann)]. Dadurch sollten Ergebnisse, die exakte Übereinstimmungen der Suchworte enthalten, stärker gewichtet werden. Automatically add phrase to simple searches Automatisches Zufügen von Sätzen zu einfachen Suchen Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Festlegung ob Zusammenfassungen für Ergebnisse im Kontext der Suchparameter erzeugt werden (kann bei großen Dokumenten langsam sein). Dynamically build abstracts Zusammenfassungen dynamisch erzeugen Do we synthetize an abstract even if the document seemed to have one? Festlegung ob eine Zusammenfassung auch dann erzeugt wird, wenn das Dokument schon eine Zusammenfassung enthält Replace abstracts from documents Ersetzen der Zusammenfassungen in den Dokumenten Synthetic abstract size (characters) Länge der erzeugten Zusammenfassung (Zeichen) Synthetic abstract context words Anzahl der Kontextworte in der Zusammenfassung The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Query language magic file name suffixes. Enable External Indexes externe Indizes Toggle selected Auswahl umkehren Activate All Alle Auswählen Deactivate All Alle Abwählen Remove from list. This has no effect on the disk index. Aus der Liste entfernen. Dies hat keinen Einfluss auf den gespeicherten Index. Remove selected Ausgewählte entfernen Click to add another index directory to the list Add index Index hinzufügen Apply changes Änderungen übernehmen &OK &OK Discard changes Änderungen verwerfen &Cancel &Abbrechen Abstract snippet separator Style sheet Opens a dialog to select the style sheet file Choose Resets the style sheet to default Lines in PRE text are not folded. Using BR loses some indentation. Use <PRE> tags instead of <BR>to display plain text as html in preview. Result List Edit result paragraph format string Edit result page html header insert Date format (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Autophrase term frequency threshold percentage recoll-1.17.3/qtgui/i18n/recoll_es.ts000644 001750 000000 00000275156 11757435273 017751 0ustar00dockeswheel000000 000000 AdvSearch All clauses Todas las cláusulas Any clause Cualquier cláusula texts textos spreadsheets hojas de cálculo presentations presentaciones media medios messages mensajes other otros Bad multiplier suffix in size filter Sufijo multiplicador incorrecto en filtro de tamaño AdvSearchBase Advanced search Búsqueda avanzada Search for <br>documents<br>satisfying: Buscar documentos<br>que satisfagan: Delete clause Borrar cláusula Add clause Añadir cláusula Restrict file types Restringir tipos de fichero Check this to enable filtering on file types Marque esto para habilitar filtros en tipos de archivos By categories Por categorías Check this to use file categories instead of raw mime types Marque esto para usar categorías en lugar de tipos MIME Save as default Guardar como predeterminado Searched file types Tipos de fichero buscados All ----> Todos ----> Sel -----> Sel -----> <----- Sel <----- Sel <----- All <----- Todos Ignored file types Tipos de fichero ignorados Enter top directory for search Ingrese directorio inicial para la búsqueda Browse Buscar Restrict results to files in subtree: Restringir resultados a ficheros en subdirectorio: Start Search Iniciar búsqueda Close Cerrar All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Todos los campos no vacíos a la derecha serán combinados con conjunciones AND (opción "Todas las cláusulas") o OR (opción "Cualquier cláusula").<br>Los campos "Cualquiera", "Todas" y "Ninguna" pueden aceptar una mezcla de palabras simples y frases dentro de comillas dobles.<br>Campos sin datos son ignorados. Invert Invertir Minimum size. You can use k/K,m/M,g/G as multipliers Tamaño mínimo. Puede utilizar k/K, m/M o g/G como multiplicadores Min. Size Tamaño Mínimo Maximum size. You can use k/K,m/M,g/G as multipliers Tamaño máximo. Puede utilizar k/K, m/M o g/G como multiplicadores Max. Size Tamaño máximo Filter Filtro Check this to enable filtering on dates Marque esto para habilitar filtros en fechas Filter dates Filtrar fechas From Desde To Hasta Find Buscar Check this to enable filtering on sizes Marque esto para habilitar filtros en tamaños Filter sizes Filtro de tamaños CronToolW Cron Dialog Ventana de Cron <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> horario de indexado por lotes (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cada campo puede contener un comodín (*), un valor numérico único, listas separadas por comas (1,3,5) y rangos (1-7). Más generalmente, los campos serán usados <span style=" font-style:italic;">tal como son</span> dentro del fichero crontab, y toda la sintaxis crontab puede ser usada, ver crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Por ejemplo, ingresar <span style=" font-family:'Courier New,courier';">*</span> en <span style=" font-style:italic;">Días, </span><span style=" font-family:'Courier New,courier';">12,19</span> en <span style=" font-style:italic;">Horas</span> y <span style=" font-family:'Courier New,courier';">15</span> en <span style=" font-style:italic;">Minutos</span> iniciaría recollindex cada día a las 12:15 AM y 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un horario con activaciones frecuentes es probablemente menos eficiente que el indexado en tiempo real.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Días de la semana (* o 0-7, 0 o 7 es Domingo) Hours (* or 0-23) Horas (* o 0-23) Minutes (0-59) Minutos (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presione <span style=" font-style:italic;">Deshabilitar</span> para detener el indexado por lotes automático, <span style=" font-style:italic;">Habilitar</span> para activarlo, <span style=" font-style:italic;">Cancelar</span> para no cambiar nada.</p></body></html> Enable Habilitar Disable Deshabilitar It seems that manually edited entries exist for recollindex, cannot edit crontab Parece ser que existen entradas para recollindex editadas manualmente, no se puede editar crontab Error installing cron entry. Bad syntax in fields ? Error al instalar entrada de cron. Sintaxis incorrecta en los campos? EditDialog Dialog Ventana de diálogo FirstIdxDialog First indexing setup Primera configuración de indexado <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Parece ser que el índice para esta configuración no existe.</span><br /><br />Si solamente desea indexar su directorio personal con un conjunto de valores iniciales razonables, presione el botón <span style=" font-style:italic;">Iniciar indexación ahora</span>. Es posible ajustar los detalles más tarde.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si necesita más control, use los enlaces siguientes para ajustar la configuración de indexación y el horario.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Estas herramientas pueden ser accedidas luego desde el menú <span style=" font-style:italic;">Preferencias</span>.</p></body></html> Indexing configuration Configuración de indexación This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Esto le permite ajustar los directorios que quiere indexar y otros parámetros, como rutas de ficheros o nombres excluidos, conjuntos de caracteres estándar, etc. Indexing schedule Horario de indexación This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Esto le permite escoger entre indexación en tiempo real y por lotes, y configurar un horario automático para indexar por lotes (utilizando cron). Start indexing now Iniciar indexación ahora IdxSchedW Index scheduling setup Configuración de horario de indexación <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La indexación de <span style=" font-weight:600;">Recoll</span> puede ejecutarse permanentemente, indexando ficheros cuando cambian, o puede ejecutarse en intervalos discretos. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Leer el manual puede ayudarle a decidir entre estos dos métodos (presione F1).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esta herramienta puede ayudarle a configurar un horario para automatizar la ejecución de indexación por lotes, o iniciar la indexación en tiempo real cuando inicia la sesión (o ambos, lo cual rara vez tiene sentido).</p></body></html> Cron scheduling Horario de Cron The tool will let you decide at what time indexing should run and will install a crontab entry. Esta herramienta le permite decidir a qué hora la indexación se ejecutará e instalará una entrada en el crontab. Real time indexing start up Inicio de la indexación en tiempo real Decide if real time indexing will be started when you log in (only for the default index). Decida si la indexación en tiempo real será ejecutada cuando inicie la sesión (solo para el índice estándar). ListDialog Dialog Ventana de diálogo GroupBox Cuadro de grupo Main No db directory in configuration Directorio de base de datos no está configurado Could not open database in No se puede abrir base de datos en . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. Presione Cancelar si desea editar la configuración antes de indexar, o Ok para proceder. "history" file is damaged or un(read)writeable, please check or remove it: El fichero de historial esta dañado o no se puede leer, por favor revíselo o bórrelo: Preview Close Tab Cerrar Pestaña Cannot create temporary directory No se puede crear directorio temporal Cancel Cancelar Missing helper program: Programa ayudante faltante: Can't turn doc into internal representation for No se puede convertir documento a representación interna para Creating preview text Creando texto de vista previa Loading preview text into editor Cargando texto de vista previa en el editor &Search for: &Buscar por: &Next &Siguiente &Previous &Previo Clear Limpiar Match &Case &Coincidir mayúsculas y minúsculas Cannot create temporary directory: No se puede crear directorio temporal: Error while loading file Error al cargar fichero PreviewTextEdit Show fields Mostrar campos Show main text Mostrar texto principal Print Imprimir Print Current Preview Imprimir vista previa actual Show image Mostrar imagen Select All Seleccionar todo Copy Copiar Save document to file Guardar documento a fichero Fold lines Doblar líneas Preserve indentation Preservar indentación QObject Global parameters Parámetros globales Local parameters Parámetros locales <b>Customised subtrees <b>Subdirectorios personalizados The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. La lista de subdirectorios en la jerarquía indexada<br>dónde algunos parámetros necesitan ser definidos. Valor por defecto: vacío. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Los parámetros siguientes se aplican a nivel superior, si una línea vacía<br>o ninguna es seleccionada en el listado arriba, o para cada directorio seleccionado.<br>Puede añadir o remover directorios presionando los botones +/-. Skipped names Nombres omitidos These are patterns for file or directory names which should not be indexed. Estos son patrones de nombres de ficheros o directorios que no deben ser indexados. Default character set Conjunto de caracteres por defecto This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Este es el conjunto de caracteres usado para leer ficheros que no identifican internamente, por ejemplo, ficheros de texto puro.<br>El valor por defecto está vacío, y el valor del ambiente NLS es usado. Follow symbolic links Seguir enlaces simbólicos Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Seguir enlaces simbólicos al indexar. El valor por defecto es no, para evitar indexar duplicados Index all file names Indexar todos los nombres de ficheros Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Indexar los nombres de los ficheros para los cuales los contenidos no pueden ser<br>identificados o procesados (tipo MIME inválido o inexistente). El valor por defecto es verdadero Beagle web history Historial web Beagle RTIToolW Real time indexing automatic start Inicio automático de la indexación en tiempo real <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La indexación de <span style=" font-weight:600;">Recoll</span> puede configurarse para ejecutar como un demonio, actualizando el índice cuando los ficheros cambian, en tiempo real. Obtiene un índice actualizado siempre, pero recursos del sistema son utilizados permanentemente.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Iniciar el demonio de indexación con mi sesión de escritorio. Also start indexing daemon right now. También iniciar demonio de indexación ahora mismo. Replacing: Reemplazando: Replacing file Reemplazando fichero Can't create: No se puede crear: Warning Advertencia Could not execute recollindex No se puede ejecutar recollindex Deleting: Borrando: Deleting file Borrando fichero Removing autostart Eliminando autoinicio Autostart file deleted. Kill current process too ? Fichero de autoinicio borrado. Detener el proceso actual también? RclMain (no stemming) (sin raíces) (all languages) (todos los lenguajes) error retrieving stemming languages error al recuperar lenguajes para raíces Indexing in progress: Indexación en progreso: Files Ficheros Purge Stemdb Raízdb Closing Cerrando Unknown Desconocido Can't start query: No se puede iniciar la consulta: Query results Resultados de búsqueda Cannot retrieve document info from database No se puede recuperar información del documento de la base de datos Warning Advertencia Can't create preview window No se puede crear ventana de vista previa This search is not active any more Esta búsqueda no está activa Bad viewer command line for %1: [%2] Please check the mimeconf file Línea de comando incorrecta de visualizador para %1: [%2] Por favor revise el fichero mimeconf Cannot extract document or create temporary file No se puede extraer el documento o crear fichero temporal Executing: [ Ejecutando: [ About Recoll Acerca de Recoll History data Datos de historial Document history Historial de documentos Update &Index Actualizar &Ãndice Indexing interrupted Indexación interrumpida Stop &Indexing Detener &Indexación All Todo media medios message mensaje other otro presentation presentación spreadsheet hoja de cálculo text texto sorted ordenado filtered filtrado External applications/commands needed and not found for indexing your file types: Aplicaciones/comandos externos necesarios y no encontrados para indexar sus tipos de fichero: No helpers found missing Missing helper programs Programas ayudantes faltantes Document category filter Filtro de categorías de documentos No external viewer configured for mime type [ No hay visualizador configurado para tipo MIME [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Can't access file: No se puede acceder al fichero: Can't uncompress file: No se puede descomprimir el fichero: Save file Guardar fichero Result count (est.) Conteo de resultados (est.) Query details Detalles de búsqueda Could not open external index. Db not open. Check external indexes list. No se puede abrir índice externo. Base de datos no abierta. Revise listado de índices externos. No results found No hay resultados None Ninguno Updating Actualizando Done Hecho Monitor Monitor Indexing failed Indexación falló The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone El proceso de indexación actual no se inicio desde esta interfaz. Presione Ok para detenerlo, o Cancelar para dejarlo ejecutar Erasing index Borrando índice Reset the index and start from scratch ? Restaurar el índice e iniciar desde cero? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Consulta en progreso.<br>Debido a limitaciones en la librería de indexación,<br>cancelar terminará el programa Error Error Index not open Ãndice no está abierto Index query error Error de consulta del índice Indexed Mime Types Tipos MIME indexados Content has been indexed for these mime types: Los contenidos han sido indexados para estos tipos MIME: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Ãndice no actualizado para este fichero. No mostrado para evitar utilizar la entrada errónea. Presione Ok para actualizar el índice para este fichero, luego ejecute la consulta de nuevo cuando la indexación termine. En caso contrario, presione Cancelar. Can't update index: indexer running No se puede actualizar el índice: indexador en ejecución Indexed MIME Types Tipos MIME indexados RclMainBase Recoll Recoll Search tools Herramientas de búsqueda Result list Lista de resultados &File &Fichero &Tools &Herramientas &Preferences &Preferencias &Help &Ayuda E&xit &Salir Ctrl+Q Ctrl+Q Update &index Actualizar &índice &Erase document history Borrar historial de &documentos &About Recoll &Acerca de Recoll &User manual Manual de &Usuario Document &History Historial de &Documentos Document History Historial de Documentos &Advanced Search Búsqueda &Avanzada Advanced/complex Search Búsqueda avanzada/compleja &Sort parameters Parámetros de &ordenamiento Sort parameters Parámetros de ordenamiento Term &explorer &Explorador de términos Term explorer tool Herramienta de exploración de términos Next page Siguiente página Next page of results Página de resultados siguiente First page Primera página Go to first page of results Ir a la primera página de resultados Previous page Página anterior Previous page of results Página de resultados anterior &Query configuration Configuración de &consulta External index dialog Configuración de índices externos &Indexing configuration Configuración de &indexación All Todo &Show missing helpers &Mostrar ayudantes faltantes PgDown AvPág PgUp RePág &Full Screen Pantalla &Completa F11 F11 Shift+Home Mayúsculas+Inicio Full Screen Pantalla Completa &Erase search history Borrar historial de &búsqueda sortByDateAsc ordenarPorFechaAsc Sort by dates from oldest to newest Ordenar por fechas de la más antigua a la más reciente sortByDateDesc ordenarPorFechaDesc Sort by dates from newest to oldest Ordenar por fechas de la más reciente a la más antigua Show Query Details Mostrar resultados de la consulta Show results as table Mostrar resultados tabulados &Rebuild index &Reconstruir índice &Show indexed types &Mostrar tipos indexados Shift+PgUp Mayúsculas+RePág &Indexing schedule &Horario de indexación E&xternal index dialog &Configuración de índices externos RecollModel Abstract Resumen Author Autor Document size Tamaño del documento Document date Fecha del documento File size Tamaño del fichero File name Nombre de fichero File date Fecha del fichero Ipath Ipath Keywords Palabras clave Mime type Tipo MIME Original character set Conjunto de caracteres original Relevancy rating Calificación de relevancia Title Título URL URL Mtime Fecha Mod Date Fecha Date and time Fecha y hora Ipath Ipath MIME type Tipo MIME ResList Result list Lista de resultados (show query) (mostrar consulta) &Preview &Vista Previa Copy &File Name Copiar nombre de &fichero Copy &URL Copiar &URL Find &similar documents Buscar documentos &similares Document history Historial de documentos <p><b>No results found</b><br> <p><b>No hay resultados</b></br> Previous Anterior Next Siguiente Unavailable document Documento no disponible Preview Vista previa Open Abrir <p><i>Alternate spellings (accents suppressed): </i> <p><i>Ortografía alterna (acentos suprimidos): </i> &Write to File &Escribir a fichero Preview P&arent document/folder &Vista previa de documento/directorio ascendente &Open Parent document/folder &Abrir documento/directorio ascendente &Open &Abrir Documents Documentos out of at least de por lo menos for para ResTable &Reset sort &Restaurar ordenamiento &Delete column &Borrar columna Add " Añadir " " column " columna Save table to CSV file Guardar tabla a fichero CSV Can't open/create file: No se puede abrir/crear fichero: &Preview &Vista previa &Open &Abrir Copy &File Name Copiar nombre de &fichero Copy &URL Copiar &URL &Write to File &Escribir a fichero Find &similar documents Buscar documentos &similares Preview P&arent document/folder &Vista previa de documento/directorio ascendente &Open Parent document/folder &Abrir documento/directorio ascendente &Save as CSV &Guardar como CSV Add "%1" column Agregar columna "%1" ResTableDetailArea &Preview &Vista previa &Open &Abrir Copy &File Name Copiar nombre de &fichero Copy &URL Copiar &URL &Write to File &Escribir a fichero Find &similar documents Buscar documentos &similares Preview P&arent document/folder &Vista previa de documento/directorio ascendente &Open Parent document/folder &Abrir documento/directorio ascendente SSearch Any term Cualquier término All terms Todos los términos File name Nombre de fichero Query language Lenguaje de consulta Bad query string Consulta inválida Out of memory No hay memoria Too many completions Demasiadas finalizaciones Completions Finalizaciones Select an item: Seleccione un ítem: Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Ingrese expresión de lenguaje de consulta. Hoja de trucos:<br> <i>term1 term2</i> : 'term1' y 'term2' en cualquier campo.<br> <i>campo:term1</i> : 'term1' en campo 'campo'. <br> Nombres de campos estándar/sinónimos:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-campos: dir, mime/format, type/rclcat, date.<br> Dos ejemplos de intervalo de fechas: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> Los paréntesis no están permitidos en realidad.<br> <i>"term1 term2"</i> : frase (debe aparecer exactamente). Modificadores posibles:<br> <i>"term1 term2"p</i> : busca de proximidad sin orden con distancia estándar.<br> Use el enlace <b>Mostrar Consulta</b> en caso de duda sobre el resultado y vea el manual (&lt;F1>) para más detalles. Enter file name wildcard expression. Ingrese expresión de comodín para nombre de fichero. Enter search terms here. Type ESC SPC for completions of current term. Ingrese términos de búsqueda aquí. Presione ESC ESPACIO para completar el término actual. SSearchBase SSearchBase SSearchBase Clear Limpiar Ctrl+S Ctrl+S Erase search entry Borrar entrada de búsqueda Search Búsqueda Start query Iniciar consulta Enter search terms here. Type ESC SPC for completions of current term. Ingrese términos de búsqueda aquí. Presione ESC ESP para completar el término actual. Choose search type. Elija tipo de búsqueda. SearchClauseW Any of these Cualquiera All of these Todas None of these Ninguna This phrase Frase Terms in proximity Términos en proximidad File name matching Nombre de fichero Select the type of query that will be performed with the words Elija el tipo de consulta que será realizada con las palabras Number of additional words that may be interspersed with the chosen ones Número de palabras adicionales que pueden ser intercaladas con las escogidas No field Ningún campo Any Cualquiera All Todo None Ninguno Phrase Frase Proximity Proximidad File name Nombre de fichero SpellBase Term Explorer Explorador de términos &Expand &Expandir Alt+E Alt+E &Close &Cerrar Alt+C Alt+C No db info. No hay información de bd. SpellW Wildcards Comodines Regexp Expresión regular Stem expansion Expansión de raíces Spelling/Phonetic Ortografía/fonética error retrieving stemming languages error al recuperar lenguajes para raíces Aspell init failed. Aspell not installed? Inicialización de Aspell falló. Está instalado Aspell? Aspell expansion error. Error de expansión de Aspell. No expansion found Expansión no encontrada Term Término Doc. / Tot. Doc./Tot. Index: %1 documents, average length %2 terms Ãndice: %1 documentos, largo promedio %2 términos UIPrefsDialog error retrieving stemming languages error al recuperar lenguajes para raíces The selected directory does not appear to be a Xapian index El directorio seleccionado no parece ser un índice Xapian This is the main/local index! Este es el índice local o principal! The selected directory is already in the index list El directorio seleccionado ya está en la lista de índices Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Seleccione el directorio para el índice Xapian (ej: /home/buddy/.recoll/xapiandb) Choose Elegir ViewAction Changing actions with different current values Cambiando acciones con valores actuales diferentes Mime type Tipo MIME Command Comando MIME type Tipo MIME ViewActionBase Native Viewers Visualizadores Nativos Select one or several file types, then click Change Action to modify the program used to open them Seleccione uno o varios tipos de fichero, luego presione Cambiar Acción para modificar el programa usado para abrirlos Change Action Cambiar Acción Close Cerrar Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. Seleccione uno o varios tipos MIME y presione "Cambiar Acción"<br>Puede también cerrar esta ventana y marcar "Usar preferencias del escritorio"<br>en el panel principal para ignorar esta lista y usar los valores estándar de su escritorio. confgui::ConfBeaglePanelW Steal Beagle indexing queue Robar cola de indexado de Beagle Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Beagle NO DEBE estar ejecutándose. Habilita procesar la cola para indexar el historial web de Firefox de Beagle.<br>(debe también instalar el plugin Beagle para Firefox) Entries will be recycled once the size is reached Las entradas serán recicladas una vez que el tamaño es alcanzado Web page store directory name Nombre del directorio del almacén para páginas web The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. El nombre del directorio dónde almacenar las copias de páginas web visitadas.<br>Una ruta de directorio no absoluta es utilizada, relativa al directorio de configuración. Max. size for the web store (MB) Tamaño máximo para el almacén web (MB) confgui::ConfIndexW Can't write configuration file No se puede escribir fichero de configuración confgui::ConfParamFNW Choose Elegir confgui::ConfParamSLW + + - - confgui::ConfSubPanelW Global Global Max. compressed file size (KB) Tamaño máximo de fichero comprimido (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Este valor establece un umbral mas allá del cual los archivos<br>comprimidos no serán procesados. Escriba 1 para no tener límite,<br>o el número 0 para nunca hacer descompresión. Max. text file size (MB) Tamaño máximo para fichero de texto (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Este valor establece un umbral más allá del cual los ficheros de texto no serán procesados.<br>Escriba 1 para no tener límites. Este valor es utilizado para excluir ficheros de registro gigantescos del índice. Text file page size (KB) Tamaño de página para fichero de texto (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Si se utiliza este valor (diferente de -1), los ficheros de texto serán separados en partes de este tamaño para ser indexados. Esto ayuda con las búsquedas de ficheros de texto muy grandes (ej: ficheros de registro). Max. filter exec. time (S) Tiempo máximo de ejecución de filtros (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. Filtros externos que se ejecuten por más tiempo del establecido serán abortados.<br>Esto ocurre en los raros casos (ej: postscript) cuando un documento hace que un filtro entre en un ciclo.<br>Establezca un valor de -1 para no tener límite. confgui::ConfTopPanelW Top directories Directorios primarios The list of directories where recursive indexing starts. Default: your home. La lista de directorios donde el indexado recursivo comienza. Valor por defecto: su directorio personal. Skipped paths Directorios omitidos These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Estos son los nombres de directorios los cuales no se indexan.<br>Puede contener comodines. Debe corresponder a las rutas vistas por el indexador (ej: si los directorios primarios incluyen '/home/me' y '/home' es en realidad un enlace a '/usr/home', la entrada correcta para directorios omitidos sería '/home/me/tmp*', no '/usr/home/me/tmp*') Stemming languages Lenguajes para raíces The languages for which stemming expansion<br>dictionaries will be built. Los lenguajes para los cuales los diccionarios de expansión de raíces serán creados. Log file name Nombre de fichero de registro The file where the messages will be written.<br>Use 'stderr' for terminal output El fichero donde los mensajes serán escritos.<br>Use 'stderr' para salida a la terminal Log verbosity level Nivel de verbosidad del registro This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Este valor ajusta la cantidad de mensajes,<br>desde solamente errores hasta montones de información de depuración. Index flush megabytes interval Intervalo en megabytes de escritura del índice This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Este valor ajusta la cantidad de datos indexados entre escrituras al disco.<br> Esto ayuda a controlar el uso de memoria del indexador. Valor estándar 10MB Max disk occupation (%) Utilización máxima de disco (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Este es el porcentaje de utilización de disco donde el indexado fallará y se detendrá (para evitar llenarle el disco).<br>0 significa sin límites (valor por defecto). No aspell usage No utilizar aspell Aspell language Lenguaje Aspell The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. El lenguaje para el diccionario aspell. Esto debe ser algo como 'en' o 'fr'...<br>Si este valor no se especifica, el ambiente NLS será usado para averiguarlo, lo cual usualmente funciona. Para tener una idea de qué esta instalado en su sistema escriba 'aspell-config' y busque por ficheros .dat dentro del directorio 'data-dir'. Database directory name Nombre del directorio de base de datos The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Nombre del directorio donde almacenar el índice.<br>Un valor no absoluto para la ruta de directorio es usado, relativo al directorio de configuración. El valor estándar es 'xapiandb'. Use system's 'file' command Utilizar el comando 'file' del sistema Use the system's 'file' command if internal<br>mime type identification fails. Utilizar el comando 'file' del sistema si la identificación interna de tipos MIME falla. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Deshabilita el uso de aspell para generar aproximaciones ortográficas en la herramienta explorador de términos.<br>Útil si aspell no se encuentra o no funciona. uiPrefsDialogBase User preferences Preferencias de usuario User interface Interfaz de usuario Number of entries in a result page Número de elementos en la página de resultados If checked, results with the same content under different names will only be shown once. Si está marcado, los resultados con el mismo contenido bajo nombres diferentes serán mostrados solo una vez. Hide duplicate results. Esconder resultados duplicados. Highlight color for query terms Color de resaltado para términos de búsqueda Result list font Tipo de letra para lista de resultados Opens a dialog to select the result list font Abre una ventana para seleccionar el tipo de letra para la lista de resultados Helvetica-10 Helvetica-10 Resets the result list font to the system default Restaurar el tipo de letra de la lista de resultados al valor por defecto del sistema Reset Restaurar Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Define el formato para cada párrafo de resultados. Utilice formato qt-html y reemplazos estilo printf:<br>%A Resumen<br> %D Fecha<br> %I Nombre del ícono<br> %K Palabras clave (si existen)<br> %L Enlaces de vista previa y edición<br> %M Tipo MIME<br> %Número de resultado<br> %R Porcentaje de relevancia<br> %S Información de tamaño<br> %T Título<br> %U Url<br> Result paragraph<br>format string Texto de formato para<br>párrafo de resultados Texts over this size will not be highlighted in preview (too slow). Textos más allá de este tamaño no serán resaltados (muy lento). Maximum text size highlighted for preview (megabytes) Tamaño máximo de texto resaltado para vista previa (megabytes) Use desktop preferences to choose document editor. Usar preferencias del escritorio para seleccionar editor de documentos. Choose editor applications Escoger aplicaciones para edición Display category filter as toolbar instead of button panel (needs restart). Mostrar filtros de categorías como barra de herramientas en lugar de panel de botones (necesita reinicio). Auto-start simple search on whitespace entry. Auto iniciar búsqueda simple al entrar espacios en blanco. Start with advanced search dialog open. Iniciar con la ventana de búsqueda avanzada abierta. Remember sort activation state. Recordar estado de activación de ordenamiento. Prefer Html to plain text for preview. Preferir HTML a texto simple para vista previa. Search parameters Parámetros de búsqueda Stemming language Lenguaje de raíces A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Una búsqueda por [rolling stones] (2 términos) será cambiada por [rolling or stones or (rolling phrase 2 stones)]. Esto dará mayor precedencia a los resultados en los cuales los términos de búsqueda aparecen exactamente como fueron escritos. Automatically add phrase to simple searches Automáticamente añadir frases a búsquedas simples Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. ¿Intentar construir resúmenes para elementos en la lista de resultados utilizando el contexto de los términos de búsqueda? Puede ser lento para documentos grandes. Dynamically build abstracts Construir resúmenes dinámicamente Do we synthetize an abstract even if the document seemed to have one? ¿Sintetizar un resumen aunque el documento parece tener uno? Replace abstracts from documents Reemplazar resúmenes de los documentos Synthetic abstract size (characters) Tamaño del resumen sintetizado (caracteres) Synthetic abstract context words Palabras de contexto del resumen sintetizado The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Las palabras en la lista serán convertidas automáticamente a cláusulas ext:xxx en el ingreso de lenguaje de consulta. Query language magic file name suffixes. Sufijos para nombres mágicos de ficheros en el lenguaje de consulta. Enable Habilitar External Indexes Ãndices Externos Toggle selected Cambiar selección Activate All Activar Todos Deactivate All Desactivar Todos Remove from list. This has no effect on the disk index. Eliminar de la lista. Esto no tiene efecto en el índice en disco. Remove selected Eliminar selección Click to add another index directory to the list Presione para añadir otro directorio de índice a la lista Add index Añadir índice Apply changes Aplicar cambios &OK &OK Discard changes Descartar cambios &Cancel &Cancelar Abstract snippet separator Separador de fragmentos de resumen Use <PRE> tags instead of <BR>to display plain text as html. Utilizar etiquetas <PRE> en lugar de <BR> para mostrar texto simple como html. Lines in PRE text are not folded. Using BR loses indentation. Líneas en texto PRE no se parten. Al usar BR se pierde indentación. Style sheet Hoja de estilo Opens a dialog to select the style sheet file Abre una ventana de diálogo para seleccionar la hoja de estilos Choose Elegir Resets the style sheet to default Restablecer la hoja de estilo al valor por defecto Lines in PRE text are not folded. Using BR loses some indentation. Líneas en texto PRE no se parten. Al usar BR se pierde indentación. Use <PRE> tags instead of <BR>to display plain text as html in preview. Use etiquetas <PRE> en lugar de <BR> para desplegar texto corriente como html en la vista previa. Result List Lista de resultados Edit result paragraph format string Editar texto de formato para el párrafo de resultados Edit result page html header insert Editar encabezado html insertado en página de resultados Date format (strftime(3)) Formato de fecha (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Umbral de porcentaje de frecuencia sobre el cuál no utilizamos términos dentro de la autofrase. Los términos frequentes son un problema importante de desempeño con las frases. Términos omitidos aumenta la holgura de la frase, y reducen la eficiencia de la autofrase. El valor por defecto es 2 (por ciento). Autophrase term frequency threshold percentage Porcentaje del umbral de frecuencia de términos de autofrase recoll-1.17.3/qtgui/i18n/recoll_fr.ts000644 001750 000000 00000333716 11757435273 017746 0ustar00dockeswheel000000 000000 AdvSearch All clauses Toutes les clauses Any clause Une des clauses texts textes spreadsheets feuilles de calcul presentations présentations media multimédia messages messages other autres Bad multiplier suffix in size filter Suffixe multiplicateur incorrect dans un filtre de taille (k/m/g/t) AdvSearchBase Advanced search Recherche avancée Restrict file types Restreindre le type de fichier Save as default Sauver comme valeur initiale Searched file types Types de fichier recherchés All ----> Tout ----> Sel -----> Sel -----> <----- Sel <----- Sel <----- All <----- Tout Ignored file types Types de fichiers ignorés Enter top directory for search Entrer le répertoire où démarre la recherche Browse Parcourir Restrict results to files in subtree: Restreindre les résultats aux fichiers de l'arborescence: Start Search Lancer la recherche Search for <br>documents<br>satisfying: Rechercher les <br>documents<br>vérifiant: Delete clause Enlever une clause Add clause Ajouter une clause Check this to enable filtering on file types Cocher pour permettre le filtrage des types de fichiers By categories Par catégories Check this to use file categories instead of raw mime types Cocher pour utiliser les catégories de fichiers au lieu des types mimes Close Fermer All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Tous les champs de droite non vides seront combinés par une conjonction ET (choix "Toutes les clauses") ou OU (choix "Une des clauses"). <br> Les champs de type "Un de ces mots", "Tous ces mots" et "Aucun de ces mots" acceptent un mélange de mots et de phrases contenues dans des apostrophes "une phrase".<br>Les champs non renseignés sont ignorés. Invert Inverser Minimum size. You can use k/K,m/M,g/G as multipliers Taille minimum. Vous pouvez utiliser un suffixe multiplicateur: k/K, m/M, g/G. Min. Size Taille Min. Maximum size. You can use k/K,m/M,g/G as multipliers Taille Maximum. Vous pouvez utiliser un suffixe multiplicateur: k/K, m/M, g/G. Max. Size Taille Max. Select Sélectionner Filter Filtrer From À partir de To Jusqu'à Check this to enable filtering on dates Cocher pour activer le filtrage sur les dates Filter dates Filtrer sur les dates Find Trouver Check this to enable filtering on sizes Cocher pour activer le fitrage sur taille fichier Filter sizes Filtrer les tailles CronToolW Cron Dialog Dialogue Cron <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span>: planification de l'indexation périodique (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Chaque champ peut contenir un joker (*), une simple valeur numérique , des listes ponctuées par des virgules (1,3,5) et des intervalles (1-7). Plus généralement, les champs seront utilisés <span style=" font-style:italic;">tels quels</span> dans le fichier crontab, et la syntaxe générale crontab peut être utilisée, voir la page de manuel crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Par exemple, en entrant <span style=" font-family:'Courier New,courier';">*</span> dans <span style=" font-style:italic;">Jours, </span><span style=" font-family:'Courier New,courier';">12,19</span> dans <span style=" font-style:italic;">Heures</span> et <span style=" font-family:'Courier New,courier';">15</span> dans <span style=" font-style:italic;">Minutes</span>, recollindex démarrerait chaque hour à 12:15 et 19:15</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un planning avec des activations très fréquentes est probablement moins efficace que l'indexation au fil de l'eau.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Jours de la semaine (* ou 0-7, 0 ou 7 signifie Dimanche) Hours (* or 0-23) Heures (* ou 0-23) Minutes (0-59) Minutes (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cliquer <span style=" font-style:italic;">Désactiver</span> pour arrêter l'indexation automatique périodique, <span style=" font-style:italic;">Activer</span> pour la démarrer, <span style=" font-style:italic;">Annuler</span> pour ne rien changer.</p></body></html> Enable Activer Disable Désactiver It seems that manually edited entries exist for recollindex, cannot edit crontab Il semble que des entrées créées manuellement existent pour recollindex. Impossible d´éditer le fichier Cron Error installing cron entry. Bad syntax in fields ? Erreur durant l'installation de l'entrée cron. Mauvaise syntaxe des champs ? EditDialog Dialog Dialogue FirstIdxDialog First indexing setup Paramétrage de la première indexation <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Il semble que l'index pour cette configuration n'existe pas encore.</span><br /><br />Si vous voulez simplement indexer votre répertoire avec un jeu raisonnable de valeurs par défaut, cliquer le bouton <span style=" font-style:italic;">Démarrer l'indexation maintenant</span>. Vous pourrez ajuster les détails plus tard. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si vous voulez plus de contrôle, utilisez les liens qui suivent pour ajuster la configuration et le planning d'indexation.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ces outils peuvent être accédés plus tard à partir du menu <span style=" font-style:italic;">Preferences</span>.</p></body></html> Indexing configuration Configuration de l'indexation This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Vous pourrez ajuster les répertoires que vous voulez indexer, et d'autres paramètres comme les schémas de noms ou chemins de fichiers exclus, les jeux de caractères par défaut, etc. Indexing schedule Planning de l'indexation This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Vous pourrez choisir entre l'indexation à intervalles fixes ou au fil de l'eau, et définir un planning pour la première (basé sur l'utilitaire cron). Start indexing now Démarrer l'indexation maintenant IdxSchedW Index scheduling setup Paramétrage du planning d'indexation <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">L'indexation <span style=" font-weight:600;">Recoll</span> peut fonctionner en permanence, traitant les fichiers dès qu'ils sont modifiés, ou être exécutée à des moments prédéterminés. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Une lecture du manuel peut vous aider à choisir entre ces approches (presser F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cet outil peut vous aider à planifier l'indexation périodique, ou configurer un démarrage automatique de l'indexation au fil de l'eau quand vous vous connectez (ou les deux, ce qui est rarement pertinent). </p></body></html> Cron scheduling Planning Cron The tool will let you decide at what time indexing should run and will install a crontab entry. Le dialogue vous permettra de déterminer à quelle heure l'indexation devra démarrer et installera une entrée crontab. Real time indexing start up Démarrage de l'indexation au fil de l'eau Decide if real time indexing will be started when you log in (only for the default index). Déterminer si l'indexation au fil de l'eau démarre quand vous vous connectez (pour l'index par défaut). ListDialog Dialog Dialogue GroupBox GroupBox Main No db directory in configuration Répertoire de la base de données non défini dans la configuration Could not open database in Impossible d'ouvrir la base dans . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. Cliquer Annuler pour pouvoir éditer le fichier de configuration avant que l'indexation ne démarre, ou Ok pour continuer. Configuration problem (dynconf Problème de configuration (dynconf) "history" file is damaged or un(read)writeable, please check or remove it: Le fichier d'historique est illisible, le verifier ou l'effacer: Preview &Search for: &Rechercher: &Next &Suivant &Previous &Précédent Match &Case Respecter la &casse Clear Effacer Creating preview text Création du texte pour la prévisualisation Loading preview text into editor Chargement du texte de la prévisualisation Cannot create temporary directory Impossible de créer le répertoire temporaire Cancel Annuler Close Tab Fermer l'onglet Missing helper program: Programmes filtres externes manquants: Can't turn doc into internal representation for Impossible de traduire le document en représentation interne pour Cannot create temporary directory: Impossible de créer un répertoire temporaire Error while loading file Erreur de chargement du fichier PreviewTextEdit Show fields Afficher les valeurs des champs Show main text Afficher le corps du texte Print Imprimer Print Current Preview Imprimer la fenêtre de prévisualisation Show image Afficher l'image Select All Tout sélectionner Copy Copier Save document to file Sauvegarder le document Fold lines Replier les lignes Preserve indentation Préserver l'indentation QObject Global parameters Paramètres globaux Local parameters Paramètres locaux <b>Customised subtrees <b>Répertoires avec paramètres spécifiques The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. La liste des sous-répertoires de la zone indexée<br>où certains paramètres sont redéfinis. Défaut: vide. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Les paramètres qui suivent sont définis soit globalement, si la sélection dans la liste ci-dessus<br>est vide ou réduite à la ligne vide, soit pour le répertoire sélectionné.<br>Vous pouvez ajouter et enlever des répertoires en cliquant les boutons +/-. Skipped names Noms ignorés These are patterns for file or directory names which should not be indexed. Canevas définissant les fichiers ou répertoires qui ne doivent pas etre indexés. Default character set Jeu de caractères par défaut This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Jeu de caractères utilisé pour lire les fichiers qui ne l'identifient pas de manière interne, par exemple les purs fichiers texte. <br>La valeur par défaut est vide, et le programme utilise l'environnement. Follow symbolic links Suivre les liens symboliques Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Indexer les fichiers et répertoires pointés par les liens symboliques. Pas fait par défaut pour éviter les indexations multiples Index all file names Indexer tous les noms de fichiers Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Indexer les noms des fichiers dont le contenu n'est pas identifié ou traité (pas de type mime, ou type non supporté). Vrai par défaut Beagle web history Queue Beagle RTIToolW Real time indexing automatic start Démarrage automatique de l'indexation au fil de l'eau <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">L'indexation <span style=" font-weight:600;">Recoll</span> peut être configurer pour s'exécuter en arrière plan, mettant à jour l'index au fur et à mesure que des documents sont modifiés. Vous y gagnez un index toujours à jour, mais des ressources systême (mémoire et processeur) sont consommées en permanence.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Démarrer le démon d'indexation quand je me connecte. Also start indexing daemon right now. Également démarrer le démon maintenant. Replacing: Remplacement de: Replacing file Remplacement du fichier Can't create: Impossible de créer: Warning Attention Could not execute recollindex Impossible d'exécuter recollindex Deleting: Effacement: Deleting file Effacement du fichier Removing autostart Enlèvement de l'autostart Autostart file deleted. Kill current process too ? Fichier autostart détruit. Arrêter le process en cours ? RclMain About Recoll À propos de Recoll Executing: [ Exécution de: [ Cannot retrieve document info from database Impossible d'accéder au document dans la base Warning Attention Can't create preview window Impossible de créer la fenêtre de visualisation Query results Résultats de la recherche Document history Historique des documents consultés History data Données d'historique Indexing in progress: Indexation en cours: Files Fichiers Purge Nettoyage Stemdb Base radicaux Closing Fermeture Unknown Inconnue This search is not active any more Cette recherche n'est plus active Can't start query: Impossible de démarrer la recherche: Bad viewer command line for %1: [%2] Please check the mimeconf file Mauvaise commande pour %1: [%2] Vérifier le fichier mimeconf Cannot extract document or create temporary file Impossible d'extraire le document ou de créer le fichier temporaire (no stemming) (pas d'expansion) (all languages) (tous les langages) error retrieving stemming languages impossible de trouver la liste des langages d'expansion Update &Index Mettre à jour l'&Index Indexing interrupted Indexation interrompue Stop &Indexing Arrèter l'&Indexation All Tout media multimédia message message other autres presentation présentation spreadsheet feuille de calcul text texte sorted trié filtered filtré External applications/commands needed and not found for indexing your file types: Applications externes non trouvees pour indexer vos types de fichiers: No helpers found missing Pas d'applications manquantes Missing helper programs Applications manquantes Save file dialog Dialogue de sauvegarde de fichier Choose a file name to save under Choisir un nom pour le nouveau fichier Document category filter Filtre de catégories de documents No external viewer configured for mime type [ Pas de visualiseur configuré pour le type MIME [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Le visualiseur spécifié dans mimeview pour %1: %2 est introuvable. Voulez vous démarrer le dialogue de préférences ? Can't access file: Impossible d'accéder au fichier: Can't uncompress file: Impossible de décomprimer le fichier: Save file Sauvegarder le fichier Result count (est.) Nombre de résultats (est.) Query details Détails de la recherche Could not open external index. Db not open. Check external indexes list. Impossible d'ouvrir un index externe. Base non ouverte. Verifier la liste des index externes. No results found Aucun résultat trouvé None Rien Updating Mise à jour Done Fini Monitor Moniteur Indexing failed L'indexation a échoué The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Le processus d'indexation en cours n'a pas été démarré depuis cette interface. Cliquer Ok pour le tuer quand même, ou Annuler pour le laisser tranquille Erasing index Effacement de l'index Reset the index and start from scratch ? Effacer l'index et redémarrer de zéro ? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Requête en cours.<br>En raison de restrictions internes, <br>annuler terminera l'exécution du programme Error Erreur Index not open Index pas ouvert Index query error Erreur de la recherche sur l'index Indexed Mime Types Types MIME indexés Content has been indexed for these mime types: Du contenu a été indexé pour ces types MIME: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Index pas à jour pour ce fichier. Risque d'afficher une entrée incorrecte. Cliquer Ok pour mettre à jour l'index pour ce fichier, puis redémarrer la requête quand l'indexation est terminée. Sinon, Annuler. Can't update index: indexer running Impossible de mettre à jour l'index: un indexeur est déjà actif Indexed MIME Types Types MIME indexés RclMainBase Previous page Page précédente Next page Page suivante &File &Fichier E&xit &Quitter &Tools &Outils &Help &Aide &Preferences &Préférences Search tools Outils de recherche Result list Liste de résultats &About Recoll &A propos de Recoll Document &History &Historique des documents Document History Historique des documents &Advanced Search Recherche &Avancée Advanced/complex Search Recherche Avancée &Sort parameters Paramètres pour le &tri Sort parameters Paramètres pour le tri Next page of results Page suivante Previous page of results Page précédente &Query configuration &Recherche &User manual &Manuel Recoll Recoll Ctrl+Q Ctrl+Q Update &index &Indexer Term &explorer &Exploration de l'index Term explorer tool Outil d'exploration de l'index External index dialog Index externes &Erase document history &Effacer l'historique des documents First page Premiere page Go to first page of results Aller a la premiere page de resultats &Indexing configuration Configuration d'&Indexation All Tout &Show missing helpers Afficher les application&s manquantes PgDown PgDown Shift+Home, Ctrl+S, Ctrl+Q, Ctrl+S Shift+Home, Ctrl+S, Ctrl+Q, Ctrl+S PgUp PgUp &Full Screen &Plein écran F11 F11 Full Screen Plein écran &Erase search history &Effacer l'historique des recherches sortByDateAsc sortByDateAsc Sort by dates from oldest to newest Trier par date des plus anciennes aux plus récentes sortByDateDesc sortByDateDesc Sort by dates from newest to oldest Trier par date des plus récentes aux plus anciennes Show Query Details Afficher la requête en détails Show results as table Afficher les résultats en tableau &Rebuild index &Reconstruire l'index &Show indexed types &Afficher les types indexés Shift+PgUp Shift+PgUp &Indexing schedule &Planning d'indexation E&xternal index dialog Configuration des index e&xternes RecollModel Abstract Extrait Author Auteur Document size Taille document Document date Date document File size Taille fichier File name Nom de fichier File date Date fichier Ipath Ipath Keywords Mots clef Mime type Type Mime Original character set Jeu de caractères d'origine Relevancy rating Pertinence Title Titre URL URL Mtime Mtime Date Date Date and time Date et heure Ipath Ipath MIME type Type MIME ResList Result list Liste de résultats Unavailable document Document inaccessible Previous Précédent Next Suivant <p><b>No results found</b><br> <p><b>Aucun résultat</b><br> &Preview &Voir contenu Copy &URL Copier l'&Url Find &similar documents Chercher des documents &similaires Query details Détail de la recherche (show query) (requête) Copy &File Name Copier le nom de &Fichier filtered filtré sorted trié Document history Historique des documents consultés Preview Prévisualisation Open Ouvrir <p><i>Alternate spellings (accents suppressed): </i> <p><i>Orthographes proposés (sans accents): </i> &Write to File &Sauver sous Preview P&arent document/folder Prévisualiser le document p&arent &Open Parent document/folder &Ouvrir le document parent &Open &Ouvrir Documents Documents out of at least parmi au moins for pour ResTable &Reset sort &Revenir au tri par pertinence &Delete column &Enlever la colonne Add " Ajouter " " column " colonne Save table to CSV file Sauvegarder dans un fichier CSV Can't open/create file: Impossible d'ouvrir ou créer le fichier: &Preview &Voir contenu &Open &Ouvrir Copy &File Name Copier le nom de &Fichier Copy &URL Copier l'&Url &Write to File &Sauver sous Find &similar documents Chercher des documents &similaires Preview P&arent document/folder Prévisualiser le document p&arent &Open Parent document/folder &Ouvrir le document parent &Save as CSV &Sauvegarder en CSV Add "%1" column Ajouter une colonne "%1" ResTableDetailArea &Preview &Voir contenu &Open &Ouvrir Copy &File Name Copier le nom de &Fichier Copy &URL Copier l'&Url &Write to File &Sauver sous Find &similar documents Chercher des documents &similaires Preview P&arent document/folder Prévisualiser le document p&arent &Open Parent document/folder &Ouvrir le document parent SSearch Any term Certains termes All terms Tous les termes File name Nom de fichier Completions Complétions Select an item: Sélectionner un élément: Too many completions Trop de complétions possibles Query language Language d'interrogation Bad query string Requête non reconnue Out of memory Plus de mémoire disponible Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Entrer une expression du langage de recherche. Antisèche:<br> <i>term1 term2</i> : 'term1' ET 'term2' champ non spécifié.<br> <i>field:term1</i> : 'term1' recherche dans le champ 'field'.<br> Noms de champs standards (utiliser les mots anglais)/alias:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-champs: dir, mime/format, type/rclcat, date.<br> Examples d'intervalles de dates: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> NE PAS mettre les parenthèses.<br> <i>"term1 term2"</i> : phrase exacte. Options::<br> <i>"term1 term2"p</i> : proximité (pas d'ordre).<br> Utiliser le lien <b>Afficher la requête en détail</b> en cas de doute sur les résultats et consulter le manuel (en anglais) (&lt;F1>) pour plus de détails. Enter file name wildcard expression. Entrer un nom de fichier (caractères jokers possibles) Enter search terms here. Type ESC SPC for completions of current term. Entrer les termes recherchés ici. Taper ESC SPC pour afficher les mots commençant par l'entrée en cours. SSearchBase SSearchBase SSearchBase Clear Effacer Ctrl+S Ctrl+S Erase search entry Effacer l'entrée Search Rechercher Start query Démarrer la recherche Enter search terms here. Type ESC SPC for completions of current term. Entrer les termes recherchés ici. Taper ESC SPC pour afficher les mots commençant par l'entrée en cours. Choose search type. Choisir le type de recherche. SearchClauseW SearchClauseW SearchClauseW Any of these Un de ces mots All of these Tous ces mots None of these Aucun de ces mots This phrase Cette phrase Terms in proximity Termes en proximité File name matching Modèle de nom de fichier Select the type of query that will be performed with the words Sélectionner le type de requête à effectuer avec les mots Number of additional words that may be interspersed with the chosen ones Nombre de mots additionnels qui peuvent se trouver entre les termes recherchés In field Sans champ No field Sans champ Any Certains All Tout None Rien Phrase Phrase Proximity Proximité File name Nom de fichier SortForm Date Date Mime type Type Mime SortFormBase Sort Criteria Critères de tri Sort the Trier les most relevant results by: résultats les plus pertinents en fonction de: Descending Décroissant Close Fermer Apply Appliquer SpellBase Term Explorer Explorateur d'index &Expand &Dérivés Alt+E Alt+D &Close &Fermer Alt+C Alt+F Term Terme No db info. Pas d'information sur la base. Doc. / Tot. Doc. / Tot. SpellW Wildcards Wildcards Regexp Expression régulière Spelling/Phonetic Orthographe/Phonétique Aspell init failed. Aspell not installed? Erreur d'initialisation aspell. Il n'est peut-être pas installé? Aspell expansion error. Erreur aspell. Stem expansion Expansion grammaticale error retrieving stemming languages Impossible de former la liste des langages d'expansion No expansion found Pas de résultats Term Terme Doc. / Tot. Doc. / Tot. Index: %1 documents, average length %2 terms Index: %1 documents, taille moyenne %2 termes UIPrefsDialog The selected directory does not appear to be a Xapian index Le répertoire sélectionné ne semble pas être un index Xapian This is the main/local index! C'est l'index principal ! The selected directory is already in the index list Le répertoire sélectionné est déjà dans la liste Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Sélectionner un répertoire contenant un index Xapian (ex: /home/monAmi/.recoll/xapiandb) error retrieving stemming languages Impossible de former la liste des langues pour l'expansion grammaticale Choose Choisir UIPrefsDialogBase User interface Interface utilisateur Number of entries in a result page Nombre de résultats par page Result list font Fonte pour la liste de résultats Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Ouvre une fenetre permettant de changer la fonte Reset Réinitialiser Resets the result list font to the system default Réinitialiser la fonte à la valeur par défaut Auto-start simple search on whitespace entry. Démarrer automatiquement une recherche simple sur entrée d'un espace. Start with advanced search dialog open. Panneau de recherche avancée ouvert au démarrage. Start with sort dialog open. Panneau de tri ouvert au démarrage. Search parameters Paramètres pour la recherche Stemming language Langue pour l'expansion des termes Dynamically build abstracts Construire dynamiquement les résumés Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Décide si des résumés seront construits à partir du contexte des termes de recherche. Peut ralentir l'affichage si les documents sont gros. Replace abstracts from documents Remplacer les résumés existant dans les documents Do we synthetize an abstract even if the document seemed to have one? Est-ce qu'un résumé doit etre synthétisé meme dans le cas ou le document original en avait un? Synthetic abstract size (characters) Taille du résumé synthétique (caractères) Synthetic abstract context words Nombre de mots de contexte par occurrence de terme dans le résumé External Indexes Index externes Add index Ajouter un index Select the xapiandb directory for the index you want to add, then click Add Index Sélectionner le répertoire xapian de l'index à ajouter, puis cliquer Ajouter Index Browse Parcourir &OK &OK Apply changes Appliquer les modifications &Cancel &Annuler Discard changes Suivant Result paragraph<br>format string Chaîne de formatage<br>des paragraphes résultats Automatically add phrase to simple searches Ajouter automatiquement une phrase aux recherches simples A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Une recherche pour [vin rouge] (2 mots) sera complétée comme [vin OU rouge OU (vin PHRASE 2 rouge)].<br> Ceci devrait donner une meilleure pertinence aux résultats où les termes recherchés apparaissent exactement et dans l'ordre. User preferences Préférences utilisateur Use desktop preferences to choose document editor. Utiliser les réglages du bureau pour choisir l'application de visualisation. External indexes Index externes Toggle selected Changer l'état pour les entrées sélectionnées Activate All Tout activer Deactivate All Tout désactiver Remove selected Effacer la sélection Remove from list. This has no effect on the disk index. Oter de la liste. Sans effet sur les données stockées. Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Definit le format des paragraphes de la liste de resultats. Utilise le format html qt et des directives de substitution de type printf:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Remember sort activation state. Memoriser l'etat d'activation du tri. Maximum text size highlighted for preview (megabytes) Taille maximum des textes surlignes avant previsualisation (MO) Texts over this size will not be highlighted in preview (too slow). Les texte plus gros ne seront pas surlignes dans la previsualisation (trop lent). Highlight color for query terms Couleur de mise en relief des termes recherchés Prefer Html to plain text for preview. Utiliser le format Html pour la previsualisation. If checked, results with the same content under different names will only be shown once. N'afficher qu'une entrée pour les résultats de contenu identique. Hide duplicate results. Cacher les doublons. Choose editor applications Choisir les éditeurs pour les différents types de fichiers Display category filter as toolbar instead of button panel (needs restart). Afficher le filtre de catégorie comme une barre d'outils plutot que comme un panneau de boutons (après le redémarrage). The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Les mots de la liste seront automatiquement changés en clauses ext:xxx dans les requêtes en langage d'interrogation. Query language magic file name suffixes. Suffixes automatiques pour le langage d'interrogation. Enable Activer ViewAction Changing actions with different current values Changement d'actions avec des valeurs actuelles differentes Mime type Type Mime Command Commande MIME type Type MIME ViewActionBase File type Type de fichier Action Action Select one or several file types, then click Change Action to modify the program used to open them Sélectionner une ou plusieurs types de fichiers, puis cliquer Changer pour modifier le programme utiliser pour les ouvrir Change Action Changer Close Fermer Native Viewers Applications de visualisation Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. Sélectionner un ou plusieurs types MIME puis cliquer "Modifier l'Action"<br>Vous pouvez aussi fermer ce dialogue et choisir "Utiliser les préférences du bureau"<br> dans le dialogue principal pour ignorer cette liste. confgui::ConfBeaglePanelW Steal Beagle indexing queue Voler la queue d'indexation de Beagle Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Beagle NE DOIT PAS être actif. Permet de traiter la queue de Beagle pour indexer l'historique des pages visitées de Firefox.<br> (Il faut aussi installer le plugin Beagle pour Firefox) Web cache directory name Nom du répertoire cache de pages WEB The name for a directory where to store the cache for visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Le nom d'un répertoire où stocker les copies des pages WEB visitées.<br>Le chemin peut être relatif au répertoire de configuration. Max. size for the web cache (MB) Taille maximum pour le cache (MB) Entries will be recycled once the size is reached Les pages seront écrasées quand la taille spécifiée est atteinte Web page store directory name The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Le nom d'un répertoire où stocker les copies des pages visitées.<br>Un chemin relatif se réfère au répertoire de configuration. Max. size for the web store (MB) Taill max. pour le cache Web (MB) confgui::ConfIndexW Can't write configuration file Impossible d'ecrire le fichier de configuration confgui::ConfParamFNW Browse Parcourir Choose Choisir confgui::ConfParamSLW + + - - confgui::ConfSubPanelW Global Global Max. compressed file size (KB) Taill maximale pour les fichiers à décomprimer (Ko) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Cette valeur définit un seuil au delà duquel les fichiers comprimés ne seront pas traités. Utiliser -1 pour désactiver la limitation, 0 pour ne traiter aucun fichier comprimé. Max. text file size (MB) Taille maximum d'un fichier texte (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Cette valeur est un seuil au delà duquel les fichiers texte ne seront pas indexés. Spécifier -1 pour supprimer la limite. Utilisé pour éviter d'indexer des fichiers monstres. Text file page size (KB) Taille de découpe pour les fichiers texte (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Si cette valeur est spécifiée et positive, les fichiers texte seront découpés en tranches de cette taille pour l'indexation. Ceci diminue les ressources consommées par l'indexation et aide le chargement pour prévisualisation. Max. filter exec. time (S) Temps d'exécution maximum pour un filtre (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. Un filtre externe sera interrompu si l'attente dépasse ce temps. Utile dans le cas rare (programme postscript par exemple) où un document pourrait forcer un filtre à boucler indéfiniment. Positionner à -1 pour supprimer la limite. confgui::ConfTopPanelW Top directories Répertoires de départ The list of directories where recursive indexing starts. Default: your home. La liste des répertoires où l'indexation récursive démarre. Défault: votre répertoire par défaut. Skipped paths Chemins ignorés These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Ce sont des noms de répertoires où l'indexation n'entrera pas.<br>Ils peuvent contenir des caractères jokers. Les chemins doivent correspondre à ceux vus par l'indexeur (par exemple: si un des répertoires de départ est '/home/me' et que '/home' est un lien sur '/usr/home', une entrée correcte ici serait '/home/me/tmp*' , pas '/usr/home/me/tmp*') Stemming languages Langue pour l'expansion des termes The languages for which stemming expansion<br>dictionaries will be built. Les langages pour lesquels les dictionnaires d'expansion<br>des termes seront construits. Log file name Nom du fichier journal The file where the messages will be written.<br>Use 'stderr' for terminal output Le nom du fichier ou les messages seront ecrits.<br>Utiliser 'stderr' pour le terminal Log verbosity level Niveau de verbosité This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Cette valeur ajuste la quantite de messages emis,<br>depuis uniquement les erreurs jusqu'a beaucoup de donnees de debug. Index flush megabytes interval Intervalle d'écriture de l'index en mégaoctets This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Ajuste la quantité de données lues entre les écritures sur disque.<br>Contrôle l'utilisation de la mémoire. Défaut 10 Mo Max disk occupation (%) Occupation disque maximum (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Niveau d'occupation du disque ou l'indexation s'arrete (pour eviter un remplissage excessif).<br>0 signifie pas de limite (defaut). No aspell usage Pas d'utilisation d'aspell Aspell language Langue pour aspell The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Langue du dictionnaire aspell. Une valeur correcte ressemble à 'en' ou 'fr'... <br>Si cette valeur n'est pas positionnée, l'environnement est utilisé pour la calculer, ce qui marche bien, habituellement. Utiliser 'aspell config' et regarder les fichiers .dat dans le répertoire 'data-dir' pour connaitre les langues aspell installées sur votre système. Database directory name Répertoire de stockage de l'index The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Le nom d'un répertoire où l'index sera stocké<br>Un chemin relatif démarrera au répertoire de configuration. Le défaut est 'xapiandb'. Use system's 'file' command Utiliser la commande 'file' du systeme Use the system's 'file' command if internal<br>mime type identification fails. Utiliser la commande 'file' si la determination<br>interne du type mime n'obtient pas de resultat. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Désactiver l'utilisation d'aspell pour générer les approximations orthographiques.<br> Utile si aspell n'est pas installé ou ne fonctionne pas. uiPrefsDialogBase User preferences Préférences utilisateur User interface Interface utilisateur Number of entries in a result page Nombre de résultats par page If checked, results with the same content under different names will only be shown once. N'afficher qu'une entrée pour les résultats de contenu identique. Hide duplicate results. Cacher les doublons. Highlight color for query terms Couleur de mise en relief des termes recherchés Result list font Fonte pour la liste de résultats Opens a dialog to select the result list font Ouvre une fenêtre permettant de changer la fonte Helvetica-10 Helvetica-10 Resets the result list font to the system default Réinitialiser la fonte à la valeur par défaut Reset Réinitialiser Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Definit le format des paragraphes de la liste de resultats. Utilise le format html qt et des directives de substitution de type printf:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Result paragraph<br>format string Chaîne de formatage<br>des paragraphes résultats Texts over this size will not be highlighted in preview (too slow). Les texte plus gros ne seront pas surlignés dans la prévisualisation (trop lent). Maximum text size highlighted for preview (megabytes) Taille maximum des textes surlignés avant prévisualisation (MO) Use desktop preferences to choose document editor. Utiliser les réglages du bureau pour choisir l'application de visualisation. Choose editor applications Choisir les éditeurs pour les différents types de fichiers Display category filter as toolbar instead of button panel (needs restart). Afficher le filtre de catégorie comme une barre d'outils plutot que comme un panneau de boutons (après le redémarrage). Auto-start simple search on whitespace entry. Démarrer automatiquement une recherche simple sur entrée d'un espace. Start with advanced search dialog open. Panneau de recherche avancée ouvert au démarrage. Start with sort dialog open. Panneau de tri ouvert au démarrage. Remember sort activation state. Memoriser l'etat d'activation du tri. Prefer Html to plain text for preview. Utiliser le format Html pour la previsualisation. Search parameters Paramètres pour la recherche Stemming language Langue pour l'expansion des termes A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Une recherche pour [vin rouge] (2 mots) sera complétée comme [vin OU rouge OU (vin PHRASE 2 rouge)].<br> Ceci devrait donner une meilleure pertinence aux résultats où les termes recherchés apparaissent exactement et dans l'ordre. Automatically add phrase to simple searches Ajouter automatiquement une phrase aux recherches simples Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Décide si des résumés seront construits à partir du contexte des termes de recherche. Peut ralentir l'affichage si les documents sont gros. Dynamically build abstracts Construire dynamiquement les résumés Do we synthetize an abstract even if the document seemed to have one? Est-ce qu'un résumé doit etre synthétisé meme dans le cas ou le document original en avait un? Replace abstracts from documents Remplacer les résumés existant dans les documents Synthetic abstract size (characters) Taille du résumé synthétique (caractères) Synthetic abstract context words Nombre de mots de contexte par occurrence de terme dans le résumé The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Les mots de la liste seront automatiquement changés en clauses ext:xxx dans les requêtes en langage d'interrogation. Query language magic file name suffixes. Suffixes automatiques pour le langage d'interrogation. Enable Activer External Indexes Index externes Toggle selected Changer l'état pour les entrées sélectionnées Activate All Tout activer Deactivate All Tout désactiver Remove from list. This has no effect on the disk index. Oter de la liste. Sans effet sur les données stockées. Remove selected Effacer la sélection Click to add another index directory to the list Cliquer pour ajouter un autre index à la liste Add index Ajouter un index Apply changes Appliquer les modifications &OK &OK Discard changes Abandonner les modifications &Cancel &Annuler Abstract snippet separator Separateur d'extrait Use <PRE> tags instead of <BR>to display plain text as html. Utilise des balises <PRE> au lieu de <BR> pour afficher du texte brut en html. Lines in PRE text are not folded. Using BR loses indentation. Les lignes de text brut <PRE> ne sont pas replies (scroll horizontal). L'utilisation de balises <BR> ne preserve pas l'indentation. Style sheet Feuille de style Opens a dialog to select the style sheet file Ouvre un dialogue pour choisir un fichier feuille de style Choose Choisir Resets the style sheet to default Restore la valeur par défaut pour la feuille de style Lines in PRE text are not folded. Using BR loses some indentation. Les lignes dans des sections PRE ne sont pas justifiées. Using BR perd une partie de l'indentation. Use <PRE> tags instead of <BR>to display plain text as html in preview. Utiliser des tags <PRE> au lieu de <BR> pour affichier du texte non formaté en html dans la prévisualisation Result List Liste de résultats Edit result paragraph format string Editer le format du paragraphe de résultat Edit result page html header insert Editer le fragment à insérer dans l'en-tête HTML Date format (strftime(3)) Format de date (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Seuil de fréquence (pourcentage) au delà duquel les termes ne seront pas utilisés. Les phrases contenant des termes trop fréquents posent des problèmes de performance. Les termes ignorés augmentent la distance de phrase, et réduisent l'efficacité de la fonction de recherche de phrase automatique. La valeur par défaut est 2% Autophrase term frequency threshold percentage Seuil de fréquence de terme (pourcentage) pour la génération automatique de phrases recoll-1.17.3/qtgui/i18n/recoll_it.ts000644 001750 000000 00000264637 11757435273 017760 0ustar00dockeswheel000000 000000 AdvSearch All clauses Tutti i termini Any clause Qualsiasi termine texts testi spreadsheets fogli di calcolo presentations presentazioni media multimediali messages messaggi other altri Bad multiplier suffix in size filter AdvSearchBase Advanced search Ricerca avanzata Restrict file types Limita i tipi di file Save as default Salva come default Searched file types Ricerca tipo file All ----> Tutti ----> Sel -----> Sel -----> <----- Sel <----- Sel <----- All <----- Tutti Ignored file types Ignora i file di questo tipo Enter top directory for search Scrivi la directory base per la ricerca Browse Esplora Restrict results to files in subtree: Limita i risultati alla sotto-directory: Start Search Cerca Search for <br>documents<br>satisfying: Cerca i documenti<br>che contengono: Delete clause Elimina condizione Add clause Aggiungi condizione Check this to enable filtering on file types Contrassegna per abilitare la ricerca sul tipo di file By categories Per categorie Check this to use file categories instead of raw mime types Contrassegna per usare le categorie al posto dei tipi mime Close Chiudi All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Invert Minimum size. You can use k/K,m/M,g/G as multipliers Min. Size Maximum size. You can use k/K,m/M,g/G as multipliers Max. Size Filter From To Check this to enable filtering on dates Filter dates Find Check this to enable filtering on sizes Filter sizes CronToolW Cron Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Hours (* or 0-23) Minutes (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> Enable Disable It seems that manually edited entries exist for recollindex, cannot edit crontab Error installing cron entry. Bad syntax in fields ? EditDialog Dialog FirstIdxDialog First indexing setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> Indexing configuration This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Indexing schedule This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Start indexing now IdxSchedW Index scheduling setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> Cron scheduling The tool will let you decide at what time indexing should run and will install a crontab entry. Real time indexing start up Decide if real time indexing will be started when you log in (only for the default index). ListDialog Dialog GroupBox Main No db directory in configuration Nessuna directory per il DB di base nella configurazione Could not open database in Impossibile aprire il database in . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. Clicca 'Annulla' se vuoi editare il file di configurazione prima di iniziare l'indicizzazione, oppure 'OK' se vuoi procedere. Configuration problem (dynconf Problema di configurazione (dynconf "history" file is damaged or un(read)writeable, please check or remove it: Preview &Search for: &Cerca: &Next &Successivo &Previous &Precedente Match &Case Rispetta &Maiuscole/minuscole Clear Cancella Creating preview text Creazione del testo per l'anteprima Loading preview text into editor Caricamento anteprima del testo nell'editor Cannot create temporary directory Impossibile creare directory temporanea Cancel Annulla Close Tab Chiudi Tab Missing helper program: Manca il programma di filtro esterno: Can't turn doc into internal representation for Impossibile tradurre il documento per la rappresentazione interna Cannot create temporary directory: Error while loading file PreviewTextEdit Show fields Show main text Print Print Current Preview Show image Select All Copy Save document to file Fold lines Preserve indentation QObject Global parameters Parametri globali Local parameters Parametri locali <b>Customised subtrees <b>Ramificazioni personalizzate The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. Lista delle sottocartelle nella gerarchia indicizzata<br>ove alcuni parametri devono essere ridefiniti. Predefinita: vuota. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>I parametri che seguono sono postii al livello superiore, se niente <br> o una linea vuota è selezionata nella casella sovrastante, oppure al livello della cartella selezionata.<br> Puoi aggiungere/rimuovere cartelle cliccando i bottoni +/-. Skipped names Nomi saltati These are patterns for file or directory names which should not be indexed. Questi sono modelli per i nomi delle cartelle e/o dei files che non devono vebire indicizzati. Default character set Set di caratteri di default This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Questa è la codifica caratteri usata per leggere i file che non contengono indicazioni interne sulla codifica usata, ad esempio file di testo semplice.<br>Il valore predefinito è vuoto, in modo che venga usata l'impostazione locale del sistema. Follow symbolic links Segue il link simbolico Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Segue il link simbolico durante l'indicizzazione. Di default è no, per evitare la duplicazione dell'indice Index all file names Indicizza tutti i nomi dei files Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Indicizza il nome di quei files il cui contenuto non può essere identificato o processato (tipo mime non supportato). Di default è impostato a vero Beagle web history RTIToolW Real time indexing automatic start <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Also start indexing daemon right now. Replacing: Replacing file Can't create: Warning Attenzione Could not execute recollindex Deleting: Deleting file Removing autostart Autostart file deleted. Kill current process too ? RclMain About Recoll Informazioni su Recoll Executing: [ Esecuzione di: [ Cannot retrieve document info from database Impossibile caricare informazioni del documento dal database Warning Attenzione Can't create preview window Non posso creare la finestra di anteprima Query results Risultati della ricerca Document history Cronologia dei documenti History data Cronologia dei dati Indexing in progress: Indicizzazione in corso: Files Files Purge Pulisco Stemdb Database espansioni Closing Chiusura Unknown Sconosciuto This search is not active any more Questa ricerca non e' piu' attiva Can't start query: Non posso iniziare la ricerca: Bad viewer command line for %1: [%2] Please check the mimeconf file Errata linea di comando per %1: [%2] Verifica il file mimeconf Cannot extract document or create temporary file Non posso estrarre il documento o creare il file temporaneo (no stemming) (nessuna espansione) (all languages) (tutte le lingue) error retrieving stemming languages errore nel recupero delle lingue per l'espansione Update &Index Stop &Indexing All media multimediali message other altri presentation spreadsheet text sorted filtered External applications/commands needed and not found for indexing your file types: No helpers found missing Missing helper programs Document category filter No external viewer configured for mime type [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Can't access file: Can't uncompress file: Save file Result count (est.) Query details Dettagli ricerca Could not open external index. Db not open. Check external indexes list. No results found None Updating Done Monitor Indexing failed The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Erasing index Reset the index and start from scratch ? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Error Index not open Index query error Content has been indexed for these mime types: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Can't update index: indexer running Indexed MIME Types RclMainBase Previous page Pagina precedente Next page Pagina seguente &File &File E&xit &Esci &Tools &Strumenti &Help &Aiuto &Preferences &Preferenze Search tools Strumenti di ricerca Result list Lista risultati &About Recoll &Informazioni su Recoll Document &History C&ronologia documenti Document History Visualizza la cronologia dei documenti &Advanced Search Ricerca &Avanzata Advanced/complex Search Mostra la finestra di Ricerca avanzata &Sort parameters &Parametri ordinamento Sort parameters Configurazione dei parametri di ordinamento Next page of results Pagina seguente Previous page of results Pagina precedente &Query configuration &Configurazione ricerca &User manual &Manuale utente Recoll Recoll Ctrl+Q Ctrl+Q Update &index Aggiorna &indice Term &explorer &Esplora l'indice Term explorer tool Strumento di esplorazione indice External index dialog Configurazione indici esterni &Erase document history &Cancella la cronologia dei documenti First page Prima pagina Go to first page of results Vai alla prima pagina dei risultati &Indexing configuration Conf&igurazione indicizzazione All &Show missing helpers PgDown PgUp &Full Screen F11 Full Screen &Erase search history sortByDateAsc Sort by dates from oldest to newest sortByDateDesc Sort by dates from newest to oldest Show Query Details Show results as table &Rebuild index &Show indexed types Shift+PgUp &Indexing schedule E&xternal index dialog RecollModel File name Nome file Mime type Tipo MIME Date Data Abstract Author Document size Document date File size File date Keywords Original character set Relevancy rating Title URL Mtime Date and time Ipath MIME type ResList Result list Lista dei risultati Unavailable document Documento inaccessible Previous Precedente Next Successivo <p><b>No results found</b><br> <p><b>Nessun risultato</b><br> &Preview &Anteprima Copy &URL Copia l'&Url Find &similar documents Trova documenti &simili Query details Dettagli ricerca (show query) (mostra dettagli di ricerca) Copy &File Name Copia il nome del &File Document history Cronologia dei documenti Preview Open <p><i>Alternate spellings (accents suppressed): </i> &Write to File Preview P&arent document/folder &Open Parent document/folder &Open Documents Risultati out of at least totale di almeno for per ResTable &Reset sort &Delete column Save table to CSV file Can't open/create file: &Preview &Anteprima &Open Copy &File Name Copia il nome del &File Copy &URL Copia l'&Url &Write to File Find &similar documents Trova documenti &simili Preview P&arent document/folder &Open Parent document/folder &Save as CSV Add "%1" column ResTableDetailArea &Preview &Anteprima &Open Copy &File Name Copia il nome del &File Copy &URL Copia l'&Url &Write to File Find &similar documents Trova documenti &simili Preview P&arent document/folder &Open Parent document/folder SSearch Any term Qualsiasi All terms Tutti File name Nome file Completions Espansione Select an item: Seleziona una voce: Too many completions Troppe possibilita' di espansione Query language Linguaggio di interrogazione Bad query string Stringa di ricerca malformata Out of memory Memoria esaurita Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Enter file name wildcard expression. Enter search terms here. Type ESC SPC for completions of current term. Inserisci qui i termini di ricerca. Premi ESC Spazio per il completamento automatico dei termini. SSearchBase SSearchBase SSearchBase Clear Cancella Ctrl+S Ctrl+S Erase search entry Cancella voce di ricerca Search Cerca Start query Inizia ricerca Enter search terms here. Type ESC SPC for completions of current term. Inserisci qui i termini di ricerca. Premi ESC Spazio per il completamento automatico dei termini. Choose search type. SearchClauseW SearchClauseW SearchClauseW Any of these Qualsiasi parola All of these Tutte le parole None of these Nessuna di queste This phrase Questa frase Terms in proximity Parole in prossimita' File name matching Nome del file Select the type of query that will be performed with the words Seleziona il tipo di ricerca da effettuare con i termini indicati Number of additional words that may be interspersed with the chosen ones Numero di parole che possono frapporsi tra i termini di ricerca indicati No field Any All None Phrase Proximity File name Nome file SortForm Date Data Mime type Tipo MIME SortFormBase Sort Criteria Criterio di ordinamento Sort the Ordina i most relevant results by: risultati piu' rilevanti per: Descending Discendente Close Chiudi Apply Applica SpellBase Term Explorer Esplorazione dei termini &Expand &Espandi Alt+E Alt+E &Close &Chiudi Alt+C Alt+C Term Termine No db info. SpellW Wildcards Caratteri jolly Regexp Espressione regolare Spelling/Phonetic Ortografia/Fonetica Aspell init failed. Aspell not installed? Errore di inizializzazione aspell. Aspell e' installato? Aspell expansion error. Errore di espansione di Aspell. Stem expansion Espansione grammaticale error retrieving stemming languages Impossibile formare la lista di espansione per la lingua No expansion found Nessun epansione trovata Term Termine Doc. / Tot. Index: %1 documents, average length %2 terms UIPrefsDialog The selected directory does not appear to be a Xapian index La directory selezionata non sembra essera un indice Xapian This is the main/local index! Questo e' l'indice principale! The selected directory is already in the index list La directory selezionata e' gia' nella lista Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Seleziona la directory indice Xapian (es.: /home/ciccio/.recoll/xapiandb) error retrieving stemming languages Impossibile formare la lista delle lingue per l'espansione grammaticale Choose UIPrefsDialogBase User interface Interfaccia utente Number of entries in a result page Numero di risultati per pagina Result list font Fonts per la lista dei risultati Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Apre una finestra di dialogo per selezionare i fonts della lista dei risultati Reset Ripristina Resets the result list font to the system default Ripristina i font della lista dei risultati Auto-start simple search on whitespace entry. Inizia automaticamente una ricerca semplice digitando uno spazio. Start with advanced search dialog open. Inizia aprendo la finestra di ricerca avanzata. Start with sort dialog open. Inizia con la finestra di ordinamento aperta. Search parameters Parametri per la ricerca Stemming language Linguaggio per l'espansione Dynamically build abstracts Costruisci dinamicamente i riassunti Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Devo cercare di costruire i riassunti per le voci nell'elenco dei risultati usando il contesto dei termini di ricerca? Puo' essere lento per grossi documenti.. Replace abstracts from documents Sostituisci i riassunti dei documenti Do we synthetize an abstract even if the document seemed to have one? Devo sintetizzare un riassunto anche se il documento sembra ne abbia uno? Synthetic abstract size (characters) Numero caratteri per il riassunto Synthetic abstract context words Numero di parole di contesto per il riassunto External Indexes Indici esterni Add index Aggiungi indice Select the xapiandb directory for the index you want to add, then click Add Index Seleziona nella directory Xapiandb l'indice che vuoi aggiungere e clicca su 'Aggiungi indice' Browse Esplora &OK &OK Apply changes Applica modifiche &Cancel &Annulla Discard changes Annulla modifiche Result paragraph<br>format string Stringa di formattazione<br>dei risultati Automatically add phrase to simple searches Aggiungi automaticamente frase alle ricerche semplici A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Una ricerca per [vino rosso] (2 parole) sara' completata come [vino O rosso O (vino FRASE 2 rosso)]. Questo dovrebbe dare la precedenza ai risultati che contengono i termini esattamente come sono stati scritti. User preferences Preferenze utente Use desktop preferences to choose document editor. Usa le preferenze del desktop per scegliere l'editor dei documenti. External indexes Indici esterni Toggle selected Commuta selezionati Activate All Seleziona tutti Deactivate All Deseleziona tutti Remove selected Rimuovi selezionati Remove from list. This has no effect on the disk index. Rimuovi dalla lista. Non ha effetto sull'indice del disco. Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Definisce il formato per ogni paragrafo dell'elenco dei risultati. Usare il formato qt html e le sostituzioni tipo printf:<br>%A Riassunto<br> %D Data<br> %I Icona<br> %K Parole chiave (se esistono)<br> %L Link per anteprima e modifica<br> %M Tipo MIME<br> %N Numero del risultato<br> %R Percentuale di rilevanza<br> %S Informazioni sulla dimensione<br> %T Titolo<br> %U Url<br> Remember sort activation state. Ricorda lo stato dell'impostazione di ordinamento. Maximum text size highlighted for preview (megabytes) Dimensione massima del testo da evidenziare nell'anteprima (megabytes) Texts over this size will not be highlighted in preview (too slow). Testi di lunghezza superiore a questa non vengono evidenziati nella preview (troppo lento). ViewAction Changing actions with different current values Modifica di azioni con valori differenti da quelli attuali Mime type Tipo MIME Command MIME type ViewActionBase File type Tipo di file Action Azione Select one or several file types, then click Change Action to modify the program used to open them Seleziona uno o piu' tipi di file e poi clicca su 'Cambia Azione' per modificare il programma usato per aprirli Change Action Cambia Azione Close Chiudi Native Viewers Applicazione di visualizzazione Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. confgui::ConfBeaglePanelW Steal Beagle indexing queue Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Entries will be recycled once the size is reached Web page store directory name The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Max. size for the web store (MB) confgui::ConfIndexW Can't write configuration file Impossibile scrivere il file di configurazione confgui::ConfParamFNW Browse Esplora Choose confgui::ConfParamSLW + + - - confgui::ConfSubPanelW Global Globale Max. compressed file size (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Max. text file size (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Text file page size (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Max. filter exec. time (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. confgui::ConfTopPanelW Top directories Cartella superiore The list of directories where recursive indexing starts. Default: your home. Lista delle cartelle in cui inizia lìindicizzazione recorsiva. Di default è la tua home. Skipped paths Indirizzi saltati These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Questi sono i nomi delle cartelle in cui l'indicizzazione non entra<br>Possono contenere caratteri speciali. Devono corrispondere agli indirizzi visti dal motore di indicizzazione (ad esempio, se la cartella superiore include '/home/io' e '/home' è in realtà un link a '/usr/home', l'indirizzo corretto che si vuole sltare dovrebbe essere '/home/me/tmp*' e non ì/home/usr/tmp*') Stemming languages Lingue per la radice The languages for which stemming expansion<br>dictionaries will be built. Lingue per le quali verrà costruito<br>il dizionario delle espansioni radicali. Log file name Nome del file di log The file where the messages will be written.<br>Use 'stderr' for terminal output Il file dove verranno scritti i messaggi.<br>Usa 'stderr' per il terminale Log verbosity level Livello di verbosità del log This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Questo valore regola il numero dei messaggi,>br>dai soli errori a mole indicazioni per il debug. Index flush megabytes interval Intervallo in megabite per il salvataggio intermedio dell'indice This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Questo valore regola il volume di dati da indicizzare tra un salvataggio e l'altro.<br>Aiuta a controllare l'uso della memoria. Di default è post uguale a 10Mb Max disk occupation (%) Massima occupazione del disco fisso (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Questa è la percentuale fi occupazione del disco fisso oltre la quale l'indicizzazione si ferma con un errore (per evitare di riempire il disco).<br>0 significa nessun limite (questo è il valore di default). No aspell usage Non usare aspell Aspell language Lingua di aspell The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Lingua per il dizionario aspell. Dovrebbe essere simile a 'en' o 'it' ...<br>Se questo valore non è impostato verrà usato l'ambiente NLS per calcolarlo, cosa che generalmente funziona. Per avere un'idea di cosa sia installato sul tuo sistema, dai il comando 'aspell config' e guarda il nome dei files .dat nella cartella 'data-dir'. Database directory name Nome della cartella del database The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Nome della cartella in cui salvare l'indice<br>Un indirizzo non assoluto viene interpretato come relativo alla cartella di congigurazione. Di default è 'xapiandb'. Use system's 'file' command Usa il comando di sistema 'file' Use the system's 'file' command if internal<br>mime type identification fails. Usa il comando di sistema 'file' se fallisce<br>l'identificazione interna del tipo mime. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. uiPrefsDialogBase User preferences Preferenze utente User interface Interfaccia utente Number of entries in a result page Numero di risultati per pagina If checked, results with the same content under different names will only be shown once. Hide duplicate results. Highlight color for query terms Result list font Fonts per la lista dei risultati Opens a dialog to select the result list font Apre una finestra di dialogo per selezionare i fonts della lista dei risultati Helvetica-10 Helvetica-10 Resets the result list font to the system default Ripristina i font della lista dei risultati Reset Ripristina Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Definisce il formato per ogni paragrafo dell'elenco dei risultati. Usare il formato qt html e le sostituzioni tipo printf:<br>%A Riassunto<br> %D Data<br> %I Icona<br> %K Parole chiave (se esistono)<br> %L Link per anteprima e modifica<br> %M Tipo MIME<br> %N Numero del risultato<br> %R Percentuale di rilevanza<br> %S Informazioni sulla dimensione<br> %T Titolo<br> %U Url<br> Result paragraph<br>format string Stringa di formattazione<br>dei risultati Texts over this size will not be highlighted in preview (too slow). Testi di lunghezza superiore a questa non vengono evidenziati nella preview (troppo lento). Maximum text size highlighted for preview (megabytes) Dimensione massima del testo da evidenziare nell'anteprima (megabytes) Use desktop preferences to choose document editor. Usa le preferenze del desktop per scegliere l'editor dei documenti. Choose editor applications Display category filter as toolbar instead of button panel (needs restart). Auto-start simple search on whitespace entry. Inizia automaticamente una ricerca semplice digitando uno spazio. Start with advanced search dialog open. Inizia aprendo la finestra di ricerca avanzata. Start with sort dialog open. Inizia con la finestra di ordinamento aperta. Remember sort activation state. Ricorda lo stato dell'impostazione di ordinamento. Prefer Html to plain text for preview. Search parameters Parametri per la ricerca Stemming language Linguaggio per l'espansione A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Una ricerca per [vino rosso] (2 parole) sara' completata come [vino O rosso O (vino FRASE 2 rosso)]. Questo dovrebbe dare la precedenza ai risultati che contengono i termini esattamente come sono stati scritti. Automatically add phrase to simple searches Aggiungi automaticamente frase alle ricerche semplici Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Devo cercare di costruire i riassunti per le voci nell'elenco dei risultati usando il contesto dei termini di ricerca? Puo' essere lento per grossi documenti.. Dynamically build abstracts Costruisci dinamicamente i riassunti Do we synthetize an abstract even if the document seemed to have one? Devo sintetizzare un riassunto anche se il documento sembra ne abbia uno? Replace abstracts from documents Sostituisci i riassunti dei documenti Synthetic abstract size (characters) Numero caratteri per il riassunto Synthetic abstract context words Numero di parole di contesto per il riassunto The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Query language magic file name suffixes. Enable External Indexes Indici esterni Toggle selected Commuta selezionati Activate All Seleziona tutti Deactivate All Deseleziona tutti Remove from list. This has no effect on the disk index. Rimuovi dalla lista. Non ha effetto sull'indice del disco. Remove selected Rimuovi selezionati Click to add another index directory to the list Add index Aggiungi indice Apply changes Applica modifiche &OK &OK Discard changes Annulla modifiche &Cancel &Annulla Abstract snippet separator Style sheet Opens a dialog to select the style sheet file Choose Resets the style sheet to default Lines in PRE text are not folded. Using BR loses some indentation. Use <PRE> tags instead of <BR>to display plain text as html in preview. Result List Edit result paragraph format string Edit result page html header insert Date format (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Autophrase term frequency threshold percentage recoll-1.17.3/qtgui/i18n/recoll_lt.ts000644 001750 000000 00000275064 11757435273 017757 0ustar00dockeswheel000000 000000 AdvSearch All clauses Visos sÄ…lygos Any clause Bet kuri sÄ…lyga texts tekstai spreadsheets skaiÄiuoklÄ—s presentations prezentacijos media media messages žinutÄ—s other kita Bad multiplier suffix in size filter AdvSearchBase Advanced search IÅ¡samesnÄ— paieÅ¡ka Search for <br>documents<br>satisfying: IeÅ¡koti <br>dokumentų<br>tenkinanÄių: Delete clause IÅ¡trinti sÄ…lygÄ… Add clause PridÄ—ti sÄ…lygÄ… Restrict file types Apriboti bylų tipus Check this to enable filtering on file types PažymÄ—ti, jei norite filtruoti pagal bylų tipus By categories Pagal kategorijas Check this to use file categories instead of raw mime types PažymÄ—ti, jei norite naudoti bylų kategorijas vietoje mime tipų Save as default IÅ¡saugoti kaip numatytÄ…jį Searched file types IeÅ¡kota bylų tipų All ----> Visi ----> Sel -----> Pas -----> <----- Sel <----- Pas <----- All <----- Visi Ignored file types Ignoruoti bylų tipai Enter top directory for search Ä®raÅ¡ykite virÅ¡utinio lygio direktorijÄ… paieÅ¡kai Browse NarÅ¡yti Restrict results to files in subtree: Pateikti rezultatus byloms submedyje: Start Search PradÄ—ti paieÅ¡kÄ… Close Uždaryti All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Visi kairÄ—je esantys netuÅ¡ti laukai bus sujungiami AND (visi) arba OR (bet kuris) pagalba. <br> "Bet kuris" "Visi" ir "Nei vienas" laukų tipai gali priimti paprastų žodžių miÅ¡inį ir frazes pažymÄ—tas dvigubomis kabutÄ—mis. <br> TuÅ¡ti laukeliai ignoruojami. Invert Minimum size. You can use k/K,m/M,g/G as multipliers Min. Size Maximum size. You can use k/K,m/M,g/G as multipliers Max. Size Filter From To Check this to enable filtering on dates Filter dates Find Check this to enable filtering on sizes Filter sizes CronToolW Cron Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Hours (* or 0-23) Minutes (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> Enable Disable It seems that manually edited entries exist for recollindex, cannot edit crontab Error installing cron entry. Bad syntax in fields ? EditDialog Dialog FirstIdxDialog First indexing setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> Indexing configuration This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Indexing schedule This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Start indexing now IdxSchedW Index scheduling setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> Cron scheduling The tool will let you decide at what time indexing should run and will install a crontab entry. Real time indexing start up Decide if real time indexing will be started when you log in (only for the default index). ListDialog Dialog GroupBox Main Configuration problem (dynconf Nustatymų bÄ—da (dynconf No db directory in configuration Nustatymuose nerandama duomenų bazÄ—s bylos Could not open database in Nepavyko atidaryti duomenų bazÄ—s "history" file is damaged or un(read)writeable, please check or remove it: Preview Close Tab Uždarykite auselÄ™ Cannot create temporary directory Nepavyksta sukurti laikinos direktorijos Cancel AtÅ¡aukti Missing helper program: TrÅ«ksta pagalbinÄ—s programos: Can't turn doc into internal representation for Nepavyksta pervesti dokumento į vidinÄ™ busenÄ… Creating preview text Kuriamas peržvalgos tekstas Loading preview text into editor Ä®keliamas į redaktorių peržvalgos tekstas &Search for: &IeÅ¡koti: &Next &Sekantis &Previous &Ankstesnis Clear IÅ¡valyti Match &Case Atitaikyti &Atvejį Cannot create temporary directory: Error while loading file PreviewTextEdit Show fields Rodyti laukus Show main text Rodyti pagrindinį tekstÄ… Print Spausdinti Print Current Preview Spausdinti kaip matoma peržiÅ«roje Show image Select All Copy Save document to file Fold lines Preserve indentation QObject Global parameters GlobalÅ«s parametrai Local parameters LokalÅ«s parametrai <b>Customised subtrees <b>Pritaikyti direktorijų<br> submedžiai The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. Subdirektorijų, kuriose dalį parametrų reikia pakeisti, sÄ…raÅ¡as.<br> Numatytoji reikÅ¡mÄ—: tuÅ¡Äia. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Nurodyti parametrai taikomi arba visoms direktorijoms, arba subdirektorijoms,<br> jei kuri jų prieÅ¡ tai pažymimos. PridÄ—ti ir iÅ¡trinti direktorijų vardus galite<br> spausdami +/- mygtukus. Skipped names Neįtraukti vardai These are patterns for file or directory names which should not be indexed. Bylų arba direktorijų, kurių nedera indeksuoti, vardų Å¡ablonai. Default character set Numatytoji simbolių aibÄ— This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Pasirinkta simbolių aibÄ— bus naudojama skaityti bylų, kurių simbolių aibÄ—s nepavyksta nustatyti, turiniui.<br>Numatytoji vertÄ— yra nepasirinkti konkreÄios simbolių aibÄ—s - tokiu atveju naudojama NLS aplinkos vertÄ—. Follow symbolic links Sekti simbolines nuorodas Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Indeksavimo metu sekti simbolines nuorodas. Numatytasis elgesys yra nesekti, bandant iÅ¡vengti dvigubo indeksavimo Index all file names Indeksuoti visų bylų vardus Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Indeksuoti bylų, kurių turinio nepavyksta perskaityti, vardus. Numatytoji reikÅ¡mÄ—: teisybÄ— Beagle web history Beagle tinklo istorija RTIToolW Real time indexing automatic start <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Also start indexing daemon right now. Replacing: Replacing file Can't create: Warning Ä®spÄ—jimas Could not execute recollindex Deleting: Deleting file Removing autostart Autostart file deleted. Kill current process too ? RclMain (no stemming) (no stemming) (all languages) (visos kalbos) error retrieving stemming languages error retrieving stemming languages Indexing in progress: Indeksuojama: Files Failai Purge IÅ¡valyti Stemdb Stemdb Closing Uždaroma Unknown Nežinoma Can't start query: Nepavyksta pradÄ—ti vykdyti užklausÄ…: Query results Užklausos rezultatai Cannot retrieve document info from database Nepavyksta iÅ¡gauti iÅ¡ duomenų bazÄ—s informacijos apie dokumentÄ… Warning Ä®spÄ—jimas Can't create preview window Nepavyksta sukurti peržiÅ«ros lango This search is not active any more Å i paieÅ¡ka daugiau nevykdoma Bad viewer command line for %1: [%2] Please check the mimeconf file Netinkamos peržiÅ«ros komandinÄ— eilutÄ— %1: [%2] PraÅ¡ome patikrinti mimeconf bylÄ… Cannot extract document or create temporary file Nepavyksta perskaityti dokumento arba sukurti laikinos bylos Executing: [ Vykdoma: [ About Recoll Apie Recoll History data Istorijos duomenys Document history Dokumentų istorija Update &Index Atnaujinti &IndeksÄ… Indexing interrupted indeksavimas pertrauktas Stop &Indexing Sustabdyti &IndeksavimÄ… All Visi media media message praneÅ¡imas other kita presentation prezentacijos spreadsheet skaiÄiuoklÄ—s text tekstas sorted surūšiuota filtered filtruotas External applications/commands needed and not found for indexing your file types: Reikalingos pilnam indeksavimui, taÄiau nerandamos iÅ¡orinÄ—s programos/komandos: No helpers found missing Randamos visos reikalingos pagalbinÄ—s programos Missing helper programs TrÅ«ksta pagalbinių programų Save file dialog IÅ¡saugoti failÄ… forma Choose a file name to save under Pasirinkite bylos vardÄ…, kuriuo iÅ¡saugosite bylÄ… Document category filter Dokumentų kategorijų filtras No external viewer configured for mime type [ Nustatymuose nenumatyta jokia iÅ¡orinÄ— peržiÅ«ros programa Å¡iam mime tipui [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Nurodyta peržiÅ«ros programa Å¡iam mime tipui %1: %2 nerandama. Ar norÄ—tumete iššaukti nustatymų langÄ…? Can't access file: Can't uncompress file: Save file Result count (est.) Query details Užklausos detalÄ—s Could not open external index. Db not open. Check external indexes list. No results found None Updating Done Monitor Indexing failed The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Erasing index Reset the index and start from scratch ? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Error Index not open Index query error Content has been indexed for these mime types: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Can't update index: indexer running Indexed MIME Types RclMainBase Recoll Recoll Search tools PaieÅ¡kos įrankiai Result list Rezultatų sÄ…raÅ¡as &File &Byla &Tools &Ä®rankiai &Preferences &Nustatymai &Help &Pagalba E&xit I&Å¡eiti Ctrl+Q Ctrl+Q Update &index Atnaujinti &IndeksÄ… &Erase document history &IÅ¡trinti dokumentų istorijÄ… &About Recoll &Apie Recoll &User manual &Vartotojo vadovas Document &History Dokumentų &Istorija Document History Dokumentų Istorija &Advanced Search &IÅ¡samesnÄ— PaieÅ¡ka Advanced/complex Search IÅ¡samesnÄ— PaieÅ¡ka &Sort parameters &Surūšiuoti parametrai Sort parameters Surūšiuoti parametrus Term &explorer Raktinių žodžių &tyrinÄ—tojas Term explorer tool Raktinių žodžių tyrinÄ—jimo įrankis Next page Sekantis puslapis Next page of results Sekantis rezultatų puslapis First page Pirmas puslapis Go to first page of results Pereiti į pirmÄ… rezultatų puslapį Previous page PrieÅ¡ tai buvÄ™s puslapis Previous page of results Ankstesnis rezultatų puslapis &Query configuration &Užklausų nustatymai External index dialog IÅ¡orinių indeksų langas &Indexing configuration &Indeksavimo nustatymai All Visi &Show missing helpers &TrÅ«kstamos pagalbinÄ—s programos PgDown PgUp &Full Screen F11 Full Screen &Erase search history sortByDateAsc Sort by dates from oldest to newest sortByDateDesc Sort by dates from newest to oldest Show Query Details Show results as table &Rebuild index &Show indexed types Shift+PgUp &Indexing schedule E&xternal index dialog RecollModel File name Bylos vardas Mime type Mime tipas Date Data Abstract Author Document size Document date File size File date Keywords Original character set Relevancy rating Title URL Mtime Date and time Ipath MIME type ResList Result list Rezultatų sÄ…raÅ¡as (show query) (rodyti užklausÄ…) &Preview &PeržiÅ«ra Copy &File Name Kopijuoti &Bylos vardÄ… Copy &URL Kopijuoti &URL Find &similar documents Rasti &panaÅ¡ius dokumentus Query details Užklausos detalÄ—s filtered iÅ¡filtruota sorted surūšiuota Document history Dokumentų istorija <p><b>No results found</b><br> <p><b>Nerasta rezultatų</b><br> Previous Ankstesnis Next Kitas Unavailable document Neprieinamas dokumentas Preview PeržiÅ«ra Open Atidaryti <p><i>Alternate spellings (accents suppressed): </i> <p><i>Kiti galimi tarimai (be akcentų): </i> &Write to File &Ä®raÅ¡yti į bylÄ… Preview P&arent document/folder PeržiÅ«rÄ—ti &AukÅ¡tesnio lygio dokumentus/direktorijas &Open Parent document/folder Atidaryti &AukÅ¡tesnio lygio dokumentus/direktorijas Documents Dokumentai out of at least iÅ¡ bent for &Open ResTable &Reset sort &Delete column Save table to CSV file Can't open/create file: &Preview &PeržiÅ«ra &Open Copy &File Name Kopijuoti &Bylos vardÄ… Copy &URL Kopijuoti &URL &Write to File &Ä®raÅ¡yti į bylÄ… Find &similar documents Rasti &panaÅ¡ius dokumentus Preview P&arent document/folder PeržiÅ«rÄ—ti &AukÅ¡tesnio lygio dokumentus/direktorijas &Open Parent document/folder Atidaryti &AukÅ¡tesnio lygio dokumentus/direktorijas &Save as CSV Add "%1" column ResTableDetailArea &Preview &PeržiÅ«ra &Open Copy &File Name Kopijuoti &Bylos vardÄ… Copy &URL Kopijuoti &URL &Write to File &Ä®raÅ¡yti į bylÄ… Find &similar documents Rasti &panaÅ¡ius dokumentus Preview P&arent document/folder PeržiÅ«rÄ—ti &AukÅ¡tesnio lygio dokumentus/direktorijas &Open Parent document/folder Atidaryti &AukÅ¡tesnio lygio dokumentus/direktorijas SSearch Any term Bet kuris raktinis žodis All terms Visi raktiniai žodžiai File name Bylos vardas Query language Užklausų kalba Bad query string Netinkamai pateikta užklausa Out of memory Nepakanka atminties Too many completions Per daug galimų užbaigimų Completions Užbaigimai Select an item: Pasirinkti įrašą: Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Enter file name wildcard expression. Enter search terms here. Type ESC SPC for completions of current term. ÄŒia įveskite paieÅ¡kos raktinius žodžius. Ä®raÅ¡ykite ESC SPC raÅ¡omo termino užbaigimui. SSearchBase SSearchBase SSearchBase Clear IÅ¡valyti Ctrl+S Ctrl+S Erase search entry IÅ¡trinti paieÅ¡kos įrašą Search IeÅ¡koti Start query PradÄ—ti užklausÄ… Enter search terms here. Type ESC SPC for completions of current term. ÄŒia įveskite paieÅ¡kos raktinius žodžius. Ä®raÅ¡ykite ESC SPC raÅ¡omo termino užbaigimui. Choose search type. Pasirinkite paieÅ¡kos tipÄ…. SearchClauseW SearchClauseW SearchClauseW Any of these Bet kuris Å¡ių All of these Visi Å¡ie None of these Nei vienas Å¡ių This phrase Å i frazÄ— Terms in proximity Artimi raktiniai žodžiai File name matching Bylos vardÄ… atitinka Select the type of query that will be performed with the words Pasirinkite užklausos tipÄ… atliekamÄ… su žodžiais Number of additional words that may be interspersed with the chosen ones Papildomų žodžių skaiÄius kurie gali interspersed with the chosen ones No field Any All Visi None Phrase Proximity File name Bylos vardas SortForm Date Data Mime type Mime tipas SortFormBase Sort Criteria Rūšiavimo kriterijus Sort the Rūšiuoti most relevant results by: tinkamiausi rezultatai pagal: Descending Mažėjimo tvarka Apply Pritaikyti Close Uždaryti SpellBase Term Explorer Raktinių žodžių tyrinÄ—jimas &Expand &IÅ¡plÄ—sti Alt+E Alt+E &Close &Uždaryti Alt+C Alt+C Term Raktinis žodis No db info. SpellW Wildcards Wildcards Regexp Regexp Stem expansion Stem expansion Spelling/Phonetic Tarimas/Fonetika error retrieving stemming languages error retrieving stemming languages Aspell init failed. Aspell not installed? Aspell iššaukimas nepavyko. Aspell programa neįdiegta? Aspell expansion error. Aspell praplÄ—timų klaida. No expansion found Nerasta praplÄ—timų Term Raktinis žodis Doc. / Tot. Index: %1 documents, average length %2 terms UIPrefsDialog error retrieving stemming languages error retrieving stemming languages The selected directory does not appear to be a Xapian index Atrodo, jog pasirinkta direktorija nÄ—ra Xapian indekso direktorija This is the main/local index! Pagrindinis/localus indekas! The selected directory is already in the index list Pasirinkta direktorija jau yra indekso sÄ…raÅ¡e Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Pasirinkite Xapian indekso direktorijÄ… (pav: /home/buddy/.recoll/xapiandb) Choose NarÅ¡yti UIPrefsDialogBase User preferences Vartotojo nustatymai User interface Vartotoja aplinka Number of entries in a result page Ä®rašų skaiÄius rezultatų puslapyje Result list font Rezultatų sÄ…raÅ¡o Å¡riftas Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Pasirinkite rezultatų sÄ…raÅ¡o Å¡riftÄ… Reset Gražinti numatytÄ…jÄ… formÄ… Resets the result list font to the system default Gražina numatytÄ…jÄ… rezultatų sÄ…raÅ¡o srifto vertÄ™ Result paragraph<br>format string Rezultatų paragrafo<br>formatas Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> ApibÅ«dina kiekvieno rezultatų įraÅ¡o formatÄ…:<br>%A Santrauka<br> %D Data<br> %I Ikona<br> %K Raktiniai žodžiai (jei yra)<br> %L PeržiÅ«ros ir Redagavimo nuorodos<br> %M Mime tipai<br> %N Rezultų skaiÄius<br> %R Tinkamumas procentais<br> %S Informacija apie dydį<br> %T Pavadinimas<br> %U Url<br> Texts over this size will not be highlighted in preview (too slow). Tekstai virÅ¡ijantys šį dydį nebus nuspalvinami peržiÅ«ros metu (per didelÄ— apkrova). Maximum text size highlighted for preview (megabytes) Didžiausia teksto, pažymÄ—to peržiÅ«rai, apimtis (megabaitai) Auto-start simple search on whitespace entry. PradÄ—ti paprastÄ…jÄ… paieÅ¡kÄ… įvedus tuÅ¡Äio tarpelio simoblį. Start with advanced search dialog open. PradÄ—ti nuo iÅ¡samesnÄ—s paieÅ¡kos lango. Start with sort dialog open. PradÄ—ti su atidarytu rūšiavimo langu. Use desktop preferences to choose document editor. Naudoti darbalaukio nustatymus parenkant dokumentų redaktorių. Remember sort activation state. Ä®siminti rūšiavimo pasirinkimus (nedings perkrovus). Search parameters PaieÅ¡kos parametrai Stemming language Stemming kalba Automatically add phrase to simple searches PridÄ—ti prie paprastos paieÅ¡kos frazÄ™ A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. PaieÅ¡ka bus pakeista (pav. rolling stones -> rolling or stones or (rolling phrase 2 stones)). Teikiama aiÅ¡ki pirmenybÄ— rezultatams kuriuose rasti raktiniai žodžiai atitinka įvestus. Dynamically build abstracts DinamiÅ¡kai sukurti santraukas Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Ar pabandome sukurti santraukas remdamiesi užklausų raktinių žodžių kontekstu? DidelÄ—s apimties dokumentams gali lÄ—tai veikti. Replace abstracts from documents Pakeisti dokumentuose randamas santraukas Do we synthetize an abstract even if the document seemed to have one? Ar sukuriame dirbtinÄ™ santraukÄ…, jei dokumente jau ji yra? Synthetic abstract size (characters) DirbtinÄ—s santraukos dydis (simbolių skaiÄius) Synthetic abstract context words DirbtinÄ—s santraukos konteksto žodžiai External Indexes IÅ¡oriniai indeksai External indexes IÅ¡oriniai indeksai Toggle selected Ä®jungti/IÅ¡jungti pasirinktÄ… Activate All Visus aktyvuoti Deactivate All Visus deaktyvuoti Remove selected PažymÄ—tus paÅ¡alinti Remove from list. This has no effect on the disk index. PaÅ¡alinti iÅ¡ sÄ…raÅ¡o. Neturi jokio poveikio indeksui diske. Add index PridÄ—ti indeksÄ… Select the xapiandb directory for the index you want to add, then click Add Index Pasirinkti xapiandb direktorijÄ… kurios indekÄ… norite pridÄ—ti, tada paspauskite PridÄ—ti IndeksÄ… Browse NarÅ¡yti &OK &Gerai Apply changes Pritaikyti pakeitimus &Cancel &AtÅ¡aukti Discard changes Panaikinti pakeitimus Highlight color for query terms Užklausų raktinių žodžių žymÄ—jimo spalvos Prefer Html to plain text for preview. PirmenybÄ™ teikti Html formatui peržiÅ«ros metu. If checked, results with the same content under different names will only be shown once. PažymÄ—jus, bus rodoma tik viena iÅ¡ bylų su tuo paÄiu turiniu, taÄiau skirtingais vardais. Hide duplicate results. SlÄ—pti pasikartojanÄius rezultatus. Choose editor applications Pasirinkite redaktorių programas Display category filter as toolbar instead of button panel (needs restart). Kategorijų filtrÄ… rodyti kaip įrankų juostÄ… (reikalauja perkrovimo). ViewAction Changing actions with different current values Pakeisti veiksmus su skirtingomis dabartinÄ—mis vertÄ—mis Mime type Mime tipas Command MIME type ViewActionBase Native Viewers Sistemos peržiÅ«ros programos Select one or several file types, then click Change Action to modify the program used to open them Pasirinkite vienÄ… ar kelis bylų tipus, tada paspauskite Keisti Veiksmus norÄ—dami keisti kaip programa juos atidaro File type Bylos tipas Action Veiksmas Change Action Pakeisti veiksmÄ… Close Uždaryti Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. Pasirinkite vienÄ… ar kelis mime tipus tada spauskite "Keisti Veiksmus"<br>Taip pat galite uždaryti šį langÄ… ir patikrinti "Naudoti darbalaukio nustatymus"<br>pagrindinÄ—je panelÄ—je? norÄ—dami ignoruoti šį sÄ…rašą ir naudoti numatytasias darbalaukio. confgui::ConfBeaglePanelW Steal Beagle indexing queue Ä®traukti Beagle paruoÅ¡tus duomenis Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) BEAGLE programa TURI neveikti. Ä®galina peržiÅ«rÄ—ti beagle paruoÅ¡tÄ… medžiagÄ… bandant indeksuoti Firefox narÅ¡ymo<br> istorijÄ… (papildomai reikia įdiegti Firefox Beagle priedÄ…) Web cache directory name NarÅ¡ymo tinkle cache direktorijos vardas The name for a directory where to store the cache for visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Direktorijos, kurioje saugoma lankytų tinklo svetainių cache, vardas.<br>Santykinis kelias prasideda nuo nustatymų direktorijos. Max. size for the web cache (MB) Didžiausias tinklo narÅ¡ymo cache dydis (MB) Entries will be recycled once the size is reached Ä®raÅ¡ai bus trinami pasiekus nurodytÄ… dydį Web page store directory name The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Max. size for the web store (MB) confgui::ConfIndexW Can't write configuration file Nepavyksta įraÅ¡yti nustatymų bylos confgui::ConfParamFNW Browse NarÅ¡yti Choose NarÅ¡yti confgui::ConfParamSLW + + - - confgui::ConfSubPanelW Global Globalus Max. compressed file size (KB) Didžiausias suspaustų bylų dydis (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. VirÅ¡ijus pasirinktÄ… suspaustų bylų dydį, jie nebus indeksuojami. Pasirinkite -1 jei nenorite nurodyti ribos, 0, jei nenorite, jog suspaustos bylos bÅ«tų indeksuojamos. Max. text file size (MB) Didžiausias tekstinÄ—s bylos dydis (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. VirÅ¡ijus pasirinktÄ… tekstinių bylų dydį, jie nebus indeksuojami. Pasirinkite -1 jei nenorite nurodyti ribos, 0, jei nenorite, jog suspaustos bylos bÅ«tų indeksuojamos. Text file page size (KB) TekstinÄ—s bylos dydis (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Jei vertÄ— nurodyta (nelgyi -1) tekstinÄ—s bylos bus suskaidytos į nurodyto dydžio bylas, kurios bus atskirai indeksuojamos. Naudinga atliekant paieÅ¡kÄ… labai dideliose tekstinÄ—se bylose (pav. log bylose). Max. filter exec. time (S) Ilgiausias filtrų veikimo laikas (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. IÅ¡orinių filtrų, dirbanÄių ilgiau nei numatyta, darbas bus nutraukiamas. Taikoma retiems atvejas (pav. postscript) kada dokumentas galÄ—tų priversti filtrÄ… kartoti veiksmus be galo ilgai. confgui::ConfTopPanelW Top directories AukÅ¡Äiausio lygmens direktorijos<br>kuriose vykdomas indeksavimas The list of directories where recursive indexing starts. Default: your home. Direktorijų, kuriose pradedamas rekursinis indeksavimas, sÄ…raÅ¡as. Numatytoji: namų direktorija. Skipped paths Direktorijų, kurių turinys nein-<br>deksuojamas, sÄ…raÅ¡as These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Direktorijų, kurių turinys nebus indeksuojamas, vardai.<br> Vardo dalis gali bÅ«ti wildcards. Turi atitikti programos matomus kelius iki direktorijų (pav. jei indeksuoti pradedama nuo '/home/me', o '/home' yra nuoroda į '/usr/home', teisinga vertÄ— bus '/home/me/tmp*', o ne '/usr/home/me/tm*') Stemming languages Kalbos naudojamos stemming<br> procesui The languages for which stemming expansion<br>dictionaries will be built. Kalbos, kurioms bus sukurti stemming <br>expansion žodynai. Log file name Log bylos vardas The file where the messages will be written.<br>Use 'stderr' for terminal output Byla, kurioje bus įraÅ¡omos žinutÄ—s.<br>Naudokite 'stderr' norÄ—dami iÅ¡vesti į terminalo langÄ… Log verbosity level Log iÅ¡samumo lygmuo This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. VertÄ— nustato žiniuÄių apimtį, nuo vien tik <br>klaidų fiksavimo iki didelÄ—s apimties duomenų skirtų debugging. Index flush megabytes interval Indekso dalių, įraÅ¡omų į diskÄ…, dydis (MB) This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB VertÄ— nustato duomenų, kurie indeksuojami tarp įraÅ¡ymo į diskÄ…, apimtį.<br>Padeda valdyti indeksavimo dalies atminties naudojimÄ…. Numatyta vertÄ— yra 10 MB Max disk occupation (%) Didžiausia disko atminties naudojimo dalis (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). VirÅ¡ijus (procentine iÅ¡raiÅ¡ka) disko atminties panaudojimÄ… indeksavimas bus sustabdytas (vengiant pilnai užpildyti diskÄ…).<br>0 reiÅ¡kia, jog ribos nÄ—ra (numatytoji vertÄ—). No aspell usage Aspell nebus naudojama Aspell language Aspell kalba The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Aspell žodyno kalba ('en', 'fr' ar kita).<br>Jei vertÄ— nenurodyta NLS aplinka pabandys nustatyti tinkamÄ… kalbÄ… (paprastai teisingai). NorÄ—dami sužinoti kas įraÅ¡yta JÅ«sų sistemoje įraÅ¡ykite 'aspell-config' ir žiÅ«rÄ—kite į dat bylas 'data-dir' direktorijoje. Database directory name Duomenų bazÄ—s direktorijos vardas The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Direktorijos, kurioje bus saugomas indeksas, vardas<br>Laikoma, jog santykinio keliio iki direktorijos pradžia yra nustatymų direktorija. Numatytoji yra 'xapiandb'. Use system's 'file' command Naudoti sistemos 'file' komandÄ… Use the system's 'file' command if internal<br>mime type identification fails. Jei nepavyks atpažinti mime tipo<br>naudoti sistemos 'file' komandÄ…. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Nurodo nenaudoti aspell programos kuriant tarimo aproksimacijas raktinių žodžių tyrinÄ—jimo įrankyje.<br>Naudinga, jei aspell neveikia arba neįdiegta. uiPrefsDialogBase User preferences Vartotojo nustatymai User interface Vartotoja aplinka Number of entries in a result page Ä®rašų skaiÄius rezultatų puslapyje If checked, results with the same content under different names will only be shown once. PažymÄ—jus, bus rodoma tik viena iÅ¡ bylų su tuo paÄiu turiniu, taÄiau skirtingais vardais. Hide duplicate results. SlÄ—pti pasikartojanÄius rezultatus. Highlight color for query terms Užklausų raktinių žodžių žymÄ—jimo spalvos Result list font Rezultatų sÄ…raÅ¡o Å¡riftas Opens a dialog to select the result list font Pasirinkite rezultatų sÄ…raÅ¡o Å¡riftÄ… Helvetica-10 Helvetica-10 Resets the result list font to the system default Gražina numatytÄ…jÄ… rezultatų sÄ…raÅ¡o srifto vertÄ™ Reset Gražinti numatytÄ…jÄ… formÄ… Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> ApibÅ«dina kiekvieno rezultatų įraÅ¡o formatÄ…:<br>%A Santrauka<br> %D Data<br> %I Ikona<br> %K Raktiniai žodžiai (jei yra)<br> %L PeržiÅ«ros ir Redagavimo nuorodos<br> %M Mime tipai<br> %N Rezultų skaiÄius<br> %R Tinkamumas procentais<br> %S Informacija apie dydį<br> %T Pavadinimas<br> %U Url<br> Result paragraph<br>format string Rezultatų paragrafo<br>formatas Texts over this size will not be highlighted in preview (too slow). Tekstai virÅ¡ijantys šį dydį nebus nuspalvinami peržiÅ«ros metu (per didelÄ— apkrova). Maximum text size highlighted for preview (megabytes) Didžiausia teksto, pažymÄ—to peržiÅ«rai, apimtis (megabaitai) Use desktop preferences to choose document editor. Naudoti darbalaukio nustatymus parenkant dokumentų redaktorių. Choose editor applications Pasirinkite redaktorių programas Display category filter as toolbar instead of button panel (needs restart). Kategorijų filtrÄ… rodyti kaip įrankų juostÄ… (reikalauja perkrovimo). Auto-start simple search on whitespace entry. PradÄ—ti paprastÄ…jÄ… paieÅ¡kÄ… įvedus tuÅ¡Äio tarpelio simoblį. Start with advanced search dialog open. PradÄ—ti nuo iÅ¡samesnÄ—s paieÅ¡kos lango. Start with sort dialog open. PradÄ—ti su atidarytu rūšiavimo langu. Remember sort activation state. Ä®siminti rūšiavimo pasirinkimus (nedings perkrovus). Prefer Html to plain text for preview. PirmenybÄ™ teikti Html formatui peržiÅ«ros metu. Search parameters PaieÅ¡kos parametrai Stemming language Stemming kalba A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. PaieÅ¡ka bus pakeista (pav. rolling stones -> rolling or stones or (rolling phrase 2 stones)). Teikiama aiÅ¡ki pirmenybÄ— rezultatams kuriuose rasti raktiniai žodžiai atitinka įvestus. Automatically add phrase to simple searches PridÄ—ti prie paprastos paieÅ¡kos frazÄ™ Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Ar pabandome sukurti santraukas remdamiesi užklausų raktinių žodžių kontekstu? DidelÄ—s apimties dokumentams gali lÄ—tai veikti. Dynamically build abstracts DinamiÅ¡kai sukurti santraukas Do we synthetize an abstract even if the document seemed to have one? Ar sukuriame dirbtinÄ™ santraukÄ…, jei dokumente jau ji yra? Replace abstracts from documents Pakeisti dokumentuose randamas santraukas Synthetic abstract size (characters) DirbtinÄ—s santraukos dydis (simbolių skaiÄius) Synthetic abstract context words DirbtinÄ—s santraukos konteksto žodžiai The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Query language magic file name suffixes. Enable External Indexes IÅ¡oriniai indeksai Toggle selected Ä®jungti/IÅ¡jungti pasirinktÄ… Activate All Visus aktyvuoti Deactivate All Visus deaktyvuoti Remove from list. This has no effect on the disk index. PaÅ¡alinti iÅ¡ sÄ…raÅ¡o. Neturi jokio poveikio indeksui diske. Remove selected PažymÄ—tus paÅ¡alinti Click to add another index directory to the list Add index PridÄ—ti indeksÄ… Apply changes Pritaikyti pakeitimus &OK &Gerai Discard changes Panaikinti pakeitimus &Cancel &AtÅ¡aukti Abstract snippet separator Style sheet Opens a dialog to select the style sheet file Choose NarÅ¡yti Resets the style sheet to default Lines in PRE text are not folded. Using BR loses some indentation. Use <PRE> tags instead of <BR>to display plain text as html in preview. Result List Edit result paragraph format string Edit result page html header insert Date format (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Autophrase term frequency threshold percentage recoll-1.17.3/qtgui/i18n/recoll_ru.ts000644 001750 000000 00000362171 11757435273 017762 0ustar00dockeswheel000000 000000 AdvSearch All clauses Ð’Ñе Ð¿Ð¾Ð»Ñ Any clause Любое поле texts текÑты spreadsheets таблицы presentations презентации media мультимедиа messages ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ other иное Bad multiplier suffix in size filter Ðеверный ÑÑƒÑ„Ñ„Ð¸ÐºÑ Ð¼Ð½Ð¾Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² фильтре размера AdvSearchBase Advanced search Сложный поиÑк Restrict file types Ограничить типы файлов Save as default Сохранить как умолчание Searched file types ИÑкомые All ----> Ð’Ñе ----> Sel -----> Эти ----> <----- Sel <----- Эти <----- All <----- Ð’Ñе Ignored file types Игнорируемые Enter top directory for search Введите каталог начала поиÑка Browse ПроÑмотр Restrict results to files in subtree: ИÑкать только в каталоге: Start Search Ðачать поиÑк Search for <br>documents<br>satisfying: ИÑкать <br>документы,<br>удовлетворÑющие: Delete clause Убрать поле Add clause Добавить поле Check this to enable filtering on file types Фильтровать по типам файлов By categories По категориÑм Check this to use file categories instead of raw mime types ИÑпользовать категории, а не типы MIME Close Закрыть All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Ð’Ñе непуÑтые Ð¿Ð¾Ð»Ñ Ñправа будут объединены логичеÑким И ("вÑе Ñлова") или ИЛИ ("любое Ñлово"). <br>ÐŸÐ¾Ð»Ñ Ñ‚Ð¸Ð¿Ð° "любые", "вÑе" или "без Ñтих" принимают набор проÑтых Ñлов и фразы, заключённые в двойные кавычки.<br>ПуÑтые Ð¿Ð¾Ð»Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€ÑƒÑŽÑ‚ÑÑ. Invert Обратить Minimum size. You can use k/K,m/M,g/G as multipliers Минимальный размер. Можно иÑпользовать k/K, m/M, g/G как множители Min. Size Мин. размер Maximum size. You can use k/K,m/M,g/G as multipliers МакÑ. размер. Можно иÑпользовать k/K, m/M, g/G как множители Max. Size МакÑ. размер Filter Фильтр From От To До Check this to enable filtering on dates Включить фильтрование по дате Filter dates Фильтрование по дате Find Ðайти Check this to enable filtering on sizes Включить фильтрование по размеру Filter sizes Фильтрование по размеру CronToolW Cron Dialog Диалог Cron <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">РаÑпиÑание пакетного индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ <span style=" font-weight:600;">Recoll</span> (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Каждое поле может Ñодержать шаблон (*), одно чиÑленное значение, ÑпиÑок через запÑтую (1,3,5) или диапазон (1-7). Эти Ð¿Ð¾Ð»Ñ Ð±ÑƒÐ´ÑƒÑ‚ иÑпользованы <span style=" font-style:italic;">как еÑть</span> в файле crontab, Ð´Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼ ÑинтакÑиÑом которого Ñм. crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Ðапример, ввод <span style=" font-family:'Courier New,courier';">*</span> Ð´Ð»Ñ <span style=" font-style:italic;">Дни</span>, <span style=" font-family:'Courier New,courier';">12,19</span> Ð´Ð»Ñ <span style=" font-style:italic;">ЧаÑÑ‹</span> и <span style=" font-family:'Courier New,courier';">15</span> Ð´Ð»Ñ <span style=" font-style:italic;">Минуты</span> запуÑтит recollindex ежедневно в 12:15 и 19:15.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">РаÑпиÑание Ñ Ð¾Ñ‡ÐµÐ½ÑŒ чаÑтыми запуÑками может оказатьÑÑ Ð¼ÐµÐ½ÐµÐµ Ñффективным, чем индекÑирование в реальном времени.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Дни недели (* или 0-7, 0 или 7 - воÑкреÑенье) Hours (* or 0-23) ЧаÑÑ‹ (* или 0-23) Minutes (0-59) Минуты (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ðажмите <span style=" font-style:italic;">Выключить</span> Ð´Ð»Ñ Ð¿Ñ€ÐµÐºÑ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой фоновой индекÑации, <span style=" font-style:italic;">Включить</span> Ð´Ð»Ñ ÐµÑ‘ запуÑка, <span style=" font-style:italic;">Отмена</span>, чтобы оÑтавить вÑÑ‘ как еÑть.</p></body></html> Enable Включить Disable Выключить It seems that manually edited entries exist for recollindex, cannot edit crontab Похоже, что Ð´Ð»Ñ recollindex еÑть вручную правленые запиÑи, не будем трогать crontab Error installing cron entry. Bad syntax in fields ? Ошибка уÑтановки запиÑи cron. Ðеверный ÑинтакÑÐ¸Ñ Ð¿Ð¾Ð»ÐµÐ¹? EditDialog Dialog Диалог FirstIdxDialog First indexing setup ÐаÑтройка первого индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Похоже, что Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ñтой конфигурации не ÑущеÑтвует.</span><br /><br />ЕÑли надо проиндекÑировать домашний каталог Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð¼ разумных умолчаний, нажмите кнопку <span style=" font-style:italic;">ЗапуÑтить индекÑирование</span>. ПодробноÑти можно будет уточнить позже. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ЕÑли требуетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ контролÑ, воÑпользуйтеÑÑŒ ÑÑылками Ð´Ð»Ñ ÑƒÑ‚Ð¾Ñ‡Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ и раÑпиÑÐ°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑированиÑ.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Этот инÑтрументарий доÑтупен в любое Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾ÑредÑтвом меню <span style=" font-style:italic;">ÐаÑтройки</span>.</p></body></html> Indexing configuration ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. ЗдеÑÑŒ можно уточнить, какие каталоги требуетÑÑ Ð¸Ð½Ð´ÐµÐºÑировать, какие пути или имена не требуетÑÑ, Ñ ÐºÐ°ÐºÐ¸Ð¼Ð¸ кодировками и Ñ‚.п. Indexing schedule РаÑпиÑание индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). ЗдеÑÑŒ можно выбрать режим индекÑированиеÑ: пакетный или реального времени, а также наÑтроить раÑпиÑание автоматичеÑкого индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ помощи cron. Start indexing now ЗапуÑтить индекÑирование IdxSchedW Index scheduling setup ÐаÑтройка раÑпиÑÐ°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ИндекÑирование <span style=" font-weight:600;">Recoll</span> может работать поÑтоÑнно, индекÑÐ¸Ñ€ÑƒÑ Ð¸Ð·Ð¼ÐµÐ½ÑющиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹, или запуÑкатьÑÑ Ñ‡ÐµÑ€ÐµÐ· промежутки времени. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Прочитайте подÑказку, чтобы решить, какой подход будет удобней (нажмите F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ЗдеÑÑŒ можно наÑтроить раÑпиÑание автоматичеÑких запуÑков пакетного индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ же Ñтарта индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² реальном времени при входе в ÑиÑтему (или вÑÑ‘ и Ñразу, что редко имеет ÑмыÑл). </p></body></html> Cron scheduling РаÑпиÑание cron The tool will let you decide at what time indexing should run and will install a crontab entry. ЗдеÑÑŒ можно выбрать, в какое Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑкать индекÑирование, и уÑтановить запиÑÑŒ crontab. Real time indexing start up ЗапуÑк индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² реальном времени Decide if real time indexing will be started when you log in (only for the default index). Решите, нужно ли начинать индекÑирование в реальном времени при входе в ÑиÑтему (только Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа по умолчанию). ListDialog Dialog Диалог GroupBox ? GroupBox Main No db directory in configuration Ðет каталога БД в конфигурации Could not open database in Ðевозможно открыть БД в . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. . Ðажмите "Отменить", еÑли хотите иÑправить файл конфигурации до начала индекÑированиÑ, или "OK" Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ. Configuration problem (dynconf Проблема конфигурации (dynconf "history" file is damaged or un(read)writeable, please check or remove it: Файл иÑтории ("history") повреждён или не читаетÑÑ/не запиÑываетÑÑ, проверьте или удалите его: Preview &Search for: &ИÑкать: &Next &Дальше &Previous &Предыдущее Match &Case &Соблюдать региÑтр Clear ОчиÑтить Creating preview text Создаю текÑÑ‚ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Loading preview text into editor Загружаю текÑÑ‚ в редактор Cannot create temporary directory Ðевозможно Ñоздать временный каталог Cancel Отмена Close Tab Закрыть вкладку Missing helper program: ОтÑутÑтвует вÑÐ¿Ð¾Ð¼Ð¾Ð³Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð°: Can't turn doc into internal representation for Ðевозможно Ñконвертировать документ во внутреннее предÑтавление Cannot create temporary directory: Ðевозможно Ñоздать временный каталог: Error while loading file Ошибка загрузки файла PreviewTextEdit Show fields Показать Ð¿Ð¾Ð»Ñ Show main text Показать оÑновной текÑÑ‚ Print Печать Print Current Preview Печать текущего окна предпроÑмотра Show image Показать изображение Select All Выделить вÑÑ‘ Copy Копировать Save document to file Сохранить документ в файл Fold lines ПереноÑить Ñтроки Preserve indentation СохранÑть отÑтупы QObject Global parameters Общие параметры Local parameters ЧаÑтные параметры <b>Customised subtrees <b>Каталоги Ñ Ð¾ÑобенноÑÑ‚Ñми The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. СпиÑок подкаталогов в индекÑируемой иерархии,<br>где некоторые параметры нуждаютÑÑ Ð² коррекции. Обычно пуÑÑ‚. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Следующие параметры уÑтанавливаютÑÑ Ð½Ð° верхнем уровне, еÑли выбрать<br>ничего или пуÑтую Ñтроку, или Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ подкаталога.<br>Ð’Ñ‹ можете добавлÑть и удалÑть каталоги кнопками +/-. Skipped names ПропуÑкаемые имена These are patterns for file or directory names which should not be indexed. Шаблоны имён файлов или каталогов, которые не Ñледует индекÑировать. Default character set Кодировка по умолчанию This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Эта кодировка будет иÑпользована при чтении файлов, в которых Ñ‚Ð°ÐºÐ¾Ð²Ð°Ñ Ð½Ðµ указываетÑÑ Ñвно (например, чиÑто текÑтовых файлов).<br>Обычно значение пуÑто, тогда оно извлекаетÑÑ Ð¸Ð· Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ (локали). Follow symbolic links РаÑкрывать ÑимволичеÑкие ÑÑылки Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Ходить по ÑимволичеÑким ÑÑылкам при индекÑировании. Обычно не делаетÑÑ Ð´Ð»Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°Ð½Ð¸Ñ Ð´ÑƒÐ±Ð»ÐµÐ¹ Index all file names ИндекÑировать вÑе имена файлов Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true ИндекÑировать и те имена файлов, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… не получаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ или обработать Ñодержимое (неизвеÑтный или неподдерживаемый тип MIME). Обычно так Beagle web history Web-иÑÑ‚Ð¾Ñ€Ð¸Ñ Beagle RTIToolW Real time indexing automatic start ÐвтоматичеÑкий запуÑк индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² реальном времени <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ИндекÑирование <span style=" font-weight:600;">Recoll</span> может быть наÑтроено как ÑервиÑ, обновлÑющий Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ñ€Ð¸ изменении файлов в реальном времени. При Ñтом Ð¸Ð½Ð´ÐµÐºÑ Ð²Ñегда Ñвежий, но ценой поÑтоÑнно иÑпользуемых ÑиÑтемных реÑурÑов.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. ЗапуÑкать Ñлужбу индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¼ÐµÑте Ñ Ð¼Ð¾ÐµÐ¹ ÑеÑÑией. Also start indexing daemon right now. Также запуÑтить Ñлужбу индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ñмо ÑейчаÑ. Replacing: ЗаменÑÑŽ: Replacing file ЗаменÑÑŽ файл Can't create: Ðе могу Ñоздать: Warning ОÑторожно Could not execute recollindex Ðевозможно запуÑтить recollindex Deleting: УдалÑÑŽ: Deleting file УдалÑÑŽ файл Removing autostart Убираю автозапуÑк Autostart file deleted. Kill current process too ? Файл автозапуÑка удалён. ОÑтановить текущий процеÑÑ? RclMain Query results Результаты поиÑка Cannot retrieve document info from database Ðевозможно извлечь информацию документа из БД Warning ОÑторожно Can't create preview window Ðевозможно Ñоздать окно предпроÑмотра Executing: [ ВыполнÑÑŽ: [ About Recoll О программе Document history ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð² History data Данные иÑтории Indexing in progress: ИндекÑирование: Files Файлы Purge ОчиÑтить Stemdb База корней Closing Закрываю Unknown ÐеизвеÑтно This search is not active any more Этот поиÑк уже не активен Bad viewer command line for %1: [%2] Please check the mimeconf file ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока программы проÑмотра %1: [%2] Проверьте файл mimeconf Cannot extract document or create temporary file Ðевозможно извлечь документ или Ñоздать временный файл (no stemming) (без Ñловоформ) (all languages) (вÑе Ñзыки) error retrieving stemming languages ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑпиÑка Ñзыков Update &Index Обновить &Ð¸Ð½Ð´ÐµÐºÑ Indexing interrupted ИндекÑирование прервано Stop &Indexing П&рервать индекÑирование Can't start query: Ошибка Ñтарта запроÑа: All вÑе media медиа message ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ other иное presentation презентации spreadsheet таблицы text текÑÑ‚ sorted Ñортированное filtered фильтрованное External applications/commands needed and not found for indexing your file types: ОтÑутÑтвующие внешние приложениÑ/команды, требуемые Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð°ÑˆÐ¸Ñ… файлов: No helpers found missing Ð’Ñе вÑпомогательные программы доÑтупны Missing helper programs ÐедоÑтающие вÑпомогательные программы Save file dialog Сохранить файл Choose a file name to save under Выберите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Document category filter Фильтр категории документа No external viewer configured for mime type [ Ðе указана внешнÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° проÑмотра Ð´Ð»Ñ [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Программа проÑмотра, ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð² mimeview Ð´Ð»Ñ %1: %2, не найдена. Открыть диалог наÑтроек? Can't access file: Ðет доÑтупа к файлу: Can't uncompress file: Ðевозможно раÑпаковать файл: Save file Сохранить файл Result count (est.) Результатов (примерно) Query details ПодробноÑти запроÑа Could not open external index. Db not open. Check external indexes list. Ðе удалоÑÑŒ открыть внешний индекÑ. БД не открыта. Проверьте ÑпиÑок внешних индекÑов. No results found ПоиÑк не дал результатов None ОтÑутÑтвует Updating ОбновлÑÑŽ Done Готово Monitor Монитор Indexing failed ИндекÑирование не удалоÑÑŒ The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Текущий процеÑÑ Ð¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ был запущен из Ñтого интерфейÑа. Ðажмите OK Ð´Ð»Ñ Ð¾Ñтанова или Отменить, чтоб работал Ñебе Erasing index Стираю Ð¸Ð½Ð´ÐµÐºÑ Reset the index and start from scratch ? Обнулить Ð¸Ð½Ð´ÐµÐºÑ Ð¸ начать заново? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ð±Ñ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°ÐµÑ‚ÑÑ.<br>Из-за ограничений библиотеки<br>оÑтанов прервёт вÑÑŽ программу Error Ошибка Index not open Ð˜Ð½Ð´ÐµÐºÑ Ð½Ðµ открыт Index query error Ошибка запроÑа Indexed Mime Types ИндекÑируемые MIME-типы Content has been indexed for these mime types: ПроиндекÑировано Ñодержание Ñледующих MIME-типов: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Ð˜Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ñтого файла уÑтарел. Ðе буду риÑковать показывать не тот фрагмент. Ðажмите OK Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа Ð´Ð»Ñ Ñтого файла, затем повторите запроÑ. Или же Отменить. Can't update index: indexer running Ðе могу обновить индекÑ: индекÑатор уже трудитÑÑ Indexed MIME Types RclMainBase Recoll Recoll &File &Файл &Tools &ИнÑтрументы &Preferences &ÐаÑтройки &Help &ПодÑказка Search tools ИнÑтрументы поиÑка Result list СпиÑок результатов E&xit &Выход &About Recoll &О программе &User manual &РуководÑтво Document &History &ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð² Document History ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð² &Advanced Search &Сложный поиÑк Advanced/complex Search Сложный поиÑк &Sort parameters &Параметры Ñортировки Sort parameters Параметры Ñортировки Next page След. Ñтраница Next page of results Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница результатов Previous page Пред. Ñтраница Previous page of results ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница результатов &Query configuration &ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ctrl+Q Ctrl+Q Update &index Обновить &Ð¸Ð½Ð´ÐµÐºÑ Term &explorer Ðавигатор &терминов Term explorer tool ИнÑтрумент иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÑ€Ð¼Ð¸Ð½Ð¾Ð² External index dialog Диалог внешнего индекÑа &Erase document history &ОчиÑтить иÑторию документов First page ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница Go to first page of results Перейти к первой Ñтранице результатов &Indexing configuration ÐаÑтройки ин&декÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ All вÑе &Show missing helpers FIXME &Показать недоÑтающие внешние программы PgDown PgDown PgUp PgUp &Full Screen Во веÑÑŒ &Ñкран F11 F11 Full Screen Во веÑÑŒ Ñкран &Erase search history ОчиÑтить иÑторию &поиÑка sortByDateAsc sortByDateAsc Sort by dates from oldest to newest Сортировать по датам от Ñтарых к новым sortByDateDesc sortByDateDesc Sort by dates from newest to oldest Сортировать по датам от новых к Ñтарым Show Query Details Показать детали запроÑа Show results as table Показать результаты в виде таблицы &Rebuild index FIXME Пере&индекÑировать &Show indexed types Показать индекÑируемые &типы Shift+PgUp Shift-PgUp &Indexing schedule &РаÑпиÑание индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ E&xternal index dialog FIXME Диалог &внешнего индекÑа RecollModel File name Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Mime type Тип MIME Date Дата Abstract FIXME Выдержка Author Ðвтор Document size Размер документа Document date Дата документа File size Размер файла File date Дата файла Keywords Ключевые Ñлова Original character set ИÑÑ…Ð¾Ð´Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° Relevancy rating РелевантноÑть Title Ðазвание URL URL Mtime Изменено Date and time Дата и Ð²Ñ€ÐµÐ¼Ñ Ipath FIXME I-путь MIME type ResList Result list СпиÑок результатов Unavailable document Документ недоÑтупен Previous ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Next Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ <p><b>No results found</b><br> <p><b>Ðе найдено</b><br> &Preview &ПроÑмотр Find &similar documents Ðайти &подобные документы Query details ПодробноÑти запроÑа (show query) (показать запроÑ) Copy &File Name Скопировать &Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Copy &URL Копировать &URL filtered фильтрованное sorted Ñортированное Document history ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð² Preview ПредпроÑмотр Open Открыть <p><i>Alternate spellings (accents suppressed): </i> <p><i>ÐÐ»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ð¾Ñ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ (без диакритичеÑких знаков): </i> &Write to File &Сохранить в файл Preview P&arent document/folder &ПредпроÑмотр родительÑкого документа/каталога &Open Parent document/folder &Открыть родительÑкий документ/каталог &Open О&ткрыть Documents Документы out of at least из минимум for по ResTable &Reset sort &СброÑить параметры Ñортировки &Delete column &Удалить Ñтолбец Add " Добавить Ñтолбец " " column " Save table to CSV file Сохранить таблицу в CSV-файл Can't open/create file: Ðе удалоÑÑŒ открыть/Ñоздать файл: &Preview &ПроÑмотр &Open О&ткрыть Copy &File Name Скопировать &Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Copy &URL Копировать &URL &Write to File &Сохранить в файл Find &similar documents Ðайти &подобные документы Preview P&arent document/folder &ПредпроÑмотр родительÑкого документа/каталога &Open Parent document/folder &Открыть родительÑкий документ/каталог &Save as CSV &Сохранить как CSV Add "%1" column Добавить колонку "%1" ResTableDetailArea &Preview &ПроÑмотр &Open О&ткрыть Copy &File Name Скопировать &Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Copy &URL Копировать &URL &Write to File &Сохранить в файл Find &similar documents Ðайти &подобные документы Preview P&arent document/folder &ПредпроÑмотр родительÑкого документа/каталога &Open Parent document/folder &Открыть родительÑкий документ/каталог SSearch Any term Любое Ñлово All terms Ð’Ñе Ñлова File name Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Completions Ð”Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Select an item: Выберите: Too many completions Слишком много дополнений Query language Язык запроÑа Bad query string ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтрока запроÑа Out of memory ÐедоÑтаточно памÑти Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Введите выражение на Ñзыке запроÑов. Шпаргалка:<br> <i>Ñлово1 Ñлово2</i> : 'Ñлово1' и 'Ñлово2' в любом поле.<br> <i>поле:Ñлово1</i> : 'Ñлово1' в поле 'поле'.<br> Стандартные полÑ/Ñинонимы:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> ПÑевдо-полÑ: dir, mime/format, type/rclcat, date.<br> Примеры интервалов между Ð´Ð²ÑƒÐ¼Ñ Ð´Ð°Ñ‚Ð°Ð¼Ð¸: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>Ñлово1 Ñлово2 OR Ñлово3</i> : Ñлово1 И (Ñлово2 ИЛИ Ñлово3).<br> Ð’ дейÑтвительноÑти, Ñкобки не разрешены.<br> <i>"Ñлово1 Ñлово2"</i> : фраза (должна вÑтречатьÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ в таком виде). Модификаторы:<br> <i>"Ñлово1 Ñлово2"p</i> : неупорÑдоченный поиÑк Ñ Ñ€Ð°ÑÑтоÑнием (<i><b>p</b>roximity</i>) по умолчанию.<br> ИÑпользуйте ÑÑылку <b>показать запроÑ</b>, когда ÑомневаетеÑÑŒ в результате, и Ñмотрите подробноÑти в руководÑтве (&lt;F1>). Enter file name wildcard expression. Введите маÑку имени файла. Enter search terms here. Type ESC SPC for completions of current term. Введите поиÑковые Ñлова. Можно нажать Esc-пробел Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ Ñлова. SSearchBase SSearchBase SSearchBase Clear ОчиÑтить Ctrl+S Ctrl+S Erase search entry ОчиÑтить поле ввода Search ИÑкать Start query ПриÑтупить к поиÑку Enter search terms here. Type ESC SPC for completions of current term. Введите поиÑковые Ñлова. Можно нажать Esc-пробел Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ Ñлова. Choose search type. Выберите тип поиÑка SearchClauseW Any of these Ñ Ð»ÑŽÐ±Ñ‹Ð¼Ð¸ Ñловами All of these Ñо вÑеми Ñловами None of these без Ñтих Ñлов This phrase фраза Terms in proximity Ñлова вблизи File name matching Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Select the type of query that will be performed with the words Выберите тип запроÑа, который будет произведён по Ñловам Number of additional words that may be interspersed with the chosen ones КоличеÑтво дополнительных Ñлов, которые могут оказатьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ выбранными No field Ðе иÑп. Ð¿Ð¾Ð»Ñ Any любое All вÑе None без Phrase фраза Proximity близоÑть File name FIXME Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° SortForm Date Дата Mime type Тип MIME SortFormBase Sort Criteria Критерии Ñортировки Sort the Сортировать most relevant results by: наиболее похожих результатов по: Descending убыванию Close Закрыть Apply Применить SpellBase Term Explorer Ðавигатор терминов &Expand &РаÑкрыть Alt+E Alt-E &Close &Закрыть Alt+C Alt+C Term Слово No db info. Ðет информации о БД. SpellW Wildcards Шаблоны Regexp Регвыражение Spelling/Phonetic ÐапиÑание/фонетика Aspell init failed. Aspell not installed? Ðе получилоÑÑŒ инициализировать Aspell. Он уÑтановлен? Aspell expansion error. Ошибка раÑÐºÑ€Ñ‹Ð²Ð°Ð½Ð¸Ñ aspell. Stem expansion РаÑкрытие оÑновы error retrieving stemming languages ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑпиÑка Ñзыков No expansion found РаÑкрытие не найдено Term Слово Doc. / Tot. Док. / Ð’Ñего Index: %1 documents, average length %2 terms ИндекÑ: %1 документ(ов), ÑреднÑÑ Ð´Ð»Ð¸Ð½Ð° %2 Ñлемент(ов) UIPrefsDialog The selected directory does not appear to be a Xapian index Выбранный каталог не похож на Ð¸Ð½Ð´ÐµÐºÑ Xapian This is the main/local index! Это главный индекÑ! The selected directory is already in the index list Этот каталог уже в ÑпиÑке индекÑов Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Выберите каталог индекÑа Xapian (например, /home/приÑтель/.recoll/xapiandb) error retrieving stemming languages ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑпиÑка Ñзыков Choose FIXME Выберите UIPrefsDialogBase User interface Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Number of entries in a result page КоличеÑтво запиÑей на Ñтраницу результатов Result list font Шрифт ÑпиÑка результатов Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Открывает диалог выбора шрифта ÑпиÑка результатов Reset Вернуть Resets the result list font to the system default УÑтанавливает шрифт ÑпиÑка результатов в обычный Auto-start simple search on whitespace entry. Ðачинать проÑтой поиÑк по вводу пробела. Start with advanced search dialog open. Открывать диалог Ñложного поиÑка при запуÑке. Start with sort dialog open. Открывать диалог Ñортировки при запуÑке. Search parameters Параметры поиÑка Stemming language Язык Ñловоформ Dynamically build abstracts ДинамичеÑкое выделение конÑпекта Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Следует ли пытатьÑÑ Ð¿Ð¾Ñтроить конÑпект из найденных документов, опираÑÑÑŒ на контекÑÑ‚ ключевых Ñлов? Может быть медленным Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… документов. Replace abstracts from documents Замещать конÑпект, ÑодержащийÑÑ Ð² документах Do we synthetize an abstract even if the document seemed to have one? Создавать ли конÑпект, еÑли документ уже имеет его? Synthetic abstract size (characters) Размер Ñоздаваемого конÑпекта (в Ñимволах) Synthetic abstract context words КонтекÑтных Ñлов External Indexes Внешние индекÑÑ‹ Add index Добавить Ð¸Ð½Ð´ÐµÐºÑ Select the xapiandb directory for the index you want to add, then click Add Index Выберите нужный каталог Ñ Ð¸Ð½Ð´ÐµÐºÑом Xapian и нажмите "Добавить индекÑ" Browse ПроÑмотр &OK &OK Apply changes Применить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ &Cancel &Отмена Discard changes Отменить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Result paragraph<br>format string Строка форматированиÑ<br>блока результатов Automatically add phrase to simple searches ÐвтоматичеÑки добавлÑть фразу при проÑтом поиÑке A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. ПоиÑк [rolling stones] (два Ñлова) будет изменён на [rolling или stones или (rolling phrase 2 stones)]. Это может поднÑть результаты, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… Ñлова Ñледуют именно в том порÑдке, как введены. User preferences ÐŸÑ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Use desktop preferences to choose document editor. ИÑпользовать деÑктопные наÑтройки Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° редактора документов. External indexes Внешние индекÑÑ‹ Toggle selected Переключить выделенные Activate All Включить вÑе Remove selected Удалить выделенные Remove from list. This has no effect on the disk index. Удалить из ÑпиÑка. Ð˜Ð½Ð´ÐµÐºÑ Ð½Ð° диÑке без изменений. Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> ОпределÑет формат каждого блока ÑпиÑка результатов. ИÑпользуйте html-формат qt и замены в Ñтиле printf:<br>%A аннотациÑ<br> %D дата<br> %I название пиктограммы<br> %K ключевые Ñлова (еÑли еÑть)<br> %L ÑÑылки предварительного проÑмотра и редактированиÑ<br> %M тип MIME<br> %N количеÑтво результатов<br> %R релевантноÑть<br> %S размер<br> %T заголовок<br> %U URL<br> Remember sort activation state. Запомнить ÑоÑтоÑние Ñортировки. Maximum text size highlighted for preview (megabytes) МакÑимальный объём текÑта Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ при проÑмотре (Мб) Texts over this size will not be highlighted in preview (too slow). ТекÑты большего размера не будут подÑвечиватьÑÑ Ð¿Ñ€Ð¸ предварительном проÑмотре (медленно). Highlight color for query terms Цвет Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов Deactivate All Выключить вÑе Prefer Html to plain text for preview. Предпочитать HTML текÑту Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¿Ñ€Ð¾Ñмотра If checked, results with the same content under different names will only be shown once. Показывать результаты Ñ Ñ‚ÐµÐ¼ же Ñодержанием под разными именами не более одного раза Hide duplicate results. ПрÑтать дубликаты Choose editor applications Выбор редакторов Display category filter as toolbar instead of button panel (needs restart). Показывать фильтр категории документа в виде выпадающего ÑпиÑка, а не панели Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°Ð¼Ð¸ (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк). ViewAction Changing actions with different current values Изменение дейÑтвий Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸ текущими значениÑми Mime type Тип MIME Command Команда MIME type ViewActionBase File type Тип файла Action ДейÑтвие Select one or several file types, then click Change Action to modify the program used to open them Выберите один или неÑколько типов файлов, затем нажмите "Сменить дейÑтвие" Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹, работающей Ñ Ð½Ð¸Ð¼Ð¸ Change Action Сменить дейÑтвие Close Закрыть Native Viewers Родные вьюеры Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. Выберите один или неÑколько MIME-типов и нажмите"Сменить дейÑтвие"<br>Также Ð’Ñ‹ можете закрыть Ñтот диалог и уÑтановить флаг "ИÑпользовать деÑктопные наÑтройки"<br> в оÑновной панели, чтобы иÑпользовать деÑктопные наÑтройки вмеÑто данного ÑпиÑка. confgui::ConfBeaglePanelW Steal Beagle indexing queue ВоÑпользоватьÑÑ Ð¾Ñ‡ÐµÑ€ÐµÐ´ÑŒÑŽ индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Beagle Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Beagle ÐЕ должен выполнÑтьÑÑ. Включить обработку очереди Beagle Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Web-иÑтории Firefox.<br>(Ð´Ð»Ñ Ñтого Ñледует также уÑтановить плагин Beagle Ð´Ð»Ñ Firefox) Web cache directory name Каталог Веб-кÑша The name for a directory where to store the cache for visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Ð˜Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°, в котором хранитÑÑ ÐºÑш поÑещенных Веб-Ñтраниц.<br>Путь указываетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно каталога Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸ÐµÐ¹ и не ÑвлÑетÑÑ Ð°Ð±Ñолютным. Max. size for the web cache (MB) Предел размера Веб-кÑша (MB) Entries will be recycled once the size is reached При доÑтижении указанного размера кÑша Ñтарые запиÑи будут удалÑтьÑÑ Web page store directory name Ð˜Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° web-Ñтраниц The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Ð˜Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¹ поÑещённых web-Ñтраниц.<br>Путь, не ÑвлÑющийÑÑ Ð°Ð±Ñолютным, берётÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно каталога конфигурации. Max. size for the web store (MB) МакÑимальный размер web-хранилища (МБ) confgui::ConfIndexW Can't write configuration file Ðевозможно запиÑать файл конфигурации confgui::ConfParamFNW Browse ПроÑмотр Choose ПроÑмотр confgui::ConfParamSLW + + - - confgui::ConfSubPanelW Global Общее Max. compressed file size (KB) Предел размера Ñжатого файла (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Это значение уÑтанавливает порог размера Ñжатых файлов, которые будут обрабатыватьÑÑ. -1 отключает порог, 0 отключает декомпреÑÑию. Max. text file size (MB) Предел размера текÑтового файла (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Это значение уÑтанавливает порог размера текÑтовых файлов, которые будут обрабатыватьÑÑ. -1 отключает порог. Ð”Ð°Ð½Ð½Ð°Ñ Ð½Ð°Ñтройка может быть полезна Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… файлов: журналов Ñообщений и Ñ‚.п. Text file page size (KB) Размер Ñтраницы текÑтового файла (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). ЕÑли Ñто значение уÑтановлено (Ñ‚.е. не равно -1), то при индекÑировании текÑтовые файлы разбиваютÑÑ Ð½Ð° фрагменты ÑоответÑтвующего размера. Ð”Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ помочь при выполнении поиÑка в очень больших текÑтовых файлах (например, файлах журналов). Max. filter exec. time (S) Предельное Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ фильтра (Ñек) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. Внешние фильтры, выполнÑющиеÑÑ Ð´Ð¾Ð»ÑŒÑˆÐµ указанного предельного времени работы, принудительно завершаютÑÑ. Это может помочь в тех редких ÑлучаÑÑ…, когда фильтр (например, postscript) зацикливаетÑÑ Ð¿Ñ€Ð¸ обработке некоторого документа. Значение, равное -1, выключает проверку времени работы. confgui::ConfTopPanelW Top directories ИндекÑируемые папки The list of directories where recursive indexing starts. Default: your home. СпиÑок каталогов, где начинаетÑÑ Ñ€ÐµÐºÑƒÑ€Ñивное индекÑирование. Обычно домашний каталог. Skipped paths ПропуÑкать Stemming languages Языки Ñо Ñловоформами The languages for which stemming expansion<br>dictionaries will be built. Языки, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… будут поÑтроены<br>Ñловари раÑÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñловоформ. Log file name Файл журнала The file where the messages will be written.<br>Use 'stderr' for terminal output Файл, куда будут запиÑыватьÑÑ ÑообщениÑ.<br>'stderr' Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° на терминал Log verbosity level ПодробноÑть журнала This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Это значение определÑет подробноÑть Ñообщений,<br>от ошибок до отладочных данных. Index flush megabytes interval Интервал запиÑи индекÑа (Мб) Max disk occupation (%) МакÑимальное иÑпользование диÑка (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Процент занÑтоÑти диÑка, при котором индекÑирование будет прервано (во избежание Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупного меÑта).<br>Обычно: 0 (отключает проверку). No aspell usage Ðе иÑпользовать aspell Aspell language Язык aspell The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Язык ÑÐ»Ð¾Ð²Ð°Ñ€Ñ aspell. Обычно вроде 'en' или 'ru'...<br>ЕÑли значение не указано, будет иÑпользовано окружение (локаль), что обычно работает. Чтобы поÑмотреть, какие варианты доÑтупны в ÑиÑтеме, наберите 'aspell config' и проверьте, какие .dat-файлы еÑть в каталоге 'data-dir'. Database directory name Каталог базы данных The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Ð˜Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°, в котором хранитÑÑ Ð¸Ð½Ð´ÐµÐºÑ<br>ОтноÑительный путь берётÑÑ Ð¾Ñ‚ каталога конфигурации. Обычно 'xapiandb'. Use system's 'file' command ИÑпользовать ÑиÑтемную 'file' Use the system's 'file' command if internal<br>mime type identification fails. ИÑпользовать ÑиÑтемную команду 'file' <br>при Ñбое внутреннего Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ñ‚Ð¸Ð¿Ð¾Ð² MIME. These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Имена каталогов, которые индекÑирование обойдёт.<br>Может Ñодержать шаблоны. ОбÑзано подходить к путÑм, которые видит индекÑатор (например, еÑли topdirs включает '/home/me' и '/home' ÑвлÑетÑÑ ÑÑылкой на '/usr/home', то Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ должна быть '/home/me/tmp*', а не '/usr/home/me/tmp*') This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Это значение определÑет количеÑтво проиндекÑированных данных между ÑброÑами на диÑк.<br>Помогает контролировать иÑпользование памÑти при индекÑации. Обычно 10Mb Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Отключает иÑпользование aspell Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ приближений напиÑÐ°Ð½Ð¸Ñ Ð² навигаторе терминов.<br> Полезно, еÑли aspell отÑутÑтвует или Ñломан. uiPrefsDialogBase User preferences ÐŸÑ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ User interface Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Number of entries in a result page КоличеÑтво запиÑей на Ñтраницу результатов If checked, results with the same content under different names will only be shown once. Показывать результаты Ñ Ñ‚ÐµÐ¼ же Ñодержанием под разными именами не более одного раза Hide duplicate results. ПрÑтать дубликаты Highlight color for query terms Цвет Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов Result list font Шрифт ÑпиÑка результатов Opens a dialog to select the result list font Открывает диалог выбора шрифта ÑпиÑка результатов Helvetica-10 Helvetica-10 Resets the result list font to the system default УÑтанавливает шрифт ÑпиÑка результатов в обычный Reset Вернуть Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> ОпределÑет формат каждого блока ÑпиÑка результатов. ИÑпользуйте html-формат qt и замены в Ñтиле printf:<br>%A аннотациÑ<br> %D дата<br> %I название пиктограммы<br> %K ключевые Ñлова (еÑли еÑть)<br> %L ÑÑылки предварительного проÑмотра и редактированиÑ<br> %M тип MIME<br> %N количеÑтво результатов<br> %R релевантноÑть<br> %S размер<br> %T заголовок<br> %U URL<br> Result paragraph<br>format string Строка форматированиÑ<br>блока результатов Texts over this size will not be highlighted in preview (too slow). ТекÑты большего размера не будут подÑвечиватьÑÑ Ð¿Ñ€Ð¸ предварительном проÑмотре (медленно). Maximum text size highlighted for preview (megabytes) МакÑимальный объём текÑта Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ при проÑмотре (Мб) Use desktop preferences to choose document editor. ИÑпользовать деÑктопные наÑтройки Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° редактора документов. Choose editor applications Выбор редакторов Display category filter as toolbar instead of button panel (needs restart). Показывать фильтр категории документа в виде выпадающего ÑпиÑка, а не панели Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°Ð¼Ð¸ (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк). Auto-start simple search on whitespace entry. Ðачинать проÑтой поиÑк по вводу пробела. Start with advanced search dialog open. Открывать диалог Ñложного поиÑка при запуÑке. Start with sort dialog open. Открывать диалог Ñортировки при запуÑке. Remember sort activation state. Запомнить ÑоÑтоÑние Ñортировки. Prefer Html to plain text for preview. Предпочитать HTML текÑту Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¿Ñ€Ð¾Ñмотра Search parameters Параметры поиÑка Stemming language Язык Ñловоформ A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. ПоиÑк [rolling stones] (два Ñлова) будет изменён на [rolling или stones или (rolling phrase 2 stones)]. Это может поднÑть результаты, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… Ñлова Ñледуют именно в том порÑдке, как введены. Automatically add phrase to simple searches ÐвтоматичеÑки добавлÑть фразу при проÑтом поиÑке Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Следует ли пытатьÑÑ Ð¿Ð¾Ñтроить конÑпект из найденных документов, опираÑÑÑŒ на контекÑÑ‚ ключевых Ñлов? Может быть медленным Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… документов. Dynamically build abstracts ДинамичеÑкое выделение конÑпекта Do we synthetize an abstract even if the document seemed to have one? Создавать ли конÑпект, еÑли документ уже имеет его? Replace abstracts from documents Замещать конÑпект, ÑодержащийÑÑ Ð² документах Synthetic abstract size (characters) Размер Ñоздаваемого конÑпекта (в Ñимволах) Synthetic abstract context words КонтекÑтных Ñлов The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Слова в ÑпиÑке будут автоматичеÑки преобразованы к виду ext:xxx в запроÑе. Query language magic file name suffixes. МагичеÑкие раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ файла Ð´Ð»Ñ Ñзыка запроÑов Enable Включить External Indexes Внешние индекÑÑ‹ Toggle selected Переключить выделенные Activate All Включить вÑе Deactivate All Выключить вÑе Remove from list. This has no effect on the disk index. Удалить из ÑпиÑка. Ð˜Ð½Ð´ÐµÐºÑ Ð½Ð° диÑке без изменений. Remove selected Удалить выделенные Click to add another index directory to the list Ðажмите, чтобы добавить ещё одну папку Ñ Ð¸Ð½Ð´ÐµÐºÑом в ÑпиÑок Add index Добавить Ð¸Ð½Ð´ÐµÐºÑ Apply changes Применить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ &OK &OK Discard changes Отменить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ &Cancel &Отмена Abstract snippet separator Разделитель фрагментов в результатах Use <PRE> tags instead of <BR>to display plain text as html. ИÑпользовать Ñ‚Ñги <PRE> вмеÑто <BR>Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñтого текÑта как html. Lines in PRE text are not folded. Using BR loses indentation. Строки в PRE-текÑте не переноÑÑÑ‚ÑÑ. При иÑпользовании BR терÑÑŽÑ‚ÑÑ Ð¾Ñ‚Ñтупы. Style sheet Ðабор Ñтилей Opens a dialog to select the style sheet file Открыть диалог выбора файла Ñтилей Choose Выбрать Resets the style sheet to default Вернуть Ñтили по умолчанию Lines in PRE text are not folded. Using BR loses some indentation. Строки текÑта PRE не переноÑÑÑ‚ÑÑ. ИÑпользование BR терÑет чать отÑтупов. Use <PRE> tags instead of <BR>to display plain text as html in preview. ИÑпользовать теги <PRE> вмеÑто <BR> Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð³Ð¾ текÑта как HTML при предварительном проÑмотре. Result List СпиÑок результатов Edit result paragraph format string FIXME Править Ñтроку Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð² Edit result page html header insert Править HTML-заголовок результатов Date format (strftime(3)) Формат даты по strftime(3) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Порог чаÑтоты в процентах, поÑле которого мы не иÑпользуем термы в автофразе. ЧаÑтые термы ÑвлÑÑŽÑ‚ÑÑ ÑущеÑтвенной проблемой производительноÑти на фразах. Пропущенные термы дополнÑÑŽÑ‚ проÑадку фразы и уменьшают ÑффективноÑть ÐФ. Значение по умолчанию - 2 (процента). Autophrase term frequency threshold percentage Порог чаÑтоты термов автофразы в процентах recoll-1.17.3/qtgui/i18n/recoll_tr.ts000644 001750 000000 00000263176 11757435273 017766 0ustar00dockeswheel000000 000000 AdvSearch All clauses Tüm ifadeler Any clause İfadelerin herhangi biri texts metinler spreadsheets hesap tabloları presentations sunumlar media ortamlar messages iletiler other diÄŸer Bad multiplier suffix in size filter AdvSearchBase Advanced search GeliÅŸmiÅŸ arama Search for <br>documents<br>satisfying: Uyan <br>belgeleri<br>ara: Delete clause İfadeyi sil Add clause İfade ekle Restrict file types Dosya tiplerini sınırlandır Check this to enable filtering on file types Dosya tipleri üzerinde filtreleme kullanmak için bunu iÅŸaretleyin By categories Kategorilere göre Check this to use file categories instead of raw mime types Dosya tipleri yerine ham mime tipleri üzerinde filtreleme kullanmak için bunu iÅŸaretleyin Save as default öntanımlı olarak kaydet Searched file types Aranan dosya tipleri All ----> Tümü ----> Sel -----> Seç -----> <----- Sel <----- Seç <----- All <----- Tümü Ignored file types Yoksayılan dosya tipleri Enter top directory for search Arama için en üst dizini girin Browse Gözat Restrict results to files in subtree: Arama sonuçlarını bu dizin ve aÅŸağısı ile sınırlandır: Start Search Aramayı BaÅŸlat Close Kapat All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Invert Minimum size. You can use k/K,m/M,g/G as multipliers Min. Size Maximum size. You can use k/K,m/M,g/G as multipliers Max. Size Filter From To Check this to enable filtering on dates Filter dates Find Check this to enable filtering on sizes Filter sizes CronToolW Cron Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Hours (* or 0-23) Minutes (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> Enable Disable It seems that manually edited entries exist for recollindex, cannot edit crontab Error installing cron entry. Bad syntax in fields ? EditDialog Dialog FirstIdxDialog First indexing setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> Indexing configuration This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Indexing schedule This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Start indexing now IdxSchedW Index scheduling setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> Cron scheduling The tool will let you decide at what time indexing should run and will install a crontab entry. Real time indexing start up Decide if real time indexing will be started when you log in (only for the default index). ListDialog Dialog GroupBox Main Configuration problem (dynconf Yapılandırma sorunu No db directory in configuration Yapılandırma içerisinde veritabanı dizini yok Could not open database in Veritabanı açılamadı . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. . İndekseleme baÅŸlamadan yapılandırmayı düzenlemek için İptal düğmesine basın ya da Tamam düğmesine basarak iÅŸleme izin verin. "history" file is damaged or un(read)writeable, please check or remove it: Preview Close Tab Sekmeyi Kapat Cannot create temporary directory Geçici dizin oluÅŸturulamadı Cancel İptal Missing helper program: Yardımcı program kayıp: Can't turn doc into internal representation for Åžunun için iç gösterim yapılamıyor Creating preview text Önizleme metni oluÅŸturuluyor Loading preview text into editor Önizleme metni düzenleyiciye yükleniyor &Search for: A&ra: &Next &Sonraki &Previous &Önceki Clear Temizle Match &Case EÅŸleÅŸme Åža&rtı Cannot create temporary directory: Error while loading file PreviewTextEdit Show fields Show main text Print Print Current Preview Show image Select All Copy Save document to file Fold lines Preserve indentation QObject Global parameters Genel parametreler Local parameters Yerel parametreler <b>Customised subtrees <b>ÖzelleÅŸtirilmiÅŸ alt aÄŸaçlar The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. İndekslenmiÅŸ sıralama içerisindeki alt dizinlerin listesi <br>ki burada bazı parametrelerin yeniden tanımlanması gerekir. Öntanımlı: boÅŸ. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>AÅŸağıdaki parametreler, ya seçili alt dizin için uygulanır ya da üst düzeyde veya üstteki metin kutusunda hiçbir ÅŸey seçilmediÄŸinde yada boÅŸ bir satır seçildiÄŸinde uygulanır.<br>+/- düğmelerine tıklayarak dizinleri ekleyip çıkarabilirsiniz. Skipped names Atlanan isimler These are patterns for file or directory names which should not be indexed. Bu nitelikler insekslenmemesi gereken dosya ve dizinler içindir. Default character set Öntanımlı karakter seti This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Bu karakter seti, karakter kodlaması uygulama tarafından belirlenemeyen dosyalar için kulanılır, ÖrneÄŸin salt metin dosyaları.<br>Öntanımlı deÄŸer boÅŸtur ve NLS çevresel deÄŸiÅŸkeni kullanılır. Follow symbolic links Sembolik baÄŸlantıları izle Follow symbolic links while indexing. The default is no, to avoid duplicate indexing İndekslerken sembolik baÄŸlantıları izle. Aynı ögelerin yeniden indekslenmesinden kaçınmak için öntanımlı deÄŸer hayır Index all file names Tüm dosya isimlerini indeksle Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true İçeriÄŸi tanınmayan ya da iÅŸlenemeyen (ya da desteklenmeyen mime tipi) dosyaları indeksle. Öntanımlı evet Beagle web history RTIToolW Real time indexing automatic start <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Also start indexing daemon right now. Replacing: Replacing file Can't create: Warning Uyarı Could not execute recollindex Deleting: Deleting file Removing autostart Autostart file deleted. Kill current process too ? RclMain (no stemming) (kök ayrıştırma kullanma) (all languages) (tüm diller) error retrieving stemming languages sözcük kökleri ayrıştırılabilir diller alınırken hata oluÅŸtu Indexing in progress: İndeksleme devam ediyor: Files Dosyalar Purge Temizle Stemdb KökAyrıştırmaVeritabanı Closing Kapatılıyor Unknown Bilinmeyen Can't start query: Sorgu baÅŸlatılamadı: Query results Arama Sonuçları Cannot retrieve document info from database Veritabanından belge bilgileri alınamadı Warning Uyarı Can't create preview window Önizleme penceresi oluÅŸturulamıyor This search is not active any more Bu arama atrık etkin deÄŸil Bad viewer command line for %1: [%2] Please check the mimeconf file %1 için uygun olmayan komut: [%2] Lütfen mimeconf dosyasını kontrol edin Cannot extract document or create temporary file Belge açılamadı ya da geçici dosya oluÅŸturulamadı Executing: [ Çalıştırılıyor: [ About Recoll Recoll Hakkında History data GeçmiÅŸ verileri Document history Belge geçmiÅŸi Update &Index Stop &Indexing All media ortamlar message other diÄŸer presentation spreadsheet text sorted filtered External applications/commands needed and not found for indexing your file types: No helpers found missing Missing helper programs Document category filter No external viewer configured for mime type [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Can't access file: Can't uncompress file: Save file Result count (est.) Query details Sorgu detayları Could not open external index. Db not open. Check external indexes list. No results found None Updating Done Monitor Indexing failed The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Erasing index Reset the index and start from scratch ? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Error Index not open Index query error Content has been indexed for these mime types: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Can't update index: indexer running Indexed MIME Types RclMainBase Recoll Recoll Search tools Arama araçları Result list Sonuç listesi &File &Dosya &Tools &Araçlar &Preferences &Tercihler &Help &Yardım E&xit &Çık Ctrl+Q Ctrl+Q Update &index İndeksi g&üncelle &Erase document history &Belge geçmiÅŸini temizle &About Recoll &Recoll Hakkında &User manual &Kullanıcı El Kitabı Document &History Belge &GeçmiÅŸi Document History Belge GeçmiÅŸi &Advanced Search &GeliÅŸmiÅŸ arama Advanced/complex Search GeliÅŸmiÅŸ/karmaşık Arama &Sort parameters &Sıralama Ölçütleri Sort parameters Sıralama ölçütleri Term &explorer İfade g&österici Term explorer tool İfade gösterme aracı Next page Sonraki sayfa Next page of results Sonuçların sonraki sayfası First page İlk sayfa Go to first page of results Sonuçların ilk sayfasına git Previous page Önceki sayfa Previous page of results Sonuçların önceki sayfası &Query configuration &Sorgu yapılandırması External index dialog Dış indeksler penceresi &Indexing configuration İ&ndeksleme yapılandırması All &Show missing helpers PgDown PgUp &Full Screen F11 Full Screen &Erase search history sortByDateAsc Sort by dates from oldest to newest sortByDateDesc Sort by dates from newest to oldest Show Query Details Show results as table &Rebuild index &Show indexed types Shift+PgUp &Indexing schedule E&xternal index dialog RecollModel File name Dosya adı Mime type Mime Tipi Date Tarih Abstract Author Document size Document date File size File date Keywords Original character set Relevancy rating Title URL Mtime Date and time Ipath MIME type ResList Result list Sonuç listesi <p><b>No results found</b><br> <p><b>Sonuç bulunamadı</b><br> (show query) (sorguyu göster) Unavailable document EriÅŸilemez belge Previous Önceki Next Sonraki &Preview &Önizle Copy &File Name &Dosya Adını Kopyala Copy &URL &Adresi Kopyala Find &similar documents Benzer belgeleri &bul Query details Sorgu detayları Document history Belge geçmiÅŸi Preview Önizle Open <p><i>Alternate spellings (accents suppressed): </i> &Write to File Preview P&arent document/folder &Open Parent document/folder &Open Documents out of at least for ResTable &Reset sort &Delete column Save table to CSV file Can't open/create file: &Preview &Önizle &Open Copy &File Name &Dosya Adını Kopyala Copy &URL &Adresi Kopyala &Write to File Find &similar documents Benzer belgeleri &bul Preview P&arent document/folder &Open Parent document/folder &Save as CSV Add "%1" column ResTableDetailArea &Preview &Önizle &Open Copy &File Name &Dosya Adını Kopyala Copy &URL &Adresi Kopyala &Write to File Find &similar documents Benzer belgeleri &bul Preview P&arent document/folder &Open Parent document/folder SSearch Any term Sözcüklerin herhangi biri All terms Tüm sözcükler File name Dosya adı Query language Arama dili Bad query string Uygunsuz arama ifadesi Out of memory Yetersiz bellek Too many completions Çok fazla tamamlama Completions Tamamlamalar Select an item: Bir öge seçin: Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Enter file name wildcard expression. Enter search terms here. Type ESC SPC for completions of current term. Aranacak ifadeleri buraya girin. Geçerli sözcüğün tamamlanması için ESC SPACE kullanın. SSearchBase SSearchBase SSearchBase Clear Temizle Ctrl+S Ctrl+S Erase search entry Arama girdisini temizle Search Ara Start query Sorguyu baÅŸlat Enter search terms here. Type ESC SPC for completions of current term. Aranacak ifadeleri buraya girin. Geçerli sözcüğün tamamlanması için ESC SPACE kullanın. Choose search type. SearchClauseW SearchClauseW SearchClauseW Any of these Bunların herhangi biri All of these Bunların tümü None of these Bunların hiçbiri This phrase Tam olarak bu ifade Terms in proximity Yakın ifadeler File name matching Dosya adı eÅŸleÅŸen Select the type of query that will be performed with the words Sözcükler ile kullanılacak sorgu biçimini seç Number of additional words that may be interspersed with the chosen ones Seçilen sözcüklerin arasında yer alabilecek ek sözcüklerin sayısı No field Any All None Phrase Proximity File name Dosya adı SortForm Date Tarih Mime type Mime Tipi SortFormBase Sort Criteria Sıralama Ölçütü Sort the Sırala most relevant results by: en uygun sonuç veren: Descending Azalan Apply Uygula Close Kapat SpellBase Term Explorer İfade Gösterici &Expand &GeniÅŸlet Alt+E Alt+G &Close &Kapat Alt+C Alt+K Term İfade No db info. SpellW Wildcards Özel karakterler Regexp Düzenli ifade Stem expansion Kök ayrıştırma geniÅŸlemesi Spelling/Phonetic Heceleme/Fonetik error retrieving stemming languages sözcük kökleri ayrıştırılabilir diller alınırken hata oluÅŸtu Aspell init failed. Aspell not installed? Aspell baÅŸlatılamadı. YüklenmemiÅŸ olabilir mi? Aspell expansion error. Aspell heceleme geniÅŸlemesi hatası. No expansion found Hiç geniÅŸleme bulunamadı Term İfade Doc. / Tot. Index: %1 documents, average length %2 terms UIPrefsDialog error retrieving stemming languages sözcük kökleri ayrıştırılabilir diller alınırken hata oluÅŸtu The selected directory does not appear to be a Xapian index Seçilen dizin bir Xapian indeks dizini gibi görünmüyor This is the main/local index! Bu ana/yerel veritabanı! The selected directory is already in the index list Seçilen dizin zaten indeks listesinde var Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Xapian indeks dizinini seç (/home/kullanıcı_adınız/.recoll/xapiandb gibi.) Choose Gözat UIPrefsDialogBase User preferences Kullanıcı tercihleri User interface Kullanıcı arayüzü Number of entries in a result page Bir sonuç sayfasındaki sonuç sayısı Result list font Sonuç listesi yazıtipi Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Sonuç listesi yazıtipini seçmek için bir pencere açar Reset Sıfırla Resets the result list font to the system default Sonuç listesi yazıtipini sistem ayarlarına döndür Result paragraph<br>format string Sonuç paragrafı<br>biçimlendirme ifadesi Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Tüm sonuç listesi paragraflarını tanımlar. Qt html biçimini ve printf benzeri yer deÄŸiÅŸtiricileri kullanın:<br>%A Özet<br> %D Tarih<br> %I Simge resminin adı<br> %K Anahtar sözcükler (eÄŸer varsa)<br> %L Önizle ve Düzenle baÄŸlantıları<br> %M Mime tipi<br> %N Sonuç sayısı<br> %R Uyum yüzdesi<br> %S Boyut bilgileri<br> %T BaÅŸlık<br> %U Url<br> Texts over this size will not be highlighted in preview (too slow). Bu boyuttan büyük metinler önizlemede vurgulanmayacak (çok yavaÅŸ). Maximum text size highlighted for preview (megabytes) Önizlemede vurgulanacak en fazla metin boyutu (MB) Auto-start simple search on whitespace entry. Beyaz alan girdisi olduÄŸunda basit aramayı otomatik olarak baÅŸlat. Start with advanced search dialog open. GeliÅŸmiÅŸ arama penceresi ile baÅŸla. Start with sort dialog open. Sıralama penceresi ile baÅŸla. Use desktop preferences to choose document editor. Belge düzenleyiciyi seçmek için masaüstü tercihlerini kullan. Remember sort activation state. Sıralama kurallarını hatırla. Search parameters Arama parametreleri Stemming language Kök ayrıştırma dili Automatically add phrase to simple searches Basit aramalara ifadeyi otomatik olarak ekle A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. [linux kernel] (2 sözcük) araması [linux veya kernel veya (linux ifadesi 2 tane kernel)] olarak deÄŸiÅŸtirilecektir. Bu, aranacak sözcüklerin tam olarak girildiÄŸi gibi görüntülendiÄŸi sonuçlara yüksek öncelik verilmesini saÄŸlayacaktır. Dynamically build abstracts Özetleri dinamik olarak oluÅŸtur Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Sorgu sözcükleri kullanılarak sonuç listesi girdileri için özet oluÅŸturulsun mu ? Büyük boyutlu belgelerde yavaÅŸ olabilir. Replace abstracts from documents Belgelerden özetleri kaldır Do we synthetize an abstract even if the document seemed to have one? Belgenin bir özeti varsa bile bir yapay özet oluÅŸturulsun mu? Synthetic abstract size (characters) Yapay özet boyutu (karakter sayısı) Synthetic abstract context words Yapay özet sözcükleri External Indexes Dış indeksler External indexes Dış indeksler Toggle selected Seç /Bırak Activate All Tümünü EtkinleÅŸtir Deactivate All Tümünü PasifleÅŸtir Remove selected Seçileni sil Remove from list. This has no effect on the disk index. Listeden sil. Bu diskteki indeksi etkilemez. Add index İndeks ekle Select the xapiandb directory for the index you want to add, then click Add Index İstediÄŸiniz indeksi eklemek için xapiandb (veritabanı) dizinini seçin ve İndeks Ekle düğmesine tıklayın Browse Gözat &OK &TAMAM Apply changes DeÄŸiÅŸiklikleri uygula &Cancel &İptal Discard changes DeÄŸiÅŸiklikleri sil ViewAction Changing actions with different current values Farklı deÄŸerlerle eylemler deÄŸiÅŸtiriliyor Mime type Mime Tipi Command MIME type ViewActionBase Native Viewers DoÄŸal Göstericiler Select one or several file types, then click Change Action to modify the program used to open them Bir ya da birkaç dosya tipi seçin ve Eylemi DeÄŸiÅŸtir düğmesine tıklayarak hangi uygulama ile açılacağını deÄŸiÅŸtirin File type Dosya tipi Action Davranış Change Action Davranışı DeÄŸiÅŸtir Close Kapat Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. confgui::ConfBeaglePanelW Steal Beagle indexing queue Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Entries will be recycled once the size is reached Web page store directory name The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Max. size for the web store (MB) confgui::ConfIndexW Can't write configuration file Yapılandırma dosyası yazılamadı confgui::ConfParamFNW Browse Gözat Choose Gözat confgui::ConfParamSLW + + - - confgui::ConfSubPanelW Global Genel Max. compressed file size (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Max. text file size (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Text file page size (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Max. filter exec. time (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. confgui::ConfTopPanelW Top directories Üst dizinler The list of directories where recursive indexing starts. Default: your home. Özyinelemeli indesklemenin baÅŸlayacağı dizinlerin listesi. Öntanımlı: ev dizininiz. Skipped paths Atlanan yollar These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Bunlar indekslemenin girmeyeceÄŸi dizinlerin adlarıdır.<br> * gibi özel karakterler içerebilir. İndeksleyici tarafından görülen yollar ile eÅŸleÅŸmelidir (örneÄŸin: eÄŸer en üst dizinler '/home/ben' ve '/home' içeriyorsa ve home '/usr/home' dizinine baÄŸlantılı ise atlanacak dizin yolu '/home/me/tmp*' olmalıdır, '/usr/home/me/tmp*' deÄŸil) Stemming languages Sözcük kökleri ayrıştırılabilir diller The languages for which stemming expansion<br>dictionaries will be built. Kök ayrıştırma geniÅŸlemesi için sözlükleri<br>inÅŸa edilecek olan diller. Log file name Günlük dosyasının adı The file where the messages will be written.<br>Use 'stderr' for terminal output İletilerin yazılacağı dosya.<br>Uçbirim çıktısı için 'stderr' kullanın Log verbosity level Günlük dosyası ayrıntı düzeyi This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Bu deÄŸer ileti boyutunu ayarlar,<br>sadece hatalardan hata ayıklama verilerine kadar. Index flush megabytes interval İndex düzeltme MB aralığı This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Bu deÄŸer diske gönderilecek indekslenmiÅŸ veri miktarını ayarlar.<br>Bu indeksleyicinin bellek kullanımını kontrol etmeye yarar. Öntanımlı 10MB Max disk occupation (%) En yüksek disk kullanımı (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Bu disk kullanımının yüzdesidir ki bu orana eriÅŸildiÄŸinde indeksleme durdurulur (diskin doldurulmasını engellemek için).<br>0 kısıtlama yok demektir (Öntanımlı). No aspell usage Aspell kullanımı yok Aspell language Aspell dili The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Aspell sözlükleri için dil. Bu 'en' ya da 'fr' gibi olmalıdır ...<br>EÄŸer bu deÄŸer ayarlanmazsa ÅŸimdi kullandığnız NLS çevresel deÄŸiÅŸkeni kullanılacaktır. Sisteminizde neyin yüklü olduÄŸu hakkında bilgi almak için 'aspell config' yazıp 'data-dir' içerisindeki .dat dosyalarına bakın. Database directory name Veritabanı dizininin adı The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. İndeksin duracağı dizinin adı<br>EÄŸer tam yol verilmezse yol yapılandırma dizinine göre belirlenecek. Öntanımlı dizin adı 'xapiandb'. Use system's 'file' command Sistemdeki 'file' komutunu kullan Use the system's 'file' command if internal<br>mime type identification fails. İç mime tipi belirleme iÅŸlemi baÅŸarısız olursa<br> sistemdeki 'file' komutunu kullan. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. uiPrefsDialogBase User preferences Kullanıcı tercihleri User interface Kullanıcı arayüzü Number of entries in a result page Bir sonuç sayfasındaki sonuç sayısı If checked, results with the same content under different names will only be shown once. Hide duplicate results. Highlight color for query terms Result list font Sonuç listesi yazıtipi Opens a dialog to select the result list font Sonuç listesi yazıtipini seçmek için bir pencere açar Helvetica-10 Helvetica-10 Resets the result list font to the system default Sonuç listesi yazıtipini sistem ayarlarına döndür Reset Sıfırla Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Tüm sonuç listesi paragraflarını tanımlar. Qt html biçimini ve printf benzeri yer deÄŸiÅŸtiricileri kullanın:<br>%A Özet<br> %D Tarih<br> %I Simge resminin adı<br> %K Anahtar sözcükler (eÄŸer varsa)<br> %L Önizle ve Düzenle baÄŸlantıları<br> %M Mime tipi<br> %N Sonuç sayısı<br> %R Uyum yüzdesi<br> %S Boyut bilgileri<br> %T BaÅŸlık<br> %U Url<br> Result paragraph<br>format string Sonuç paragrafı<br>biçimlendirme ifadesi Texts over this size will not be highlighted in preview (too slow). Bu boyuttan büyük metinler önizlemede vurgulanmayacak (çok yavaÅŸ). Maximum text size highlighted for preview (megabytes) Önizlemede vurgulanacak en fazla metin boyutu (MB) Use desktop preferences to choose document editor. Belge düzenleyiciyi seçmek için masaüstü tercihlerini kullan. Choose editor applications Display category filter as toolbar instead of button panel (needs restart). Auto-start simple search on whitespace entry. Beyaz alan girdisi olduÄŸunda basit aramayı otomatik olarak baÅŸlat. Start with advanced search dialog open. GeliÅŸmiÅŸ arama penceresi ile baÅŸla. Start with sort dialog open. Sıralama penceresi ile baÅŸla. Remember sort activation state. Sıralama kurallarını hatırla. Prefer Html to plain text for preview. Search parameters Arama parametreleri Stemming language Kök ayrıştırma dili A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. [linux kernel] (2 sözcük) araması [linux veya kernel veya (linux ifadesi 2 tane kernel)] olarak deÄŸiÅŸtirilecektir. Bu, aranacak sözcüklerin tam olarak girildiÄŸi gibi görüntülendiÄŸi sonuçlara yüksek öncelik verilmesini saÄŸlayacaktır. Automatically add phrase to simple searches Basit aramalara ifadeyi otomatik olarak ekle Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Sorgu sözcükleri kullanılarak sonuç listesi girdileri için özet oluÅŸturulsun mu ? Büyük boyutlu belgelerde yavaÅŸ olabilir. Dynamically build abstracts Özetleri dinamik olarak oluÅŸtur Do we synthetize an abstract even if the document seemed to have one? Belgenin bir özeti varsa bile bir yapay özet oluÅŸturulsun mu? Replace abstracts from documents Belgelerden özetleri kaldır Synthetic abstract size (characters) Yapay özet boyutu (karakter sayısı) Synthetic abstract context words Yapay özet sözcükleri The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Query language magic file name suffixes. Enable External Indexes Dış indeksler Toggle selected Seç /Bırak Activate All Tümünü EtkinleÅŸtir Deactivate All Tümünü PasifleÅŸtir Remove from list. This has no effect on the disk index. Listeden sil. Bu diskteki indeksi etkilemez. Remove selected Seçileni sil Click to add another index directory to the list Add index İndeks ekle Apply changes DeÄŸiÅŸiklikleri uygula &OK &TAMAM Discard changes DeÄŸiÅŸiklikleri sil &Cancel &İptal Abstract snippet separator Style sheet Opens a dialog to select the style sheet file Choose Gözat Resets the style sheet to default Lines in PRE text are not folded. Using BR loses some indentation. Use <PRE> tags instead of <BR>to display plain text as html in preview. Result List Edit result paragraph format string Edit result page html header insert Date format (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Autophrase term frequency threshold percentage recoll-1.17.3/qtgui/i18n/recoll_uk.ts000644 001750 000000 00000305633 11757435273 017753 0ustar00dockeswheel000000 000000 AdvSearch All clauses Ð’ÑÑ– Ð¿Ð¾Ð»Ñ Any clause Будь-Ñке поле texts текÑти spreadsheets таблиці presentations презентації media мультимедіа messages Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ other інше Bad multiplier suffix in size filter AdvSearchBase Advanced search Складний пошук Restrict file types Обмежити типи файлів Save as default Зберегти Ñк типові Searched file types Бажані All ----> Ð’ÑÑ– -----> Sel -----> Виб -----> <----- Sel <----- Виб <----- All <----- Ð’ÑÑ– Ignored file types Ігноровані Enter top directory for search Шукати тільки у каталозі Browse ПереглÑд Restrict results to files in subtree: Обмежити пошук по файлах з піддерева: Start Search Шукати Search for <br>documents<br>satisfying: Шукати<br>документи,</br>що задовільнÑють: Delete clause Прибрати поле Add clause Додати поле Check this to enable filtering on file types ВикориÑтовувати фільтрацію по типах файлів By categories По категоріÑÑ… Check this to use file categories instead of raw mime types ВикориÑтовувати категорії заміÑть типів MIME Close Закрити All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Ð’ÑÑ– непуÑті Ð¿Ð¾Ð»Ñ Ð±ÑƒÐ´Ðµ об'єднано за допомогою ÐБО ("уÑÑ– Ñлова") або ТР("будь-Ñкі Ñлова").<br>ÐŸÐ¾Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ "будь-Ñкі Ñлова", "уÑÑ– Ñлова" та "без цих Ñлів" приймають Ñуміш Ñлів та фраз у подвійних лапках.<br>ÐŸÐ¾Ð»Ñ Ð±ÐµÐ· даних не берутьÑÑ Ð´Ð¾ уваги. Invert Minimum size. You can use k/K,m/M,g/G as multipliers Min. Size Maximum size. You can use k/K,m/M,g/G as multipliers Max. Size Filter From To Check this to enable filtering on dates Filter dates Find Check this to enable filtering on sizes Filter sizes CronToolW Cron Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Hours (* or 0-23) Minutes (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> Enable Disable It seems that manually edited entries exist for recollindex, cannot edit crontab Error installing cron entry. Bad syntax in fields ? EditDialog Dialog FirstIdxDialog First indexing setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> Indexing configuration This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Indexing schedule This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Start indexing now IdxSchedW Index scheduling setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> Cron scheduling The tool will let you decide at what time indexing should run and will install a crontab entry. Real time indexing start up Decide if real time indexing will be started when you log in (only for the default index). ListDialog Dialog GroupBox Main No db directory in configuration Ð’ конфігурації немає каталогу БД Could not open database in Ðе можу відкрити базу даних в . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. . ÐатиÑніть Відміна, Ñкщо бажаєте відредагувати конфіґурацію до початку індекÑуваннÑ, чи OK Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ. Configuration problem (dynconf Проблема конфігурації (dynconf "history" file is damaged or un(read)writeable, please check or remove it: Preview &Search for: &Шукати: &Next &ÐаÑтупне &Previous &Попереднє Clear Стерти Match &Case &ЧутливіÑть до реєÑтру Cannot create temporary directory Ðе можу Ñтворити тимчаÑову теку Cancel Відмінити Creating preview text Створюю текÑÑ‚ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду Loading preview text into editor Завантажую текÑÑ‚ переглÑду в редактор Close Tab Закрити вкладку Missing helper program: Ðе знайдено допоміжну програму: Can't turn doc into internal representation for Ðеможливо перетворити документ на внутрішнє предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Cannot create temporary directory: Error while loading file PreviewTextEdit Show fields Показувати Ð¿Ð¾Ð»Ñ Show main text Показувати оÑновний текÑÑ‚ Print Print Current Preview Show image Select All Copy Save document to file Fold lines Preserve indentation QObject Global parameters Загальні параметри Local parameters МіÑцеві параметри <b>Customised subtrees <b>Піддерева з налаштуваннÑми The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. СпиÑок тек у індекÑованій ієрархії,<br>Ð´Ð»Ñ Ñких деÑкі параметри потрібно змінити. Типово: пуÑтий. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Ðижченаведені параметри змінюютьÑÑ Ð°Ð±Ð¾ на верхньому рівні, Ñкщо<br>не вибрано нічого або пуÑтий Ñ€Ñдок, або Ð´Ð»Ñ Ð²Ð¸Ð±Ñ€Ð°Ð½Ð¾Ñ— теки.<br>Ви можете додати або прибрати теки кнопками +/-. Skipped names ПропуÑкати назви These are patterns for file or directory names which should not be indexed. Шаблони назв файлів або тек, Ñкі не буде індекÑовано. Default character set Типове ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. КодуваннÑ, Ñке буде заÑтоÑовано при читанні файлів, Ñкі не вказують таке оÑобливо (наприклад, чиÑто текÑтових файлів).<br>Типово невказане, тоді викориÑтовуєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· Ð¾Ñ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ (локалі). Follow symbolic links Розкривати Ñимволічні поÑÐ¸Ð»Ð°Ð½Ð½Ñ Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Ходити по Ñимлінках при індекÑації. Типово "ні" Ð´Ð»Ñ ÑƒÐ½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð´ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ‚Ñ–Ð² Index all file names ІндекÑувати вÑÑ– назви файлів Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true ІндекÑувати також назви файлів, вміÑÑ‚ Ñких не може бути впізнано чи оброблено (невідомий або непідтримуваний тип MIME). Типово "так" Beagle web history RTIToolW Real time indexing automatic start <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Also start indexing daemon right now. Replacing: Replacing file Can't create: Warning ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Could not execute recollindex Deleting: Deleting file Removing autostart Autostart file deleted. Kill current process too ? RclMain Indexing in progress: ІндекÑуєтьÑÑ: Query results Результати запиту Cannot retrieve document info from database Ðе можу здобути документ з бази даних Warning ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Can't create preview window Ðе можу Ñтворити вікно переглÑду Executing: [ Виконую: [ About Recoll Про Recoll Document history ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² History data Дані Ñ–Ñторії Files Файли Purge ОчиÑтити Stemdb База коренів Closing Закриваю Unknown Ðевідомо This search is not active any more Цей пошук вже неактивний Bad viewer command line for %1: [%2] Please check the mimeconf file Ðевірний командний Ñ€Ñдок Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñдача %1: [%2] Перевірте файл mimeconf Cannot extract document or create temporary file Ðеможливо здобути документ чи Ñтворити тимчаÑовий файл (no stemming) (без Ñловоформ) (all languages) (вÑÑ– мови) error retrieving stemming languages помилка Ð·Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку мов Update &Index Поновити &Ñ–Ð½Ð´ÐµÐºÑ Indexing interrupted ІндекÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ Stop &Indexing Пе&рервати індекÑÑƒÐ²Ð°Ð½Ð½Ñ Can't start query: Ðеможливо почати запит: All вÑÑ– media медіа message Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ other інше presentation презентації spreadsheet таблиці text текÑÑ‚ sorted Ñортоване filtered фільтроване External applications/commands needed and not found for indexing your file types: ВідÑутні зовнішні додатки/команди, що потрібні Ð´Ð»Ñ Ñ–Ð½Ð´ÐµÐºÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¸Ñ… документів: No helpers found missing Ð’ÑÑ– додаткові програми наÑвні Missing helper programs ВідÑутні додаткові програми Save file dialog Зберегти файл Choose a file name to save under Оберіть ім'Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Document category filter No external viewer configured for mime type [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Can't access file: Can't uncompress file: Save file Result count (est.) Query details Деталі запиту Could not open external index. Db not open. Check external indexes list. No results found None Updating Done Monitor Indexing failed The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Erasing index Reset the index and start from scratch ? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Error Index not open Index query error Content has been indexed for these mime types: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Can't update index: indexer running Indexed MIME Types RclMainBase Recoll Recoll &File &Файл &Tools &ІнÑтрументи &Preferences &ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ &Help &Довідка Search tools ІнÑтрументи пошуку Result list СпиÑок результатів E&xit &Вихід Ctrl+Q Ctrl+Q &About Recoll Про &Recoll &User manual &Довідник кориÑтувача Document &History &ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² Document History ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² &Advanced Search &Складний пошук Advanced/complex Search Складний (поглиблений) пошук &Sort parameters &Параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Sort parameters Параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Next page ÐаÑтупна Ñторінка Next page of results ÐаÑтупна Ñторінка результатів Previous page ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñторінка Previous page of results ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñторінка результатів &Query configuration ÐšÐ¾Ð½Ñ„Ñ–Ò‘ÑƒÑ€Ð°Ñ†Ñ–Ñ &запиту Update &index &Поновити Ñ–Ð½Ð´ÐµÐºÑ Term &explorer &Ðавіґатор термінів Term explorer tool ІнÑтрумент Ð´Ð»Ñ Ð²Ð¸Ð²Ñ‡Ð°Ð½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñ–Ð² External index dialog Діалог зовнішнього індекÑу &Erase document history &ОчиÑтити Ñ–Ñторію документів First page Перша Ñторінка Go to first page of results Перейти до першої Ñторінки результатів &Indexing configuration &ÐšÐ¾Ð½Ñ„Ñ–Ò‘ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ–Ð½Ð´ÐµÐºÑÑƒÐ²Ð°Ð½Ð½Ñ All вÑÑ– &Show missing helpers ВідÑутні програми PgDown PgUp &Full Screen F11 Full Screen &Erase search history sortByDateAsc Sort by dates from oldest to newest sortByDateDesc Sort by dates from newest to oldest Show Query Details Show results as table &Rebuild index &Show indexed types Shift+PgUp &Indexing schedule E&xternal index dialog RecollModel File name Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Mime type Тип MIME Date Дата Abstract Author Document size Document date File size File date Keywords Original character set Relevancy rating Title URL Mtime Date and time Ipath MIME type ResList Result list СпиÑок результатів Unavailable document Документ недоÑÑжний Previous ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Next ÐаÑтупна <p><b>No results found</b><br> <p><b>Ðе знайдено</b><br> &Preview &ПереглÑнути Find &similar documents Знайти &Ñхожі документи Query details Деталі запиту (show query) (показати запит) Copy &File Name Копіювати &назву файла Copy &URL Копіювати &URL filtered фільтроване sorted Ñортоване Document history ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² Preview ПереглÑд Open Відкрити <p><i>Alternate spellings (accents suppressed): </i> &Write to File Preview P&arent document/folder &Open Parent document/folder &Open Documents Документи out of at least з принаймні for по ResTable &Reset sort &Delete column Save table to CSV file Can't open/create file: &Preview &ПереглÑнути &Open Copy &File Name Копіювати &назву файла Copy &URL Копіювати &URL &Write to File Find &similar documents Знайти &Ñхожі документи Preview P&arent document/folder &Open Parent document/folder &Save as CSV Add "%1" column ResTableDetailArea &Preview &ПереглÑнути &Open Copy &File Name Копіювати &назву файла Copy &URL Копіювати &URL &Write to File Find &similar documents Знайти &Ñхожі документи Preview P&arent document/folder &Open Parent document/folder SSearch Any term Будь-Ñке Ñлово All terms УÑÑ– Ñлова File name Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Completions Ð”Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Select an item: Оберіть: Too many completions Занадто багато доповнень Query language Мова запиту Bad query string Ðевірний Ñ€Ñдок запиту Out of memory ÐедоÑтатньо пам'Ñті Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Enter file name wildcard expression. Enter search terms here. Type ESC SPC for completions of current term. Введіть пошукові Ñлова. Можна викориÑтовувати Esc-пробіл Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ. SSearchBase SSearchBase SSearchBase Clear Стерти Ctrl+S Ctrl+S Erase search entry Стерти вміÑÑ‚ Ñ€Ñдка запита Search Знайти Start query Почати запит Enter search terms here. Type ESC SPC for completions of current term. Введіть пошукові Ñлова. Можна викориÑтовувати Esc-пробіл Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ. Choose search type. Оберіть тип пошуку. SearchClauseW Any of these будь-Ñкі Ñлова All of these уÑÑ– Ñлова None of these без цих Ñлів This phrase фраза Terms in proximity Ñлова поблизу File name matching назва файлу Select the type of query that will be performed with the words Виберіть тип запиту, Ñкий буде зроблено по цих Ñловах Number of additional words that may be interspersed with the chosen ones КількіÑть додаткових Ñлів, що можуть бути між обраними No field Any All вÑÑ– None Phrase Proximity File name Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ SortForm Date Дата Mime type Тип MIME SortFormBase Sort Criteria Критерії ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Sort the Сортувати most relevant results by: кращих результатів за: Descending ÑпаданнÑм Close Закрити Apply ЗаÑтоÑувати SpellBase Term Explorer Ðавіґатор термінів &Expand &Розкрити Alt+E &Close &Закрити Alt+C Alt+C Term Слово No db info. SpellW Wildcards Шаблони Regexp Регвираз Spelling/Phonetic ÐапиÑ/Ð·Ð²ÑƒÑ‡Ð°Ð½Ð½Ñ Aspell init failed. Aspell not installed? Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити aspell. Воно взагалі вÑтановлене? Aspell expansion error. Помилка Ñ€Ð¾Ð·ÐºÑ€Ð¸Ñ‚Ñ‚Ñ aspell. Stem expansion Ð Ð¾Ð·ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñловоформ error retrieving stemming languages помилка Ð·Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку мов No expansion found Ð Ð¾Ð·ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð½Ðµ знайдене Term Слово Doc. / Tot. Index: %1 documents, average length %2 terms UIPrefsDialog The selected directory does not appear to be a Xapian index Обрана тека не Ñхожа на Ñ–Ð½Ð´ÐµÐºÑ Xapian This is the main/local index! Це оÑновний/локальний індекÑ! The selected directory is already in the index list Обрана тека вже у ÑпиÑку індекÑів Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Оберіть теку із індекÑом Xapian (наприклад, /home/приÑтель/.recoll/xapiandb) error retrieving stemming languages помилка Ð·Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку мов Choose ПереглÑд UIPrefsDialogBase User interface Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Number of entries in a result page КількіÑть результатів на Ñторінку Result list font Шрифт ÑпиÑку результатів Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Відкриває діалог вибору шрифту ÑпиÑку результатів Reset Скинути Resets the result list font to the system default Повертає шрифт у типовий ÑиÑтемний Auto-start simple search on whitespace entry. Починати проÑтий пошук при введенні пробілу. Start with advanced search dialog open. Відкривати діалог Ñкладного пошуку при Ñтарті. Start with sort dialog open. Відкривати діалог ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ Ñтарті. Search parameters Параметри пошуку Stemming language Мова Ñловоформ Dynamically build abstracts Динамічно будувати конÑпекти Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Чи намагатиÑÑ Ð±ÑƒÐ´ÑƒÐ²Ð°Ñ‚Ð¸ конÑпекти Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ–Ð² пошуку, викориÑтовуючі контекÑÑ‚ знайдених Ñлів? Може працювати повільно Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… документів. Replace abstracts from documents ЗамінÑти наÑвні у документах конÑпекти Do we synthetize an abstract even if the document seemed to have one? Чи робити новий конÑпект, навіть Ñкщо ÑкийÑÑŒ вже Ñ” в документі? Synthetic abstract size (characters) Розмір Ñинтетичного конÑпекту (у Ñимволах) Synthetic abstract context words КонтекÑтних Ñлів у конÑпекті External Indexes Зовнішні індекÑи Add index Додати Ñ–Ð½Ð´ÐµÐºÑ Select the xapiandb directory for the index you want to add, then click Add Index Оберіть потрібну теку із індекÑом Xapian та натиÑніть "Додати індекÑ" Browse ПереглÑд &OK &OK Apply changes ЗаÑтоÑувати зміни &Cancel &Відміна Discard changes Відмінити зміни Result paragraph<br>format string РÑдок форматуваннÑ<br>блоку результатів Automatically add phrase to simple searches Ðвтоматично додавати фразу до проÑтих пошуків A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Пошук [rolling stones] (2 Ñлова) буде змінено на [rolling or stones or (rolling phrase 2 stones)]. Це може піднÑти результати, в Ñких пошукові Ñлова зуÑтрічаютьÑÑ Ñаме в такій поÑлідовноÑті, Ñк в запиті. User preferences Ð’Ð¿Ð¾Ð´Ð¾Ð±Ð°Ð½Ð½Ñ Use desktop preferences to choose document editor. ВикориÑтовувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´ÐµÑктопу щодо редактору документів. External indexes Зовнішні індекÑи Toggle selected Переключити вибране Activate All Включити вÑе Remove selected Видалити вибране Remove from list. This has no effect on the disk index. Видалити зі ÑпиÑку. Ðе впливає на диÑковий індекÑ. Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Визначає формат Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ блоку ÑпиÑку результатів. ВикориÑтовуйте html-формат qt та Ñхожі на printf заміни:<br>%A анотаціÑ<br> %D дата<br> %I назва піктограми<br> %K ключові Ñлова (Ñкщо Ñ”)<br> %L поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду та редагуваннÑ<br> %M тип MIME<br> %N кількіÑть результатів<br> %R релевантніÑть<br> %S розмір<br> %T назва<br> %U URL<br> Remember sort activation state. Запам'Ñтати Ñтан ÑортуваннÑ. Maximum text size highlighted for preview (megabytes) МакÑимальний розмір текÑту із підÑвічуваннÑм (Мб) Texts over this size will not be highlighted in preview (too slow). ТекÑти із розміром, більшим за вказаний, не буде підÑвічено у попередньому переглÑді (повільно). Highlight color for query terms Колір Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¸Ñ… Ñлів Deactivate All Виключити вÑе Prefer Html to plain text for preview. Віддавати перевагу HTML над текÑтом Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду. If checked, results with the same content under different names will only be shown once. Якщо увімкнене, результати Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñамим зміÑтом та різними назвами буде показано не більше одного разу. Hide duplicate results. Ховати дублікати Choose editor applications Оберіть редактори ViewAction Changing actions with different current values Зміна дій із різними поточними значеннÑми Mime type Тип MIME Command MIME type ViewActionBase File type Тип файлу Action Ð”Ñ–Ñ Select one or several file types, then click Change Action to modify the program used to open them Оберіть один або декілька типів файлів, потім натиÑніть "Змінити дію", щоб змінити програму Ð´Ð»Ñ Ð½Ð¸Ñ… Change Action Змінити дію Close Закрити Native Viewers Рідні переглÑдачі Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. confgui::ConfBeaglePanelW Steal Beagle indexing queue Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Entries will be recycled once the size is reached Web page store directory name The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Max. size for the web store (MB) confgui::ConfIndexW Can't write configuration file Ðеможливо запиÑати файл конфіґурації confgui::ConfParamFNW Browse ПереглÑд Choose ПереглÑд confgui::ConfParamSLW + + - - confgui::ConfSubPanelW Global Глобальні Max. compressed file size (KB) Межа розміру ÑтиÑнених файлів (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Це Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ñтановлює поріг розміру ÑтиÑнених файлів, більші за нього не буде опрацьовано. -1 вимикає ліміт, 0 вимикає декомпреÑÑ–ÑŽ. Max. text file size (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Text file page size (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Max. filter exec. time (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. confgui::ConfTopPanelW Top directories Верхні теки The list of directories where recursive indexing starts. Default: your home. СпиÑок тек, з Ñких починаєтьÑÑ Ñ€ÐµÐºÑƒÑ€Ñивне індекÑуваннÑ. Типово: Ð´Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñ‚ÐµÐºÐ°. Skipped paths ПропуÑкати шлÑхи Stemming languages Мови зі Ñловоформами The languages for which stemming expansion<br>dictionaries will be built. Мови, Ð´Ð»Ñ Ñких буде побудовано<br>Ñловники Ñ€Ð¾Ð·ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñловоформ. Log file name Файл журналу The file where the messages will be written.<br>Use 'stderr' for terminal output Файл, куди підуть повідомленнÑ.<br>'stderr' Ð´Ð»Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ð°Ð»Ñƒ Log verbosity level ДокладніÑть журналу This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Ð’Ñтановити обÑÑг повідомлень,<br>від помилок до даних зневадженнÑ. Index flush megabytes interval Інтервал ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу (Мб) Max disk occupation (%) МакÑимальне викориÑÑ‚Ð°Ð½Ð½Ñ Ð´Ð¸Ñку (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). ВідÑоток зайнÑтого диÑку, коли індекÑÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ зупинено (щоб уникнути Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð´Ð¾Ñтупного проÑтору).<br>Типово: 0 (без ліміту). No aspell usage Ðе викориÑтовувати aspell Aspell language Мова aspell The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Мова Ñловника aspell. Має виглÑдати Ñк 'en' або 'uk'...<br>Якщо не вÑтановлене, буде викориÑтане Ð¾Ñ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ (локаль), що зазвичай робить. Щоб з'ÑÑувати, що маємо на ÑиÑтемі, наберіть 'aspell config' та переглÑньте файли .dat у теці 'data-dir'. Database directory name Тека бази даних The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Ðазва теки, де міÑтитьÑÑ Ñ–Ð½Ð´ÐµÐºÑ<br>ВідноÑний шлÑÑ… буде трактовано відноÑно теки конфіґурації. Типово: 'xapiandb'. Use system's 'file' command ВикориÑтовувати ÑиÑтемну 'file' Use the system's 'file' command if internal<br>mime type identification fails. ВикориÑтовувати команду 'file' з ÑиÑтеми, коли внутрішнє<br>Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ MIME дає збій. These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Це назви тек, у Ñкі індекÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ потрапить.<br> Може міÑтити шаблони. Має Ñпівпадати із шлÑхами, що бачить індекÑатор (наприклад, Ñкщо topdirs міÑтить '/home/me' та '/home' Ñ” поÑиланнÑм на '/usr/home', то вірний Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ´Ðµ '/home/me/tmp*', а не '/usr/home/me/tmp*') This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Скільки даних буде проіндекÑовано між ÑкиданнÑми індекÑу на диÑк.<br>Допомагає контролювати викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼'Ñті індекÑатором. Типово: 10Мб Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Вимикає викориÑÑ‚Ð°Ð½Ð½Ñ aspell Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ— наближень у напиÑÐ°Ð½Ð½Ñ Ð² навіґаторі термінів.<br>КориÑне, коли aspell відÑутній або зламаний. uiPrefsDialogBase User preferences Ð’Ð¿Ð¾Ð´Ð¾Ð±Ð°Ð½Ð½Ñ User interface Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Number of entries in a result page КількіÑть результатів на Ñторінку If checked, results with the same content under different names will only be shown once. Якщо увімкнене, результати Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñамим зміÑтом та різними назвами буде показано не більше одного разу. Hide duplicate results. Ховати дублікати Highlight color for query terms Колір Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¸Ñ… Ñлів Result list font Шрифт ÑпиÑку результатів Opens a dialog to select the result list font Відкриває діалог вибору шрифту ÑпиÑку результатів Helvetica-10 Helvetica-10 Resets the result list font to the system default Повертає шрифт у типовий ÑиÑтемний Reset Скинути Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Визначає формат Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ блоку ÑпиÑку результатів. ВикориÑтовуйте html-формат qt та Ñхожі на printf заміни:<br>%A анотаціÑ<br> %D дата<br> %I назва піктограми<br> %K ключові Ñлова (Ñкщо Ñ”)<br> %L поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду та редагуваннÑ<br> %M тип MIME<br> %N кількіÑть результатів<br> %R релевантніÑть<br> %S розмір<br> %T назва<br> %U URL<br> Result paragraph<br>format string РÑдок форматуваннÑ<br>блоку результатів Texts over this size will not be highlighted in preview (too slow). ТекÑти із розміром, більшим за вказаний, не буде підÑвічено у попередньому переглÑді (повільно). Maximum text size highlighted for preview (megabytes) МакÑимальний розмір текÑту із підÑвічуваннÑм (Мб) Use desktop preferences to choose document editor. ВикориÑтовувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´ÐµÑктопу щодо редактору документів. Choose editor applications Оберіть редактори Display category filter as toolbar instead of button panel (needs restart). Auto-start simple search on whitespace entry. Починати проÑтий пошук при введенні пробілу. Start with advanced search dialog open. Відкривати діалог Ñкладного пошуку при Ñтарті. Start with sort dialog open. Відкривати діалог ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ Ñтарті. Remember sort activation state. Запам'Ñтати Ñтан ÑортуваннÑ. Prefer Html to plain text for preview. Віддавати перевагу HTML над текÑтом Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду. Search parameters Параметри пошуку Stemming language Мова Ñловоформ A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Пошук [rolling stones] (2 Ñлова) буде змінено на [rolling or stones or (rolling phrase 2 stones)]. Це може піднÑти результати, в Ñких пошукові Ñлова зуÑтрічаютьÑÑ Ñаме в такій поÑлідовноÑті, Ñк в запиті. Automatically add phrase to simple searches Ðвтоматично додавати фразу до проÑтих пошуків Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Чи намагатиÑÑ Ð±ÑƒÐ´ÑƒÐ²Ð°Ñ‚Ð¸ конÑпекти Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ–Ð² пошуку, викориÑтовуючі контекÑÑ‚ знайдених Ñлів? Може працювати повільно Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… документів. Dynamically build abstracts Динамічно будувати конÑпекти Do we synthetize an abstract even if the document seemed to have one? Чи робити новий конÑпект, навіть Ñкщо ÑкийÑÑŒ вже Ñ” в документі? Replace abstracts from documents ЗамінÑти наÑвні у документах конÑпекти Synthetic abstract size (characters) Розмір Ñинтетичного конÑпекту (у Ñимволах) Synthetic abstract context words КонтекÑтних Ñлів у конÑпекті The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Query language magic file name suffixes. Enable External Indexes Зовнішні індекÑи Toggle selected Переключити вибране Activate All Включити вÑе Deactivate All Виключити вÑе Remove from list. This has no effect on the disk index. Видалити зі ÑпиÑку. Ðе впливає на диÑковий індекÑ. Remove selected Видалити вибране Click to add another index directory to the list Add index Додати Ñ–Ð½Ð´ÐµÐºÑ Apply changes ЗаÑтоÑувати зміни &OK &OK Discard changes Відмінити зміни &Cancel &Відміна Abstract snippet separator Style sheet Opens a dialog to select the style sheet file Choose ПереглÑд Resets the style sheet to default Lines in PRE text are not folded. Using BR loses some indentation. Use <PRE> tags instead of <BR>to display plain text as html in preview. Result List Edit result paragraph format string Edit result page html header insert Date format (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Autophrase term frequency threshold percentage recoll-1.17.3/qtgui/i18n/recoll_xx.ts000644 001750 000000 00000217463 11757435273 017776 0ustar00dockeswheel000000 000000 AdvSearch All clauses Any clause texts spreadsheets presentations media messages other Bad multiplier suffix in size filter AdvSearchBase Advanced search Search for <br>documents<br>satisfying: Delete clause Add clause Restrict file types Check this to enable filtering on file types By categories Check this to use file categories instead of raw mime types Save as default Searched file types All ----> Sel -----> <----- Sel <----- All Ignored file types Enter top directory for search Browse Restrict results to files in subtree: Start Search Close All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Invert Minimum size. You can use k/K,m/M,g/G as multipliers Min. Size Maximum size. You can use k/K,m/M,g/G as multipliers Max. Size Filter From To Check this to enable filtering on dates Filter dates Find Check this to enable filtering on sizes Filter sizes CronToolW Cron Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Hours (* or 0-23) Minutes (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> Enable Disable It seems that manually edited entries exist for recollindex, cannot edit crontab Error installing cron entry. Bad syntax in fields ? EditDialog Dialog FirstIdxDialog First indexing setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> Indexing configuration This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Indexing schedule This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Start indexing now IdxSchedW Index scheduling setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> Cron scheduling The tool will let you decide at what time indexing should run and will install a crontab entry. Real time indexing start up Decide if real time indexing will be started when you log in (only for the default index). ListDialog Dialog GroupBox Main No db directory in configuration "history" file is damaged or un(read)writeable, please check or remove it: Preview Close Tab Cancel Missing helper program: Can't turn doc into internal representation for Creating preview text Loading preview text into editor &Search for: &Next &Previous Clear Match &Case Cannot create temporary directory: Error while loading file PreviewTextEdit Show fields Show main text Print Print Current Preview Show image Select All Copy Save document to file Fold lines Preserve indentation QObject Global parameters Local parameters <b>Customised subtrees The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. Skipped names These are patterns for file or directory names which should not be indexed. Default character set This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Follow symbolic links Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Index all file names Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Beagle web history RTIToolW Real time indexing automatic start <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Also start indexing daemon right now. Replacing: Replacing file Can't create: Warning Could not execute recollindex Deleting: Deleting file Removing autostart Autostart file deleted. Kill current process too ? RclMain (no stemming) (all languages) error retrieving stemming languages Indexing in progress: Purge Stemdb Closing Unknown Query results Cannot retrieve document info from database Warning Can't create preview window This search is not active any more Bad viewer command line for %1: [%2] Please check the mimeconf file Cannot extract document or create temporary file Executing: [ About Recoll History data Document history Update &Index Stop &Indexing All media message other presentation spreadsheet text sorted filtered External applications/commands needed and not found for indexing your file types: No helpers found missing Missing helper programs Document category filter No external viewer configured for mime type [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Can't access file: Can't uncompress file: Save file Result count (est.) Query details Could not open external index. Db not open. Check external indexes list. No results found None Updating Done Monitor Indexing failed The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Erasing index Reset the index and start from scratch ? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Error Index not open Index query error Content has been indexed for these mime types: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Can't update index: indexer running Indexed MIME Types RclMainBase Recoll Search tools Result list &File &Tools &Preferences &Help E&xit Ctrl+Q Update &index &Erase document history &About Recoll &User manual Document &History Document History &Advanced Search Advanced/complex Search &Sort parameters Sort parameters Term &explorer Term explorer tool Next page Next page of results First page Go to first page of results Previous page Previous page of results &Query configuration External index dialog &Indexing configuration All &Show missing helpers PgDown PgUp &Full Screen F11 Full Screen &Erase search history sortByDateAsc Sort by dates from oldest to newest sortByDateDesc Sort by dates from newest to oldest Show Query Details Show results as table &Rebuild index &Show indexed types Shift+PgUp &Indexing schedule E&xternal index dialog RecollModel Abstract Author Document size Document date File size File name File date Keywords Original character set Relevancy rating Title URL Mtime Date Date and time Ipath MIME type ResList Result list (show query) &Preview Copy &File Name Copy &URL Find &similar documents Document history <p><b>No results found</b><br> Previous Next Unavailable document Preview Open <p><i>Alternate spellings (accents suppressed): </i> &Write to File Preview P&arent document/folder &Open Parent document/folder &Open Documents out of at least for ResTable &Reset sort &Delete column Save table to CSV file Can't open/create file: &Preview &Open Copy &File Name Copy &URL &Write to File Find &similar documents Preview P&arent document/folder &Open Parent document/folder &Save as CSV Add "%1" column ResTableDetailArea &Preview &Open Copy &File Name Copy &URL &Write to File Find &similar documents Preview P&arent document/folder &Open Parent document/folder SSearch Any term All terms File name Query language Bad query string Out of memory Too many completions Completions Select an item: Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Enter file name wildcard expression. Enter search terms here. Type ESC SPC for completions of current term. SSearchBase SSearchBase Clear Ctrl+S Erase search entry Search Start query Enter search terms here. Type ESC SPC for completions of current term. Choose search type. SearchClauseW Select the type of query that will be performed with the words Number of additional words that may be interspersed with the chosen ones No field Any All None Phrase Proximity File name SpellBase Term Explorer &Expand Alt+E &Close Alt+C No db info. SpellW Wildcards Regexp Stem expansion Spelling/Phonetic error retrieving stemming languages Aspell init failed. Aspell not installed? Aspell expansion error. No expansion found Term Doc. / Tot. Index: %1 documents, average length %2 terms UIPrefsDialog error retrieving stemming languages The selected directory does not appear to be a Xapian index This is the main/local index! The selected directory is already in the index list Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Choose ViewAction Changing actions with different current values Command MIME type ViewActionBase Native Viewers Select one or several file types, then click Change Action to modify the program used to open them Change Action Close Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. confgui::ConfBeaglePanelW Steal Beagle indexing queue Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Entries will be recycled once the size is reached Web page store directory name The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Max. size for the web store (MB) confgui::ConfIndexW Can't write configuration file confgui::ConfParamFNW Choose confgui::ConfParamSLW + - confgui::ConfSubPanelW Global Max. compressed file size (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Max. text file size (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Text file page size (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Max. filter exec. time (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. confgui::ConfTopPanelW Top directories The list of directories where recursive indexing starts. Default: your home. Skipped paths These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Stemming languages The languages for which stemming expansion<br>dictionaries will be built. Log file name The file where the messages will be written.<br>Use 'stderr' for terminal output Log verbosity level This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Index flush megabytes interval This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Max disk occupation (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). No aspell usage Aspell language The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Database directory name The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Use system's 'file' command Use the system's 'file' command if internal<br>mime type identification fails. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. uiPrefsDialogBase User preferences User interface Number of entries in a result page If checked, results with the same content under different names will only be shown once. Hide duplicate results. Highlight color for query terms Result list font Opens a dialog to select the result list font Helvetica-10 Resets the result list font to the system default Reset Texts over this size will not be highlighted in preview (too slow). Maximum text size highlighted for preview (megabytes) Use desktop preferences to choose document editor. Choose editor applications Display category filter as toolbar instead of button panel (needs restart). Auto-start simple search on whitespace entry. Start with advanced search dialog open. Remember sort activation state. Prefer Html to plain text for preview. Search parameters Stemming language A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Automatically add phrase to simple searches Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Dynamically build abstracts Do we synthetize an abstract even if the document seemed to have one? Replace abstracts from documents Synthetic abstract size (characters) Synthetic abstract context words The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Query language magic file name suffixes. Enable External Indexes Toggle selected Activate All Deactivate All Remove from list. This has no effect on the disk index. Remove selected Click to add another index directory to the list Add index Apply changes &OK Discard changes &Cancel Abstract snippet separator Style sheet Opens a dialog to select the style sheet file Choose Resets the style sheet to default Lines in PRE text are not folded. Using BR loses some indentation. Use <PRE> tags instead of <BR>to display plain text as html in preview. Result List Edit result paragraph format string Edit result page html header insert Date format (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Autophrase term frequency threshold percentage recoll-1.17.3/qtgui/i18n/recoll_zh.ts000644 001750 000000 00000314731 11757435321 017746 0ustar00dockeswheel000000 000000 AdvSearch All clauses 全部æ¡ä»¶ Any clause ä»»æ„æ¡ä»¶ texts 文本 spreadsheets 电å­è¡¨æ ¼ presentations 演示文稿 media 多媒体文件 messages 邮件 other 其它 Bad multiplier suffix in size filter 文件尺寸过滤器的åŽç¼€å•ä½ä¸æ­£ç¡® AdvSearchBase Advanced search 高端æœç´¢ Search for <br>documents<br>satisfying: æœç´¢<br>满足以下æ¡ä»¶<br>的文档: Delete clause 删除æ¡ä»¶ Add clause 添加æ¡ä»¶ Restrict file types é™å®šæ–‡ä»¶ç±»åž‹ Check this to enable filtering on file types 选中这个,以便针对文件类型进行过滤 By categories 按大类æ¥è¿‡æ»¤ Check this to use file categories instead of raw mime types 选中这个,以便使用较大的分类,而ä¸ä½¿ç”¨å…·ä½“的文件类型 Save as default ä¿å­˜ä¸ºé»˜è®¤å€¼ Searched file types 将被æœç´¢çš„æ–‡ä»¶ç±»åž‹ All ----> 移动全部→ Sel -----> 移动选中项→ <----- Sel â†ç§»åЍ选䏭项 <----- All â†ç§»åŠ¨å…¨éƒ¨ Ignored file types è¦å¿½ç•¥çš„æ–‡ä»¶ç±»åž‹ Enter top directory for search è¾“å…¥è¦æœç´¢çš„æœ€ä¸Šå±‚目录 Browse æµè§ˆ Restrict results to files in subtree: 将结果中的文件é™å®šåœ¨æ­¤å­ç›®å½•树中: Start Search 开始æœç´¢ Close 关闭 All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. å³è¾¹çš„æ‰€æœ‰éžç©ºå­—段都会按照逻辑与(“全部æ¡ä»¶â€é€‰é¡¹ï¼‰æˆ–é€»è¾‘æˆ–ï¼ˆâ€œä»»æ„æ¡ä»¶â€é€‰é¡¹ï¼‰æ¥ç»„åˆã€‚<br>“任æ„â€â€œå…¨éƒ¨â€å’Œâ€œæ— â€ä¸‰ç§å­—段类型都接å—输入简å•è¯è¯­å’ŒåŒå¼•å·å¼•用的è¯ç»„的组åˆã€‚<br>空的输入框会被忽略。 Invert å转过滤æ¡ä»¶ Minimum size. You can use k/K,m/M,g/G as multipliers 最å°å°ºå¯¸ã€‚ä½ å¯ä½¿ç”¨k/Kã€m/Mã€g/G作为å•ä½ Min. Size 最å°å°ºå¯¸ Maximum size. You can use k/K,m/M,g/G as multipliers 最大尺寸。你å¯ä½¿ç”¨k/Kã€m/Mã€g/G作为å•ä½ Max. Size 最大尺寸 Filter 过滤 From 从 To 到 Check this to enable filtering on dates 选中这个,以便针对日期进行过滤 Filter dates 过滤日期 Find 查找 Check this to enable filtering on sizes 选中这个,以便针对文件尺寸进行过滤 Filter sizes 过滤尺寸 CronToolW Cron Dialog è®¡åˆ’ä»»åŠ¡å¯¹è¯æ¡† <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T19:47:37" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T19:56:53" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } .T3 { font-style:italic; } .T4 { font-family:Courier New,courier; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> 批é‡ç´¢å¼•计划任务(cron) </p><p class="P1">æ¯ä¸ªå­—段都å¯ä»¥åŒ…括一个通é…符(*)ã€å•个数字值ã€é€—å·åˆ†éš”的列表(1,3,5)和范围(1-7)。更准确地说,这些字段会被<span class="T3">按原样</span>输出到crontab 文件中,因此这里å¯ä»¥ä½¿ç”¨crontab 的所有语法,å‚考crontab(5)。</p><p class="P1"><br/>例如,在<span class="T3">日期</span>中输入<span class="T4">*</span>,<span class="T3">å°æ—¶</span>中输入<span class="T4">12,19</span>,<span class="T3">分钟</span>中输入<span class="T4">15 </span>çš„è¯ï¼Œä¼šåœ¨æ¯å¤©çš„12:15 AM å’Œ7:15 PMå¯åЍrecollindex。</p><p class="P1">ä¸€ä¸ªé¢‘ç¹æ‰§è¡Œçš„计划任务,其性能å¯èƒ½æ¯”ä¸ä¸Šå®žæ—¶ç´¢å¼•。</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) 星期日(*或0-7,0或7是指星期天) Hours (* or 0-23) å°æ—¶(*或0-23) Minutes (0-59) 分钟(0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:08:00" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:11:47" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T2 { font-style:italic; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1">点击<span class="T2">ç¦ç”¨</span>ä»¥åœæ­¢è¿›è¡Œè‡ªåŠ¨åŒ–çš„æ‰¹é‡ç´¢å¼•,点击<span class="T2">å¯ç”¨</span>以å¯ç”¨æ­¤åŠŸèƒ½ï¼Œç‚¹å‡»<span class="T2">å–æ¶ˆ</span>åˆ™ä¸æ”¹å˜ä»»ä½•东西。</p></body></html> Enable å¯ç”¨ Disable ç¦ç”¨ It seems that manually edited entries exist for recollindex, cannot edit crontab 看起æ¥å·²ç»æœ‰æ‰‹åŠ¨ç¼–è¾‘è¿‡çš„recollindexæ¡ç›®äº†ï¼Œå› æ­¤æ— æ³•编辑crontab Error installing cron entry. Bad syntax in fields ? æ’å…¥cronæ¡ç›®æ—¶å‡ºé”™ã€‚请检查语法。 EditDialog Dialog å¯¹è¯æ¡† FirstIdxDialog First indexing setup 第一次索引设置 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:14:44" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:23:13" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T2 { font-weight:bold; } .T4 { font-style:italic; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T2">未找到对应于此é…置实例的索引数æ®ã€‚</span><br/><br/>å¦‚æžœä½ åªæƒ³ä»¥ä¸€ç»„åˆç†çš„é»˜è®¤å‚æ•°æ¥ç´¢å¼•你的家目录的è¯ï¼Œå°±ç›´æŽ¥æŒ‰<span class="T4">ç«‹å³å¼€å§‹ç´¢å¼•</span>按钮。以åŽè¿˜å¯ä»¥è°ƒæ•´é…ç½®å‚æ•°çš„。</p><p class="P1">如果你想调整æŸäº›ä¸œè¥¿çš„è¯ï¼Œå°±ä½¿ç”¨ä¸‹é¢çš„链接æ¥è°ƒæ•´å…¶ä¸­çš„索引é…置和定时计划å§ã€‚</p><p class="P1">这些工具å¯åœ¨ä»¥åŽé€šè¿‡<span class="T4">选项</span>èœå•访问。</p></body></html> Indexing configuration 索引é…ç½® This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. 在这里å¯ä»¥è°ƒæ•´ä½ æƒ³è¦å¯¹å…¶è¿›è¡Œç´¢å¼•的目录,以åŠå…¶å®ƒå‚æ•°ï¼Œä¾‹å¦‚ï¼šè¦æŽ’é™¤å’Œè·¯å¾„æˆ–åå­—ã€é»˜è®¤å­—符集…… Indexing schedule 定时索引任务 This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). 在这里å¯ä»¥é€‰æ‹©æ˜¯è¦è¿›è¡Œæ‰¹é‡ç´¢å¼•还是实时索引,还å¯ä»¥è®¾ç½®ä¸€ä¸ªè‡ªåŠ¨åŒ–çš„å®šæ—¶ï¼ˆä½¿ç”¨cron)批é‡ç´¢å¼•任务。 Start indexing now ç«‹å³å¼€å§‹ç´¢å¼• IdxSchedW Index scheduling setup 定时索引设置 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:27:11" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:30:49" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> 索引程åºå¯æŒç»­è¿è¡Œå¹¶ä¸”在文件å‘生å˜åŒ–时对其进行索引,也å¯ä»¥é—´éš”一定时间è¿è¡Œä¸€æ¬¡ã€‚</p><p class="P1">ä½ å¯ä»¥è¯»ä¸€ä¸‹æ‰‹å†Œï¼Œä»¥ä¾¿æ›´å¥½åœ°åšå‡ºæŠ‰æ‹©ï¼ˆæŒ‰F1)。</p><p class="P1">这个工具å¯å¸®åŠ©ä½ è®¾ç½®ä¸€ä¸ªè‡ªåŠ¨è¿›è¡Œæ‰¹é‡ç´¢å¼•的定时任务,或者设置æˆå½“你登录时便å¯åŠ¨å®žæ—¶ç´¢å¼•ï¼ˆæˆ–è€…ä¸¤è€…åŒæ—¶è¿›è¡Œï¼Œå½“然那几乎没有æ„义)。</p></body></html> Cron scheduling 定时任务 The tool will let you decide at what time indexing should run and will install a crontab entry. 这个工具帮助你确定一个让索引è¿è¡Œçš„æ—¶é—´ï¼Œå®ƒä¼šæ’入一个crontabæ¡ç›®ã€‚ Real time indexing start up 实时索引设置 Decide if real time indexing will be started when you log in (only for the default index). 作出决定,是å¦è¦åœ¨ç™»å½•时便å¯åŠ¨å®žæ—¶ç´¢å¼•ï¼ˆåªå¯¹é»˜è®¤ç´¢å¼•有效)。 ListDialog Dialog å¯¹è¯æ¡† GroupBox 分组框 Main No db directory in configuration é…置实例中没有数æ®åº“目录 "history" file is damaged or un(read)writeable, please check or remove it: "history"文件被æŸå,或者ä¸å¯ï¼ˆè¯»ï¼‰å†™ï¼Œè¯·æ£€æŸ¥ä¸€ä¸‹æˆ–者删除它: Preview Close Tab 关闭标签页 Cancel å–æ¶ˆ Missing helper program: 缺少辅助程åºï¼š Can't turn doc into internal representation for æ— æ³•ä¸ºæ­¤æ–‡ä»¶å°†æ–‡æ¡£è½¬æ¢æˆå†…部表示方å¼ï¼š Creating preview text 正在创建预览文本 Loading preview text into editor 正在将预览文本载入到编辑器中 &Search for: æœç´¢ï¼ˆ&S): &Next 下一个(&N) &Previous 上一个(&P) Clear 清空 Match &Case 匹é…大å°å†™ï¼ˆ&C) Cannot create temporary directory: 无法创建临时目录: Error while loading file 文件载入出错 PreviewTextEdit Show fields 显示字段 Show main text 显示主文本 Print æ‰“å° Print Current Preview 打å°å½“å‰é¢„览文本 Show image 显示图片 Select All 全选 Copy å¤åˆ¶ Save document to file 将文档ä¿å­˜åˆ°æ–‡ä»¶ Fold lines 自动æ¢è¡Œ Preserve indentation ä¿ç•™ç¼©è¿›ç¬¦ QObject Global parameters 免局傿•° Local parameters å±€éƒ¨å‚æ•° <b>Customised subtrees <b>自定义的å­ç›®å½•æ ‘ The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. 这是已索引的目录树中的一些å­ç›®å½•组æˆçš„列表<br>,它们的æŸäº›å‚数需è¦é‡å®šä¹‰ã€‚默认:空白。 <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>ä»¥ä¸‹çš„å‚æ•°ï¼Œå½“你在上é¢çš„列表中ä¸é€‰ä¸­ä»»ä½•æ¡ç›®æˆ–者选中一个空行时,<br>就是针对顶级目录起作用的,å¦åˆ™ä¾¿æ˜¯å¯¹é€‰ä¸­çš„å­ç›®å½•起作用的。<br>ä½ å¯ä»¥ç‚¹å‡»+/-按钮,以便添加或删除目录。 Skipped names è¦ç•¥è¿‡çš„æ–‡ä»¶å These are patterns for file or directory names which should not be indexed. 具有这些模å¼çš„æ–‡ä»¶æˆ–目录ä¸ä¼šè¢«ç´¢å¼•。 Default character set 默认字符集 This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. 这是用æ¥è¯»å–那些未标明自身的字符集的文件时所使用的字符集,例如纯文本文件。<br>é»˜è®¤å€¼æ˜¯ç©ºï¼Œä¼šä½¿ç”¨ç³»ç»Ÿé‡Œçš„è‡ªç„¶è¯­è¨€çŽ¯å¢ƒå‚æ•°ä¸­çš„值。 Follow symbolic links 跟踪符å·é“¾æŽ¥ Follow symbolic links while indexing. The default is no, to avoid duplicate indexing 在索引时跟踪符å·é“¾æŽ¥ã€‚默认是ä¸è·Ÿè¸ªçš„,以é¿å…é‡å¤ç´¢å¼• Index all file names 对所有文件å进行索引 Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true 对那些无法判断或处ç†å…¶å†…容(未知类型或其类型ä¸è¢«æ”¯æŒï¼‰çš„æ–‡ä»¶çš„å字进行索引。默认为是 Beagle web history Beagleç½‘é¡µåŽ†å² RTIToolW Real time indexing automatic start 实时索引自动å¯åЍ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T21:00:38" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T21:02:43" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> 索引程åºå¯ä»¥ä»¥å®ˆæŠ¤è¿›ç¨‹çš„æ–¹å¼è¿è¡Œï¼Œåœ¨æ–‡ä»¶å‘生å˜åŒ–æ—¶ä¾¿å®žæ—¶æ›´æ–°ç´¢å¼•ã€‚è¿™æ ·ä½ çš„ç´¢å¼•ä¸€ç›´æ˜¯ä¸Žæ–‡ä»¶åŒæ­¥çš„,但是会å ç”¨ä¸€å®šçš„系统资æºã€‚</p></body></html> Start indexing daemon with my desktop session. 在我的桌é¢ä¼šè¯å¯åŠ¨æ—¶ä¾¿å¯åŠ¨ç´¢å¼•è¿›ç¨‹ã€‚ Also start indexing daemon right now. åŒæ—¶æ­¤æ¬¡ä¹Ÿç«‹å³å¯åŠ¨ç´¢å¼•è¿›ç¨‹ã€‚ Replacing: 正在替æ¢ï¼š Replacing file æ­£åœ¨æ›¿æ¢æ–‡ä»¶ Can't create: 无法创建: Warning 警告 Could not execute recollindex 无法执行recollindex Deleting: 正在删除: Deleting file 正在删除文件 Removing autostart 正在删除自动å¯åЍ项 Autostart file deleted. Kill current process too ? 自动å¯åŠ¨æ–‡ä»¶å·²ç»åˆ é™¤ã€‚ä¹Ÿè¦æ€æ­»å½“å‰è¿›ç¨‹å—? RclMain (no stemming) (ä¸è¿›è¡Œè¯æ ¹è®¡ç®—) (all languages) ï¼ˆå¯¹å…¨éƒ¨è¯­è¨€è¿›è¡Œè¯æ ¹è®¡ç®—) error retrieving stemming languages æå–è¯æ ¹è¯­è¨€æ—¶å‡ºé”™ Indexing in progress: 正在索引: Purge 删除 Stemdb Stemæ•°æ®åº“ Closing 正在关闭 Unknown 未知 Query results 查询结果 Cannot retrieve document info from database 无法从数æ®åº“èŽ·å–æ–‡æ¡£ä¿¡æ¯ Warning 警告 Can't create preview window æ— æ³•åˆ›å»ºé¢„è§ˆçª—å£ This search is not active any more 这个查询已ç»ä¸æ˜¯æ´»è·ƒçš„了 Bad viewer command line for %1: [%2] Please check the mimeconf file 针对%1的查看命令[%2]é…置出错 请检查mimeconf文件 Cannot extract document or create temporary file 无法æå–文档或创建临时文件 Executing: [ 正在执行:[ About Recoll Recoll说明 History data åŽ†å²æ•°æ® Document history æ–‡æ¡£åŽ†å² Update &Index 更新索引(&I) Stop &Indexing åœæ­¢ç´¢å¼•(&I) All 全部 media 多媒体文件 message 邮件 other 其它 presentation 演示文档 spreadsheet 电å­è¡¨æ ¼ text 文本文件 sorted å·²æŽ’åº filtered 已过滤 External applications/commands needed and not found for indexing your file types: 需è¦ç”¨æ¥è¾…助对你的文件进行索引,å´åˆæ‰¾ä¸åˆ°çš„外部程åº/命令: No helpers found missing ç›®å‰ä¸ç¼ºå°‘ä»»ä½•è¾…åŠ©ç¨‹åº Missing helper programs æœªæ‰¾åˆ°çš„è¾…åŠ©ç¨‹åº Document category filter 文档分类过滤器 No external viewer configured for mime type [ é’ˆå¯¹æ­¤ç§æ–‡ä»¶ç±»åž‹æ²¡æœ‰é…置外部查看器[ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? 没有找到mimeview中为%1: %2é…置的查看器。 是å¦è¦æ‰“å¼€é€‰é¡¹å¯¹è¯æ¡†ï¼Ÿ Can't access file: 无法访问文件: Can't uncompress file: 无法解压缩此文件: Save file ä¿å­˜æ–‡ä»¶ Result count (est.) 结果数(估计值) Query details 查询语å¥ç»†èŠ‚ Could not open external index. Db not open. Check external indexes list. 无法打开外部索引。数æ®åº“未打开。请检查外部索引列表。 No results found 未找到结果 None æ—  Updating 正在更新 Done å·²å®Œæˆ Monitor 监视器 Indexing failed 索引失败 The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone 当å‰ç´¢å¼•è¿›ç¨‹ä¸æ˜¯ç”±æ­¤ç•Œé¢å¯åŠ¨çš„ã€‚ç‚¹å‡»ç¡®å®šä»¥æ€æ­»å®ƒï¼Œæˆ–è€…ç‚¹å‡»å–æ¶ˆä»¥è®©å®ƒè‡ªç”±è¿è¡Œ Erasing index 正在删除索引 Reset the index and start from scratch ? ä»Žå¤´é‡æ–°å¼€å§‹ç´¢å¼•å—? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program 查询正在进行中。<br>由于索引库的æŸäº›é™åˆ¶ï¼Œ<br>å–æ¶ˆçš„è¯ä¼šå¯¼è‡´ç¨‹åºé€€å‡º Error 错误 Index not open 索引未打开 Index query error 索引查询出错 Content has been indexed for these mime types: å·²ç»ä¸ºè¿™äº›æ–‡ä»¶ç±»åž‹ç´¢å¼•其内容: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. æ­¤æ–‡ä»¶çš„ç´¢å¼•å·²è¿‡æ—¶ã€‚ç¨‹åºæ‹’ç»æ˜¾ç¤ºé”™è¯¯çš„æ¡ç›®ã€‚è¯·ç‚¹å‡»ç¡®å®šä»¥æ›´æ–°æ­¤æ–‡ä»¶çš„ç´¢å¼•ï¼Œç­‰å¾…ç´¢å¼•å®Œæˆä¹‹åŽå†æŸ¥è¯¢ã€‚æˆ–è€…ï¼Œå–æ¶ˆã€‚ Can't update index: indexer running 无法更新索引:索引程åºå·²åœ¨è¿è¡Œ Indexed MIME Types 已索引的文件类型 RclMainBase Recoll Recoll Search tools æœç´¢å·¥å…· Result list 结果列表 &File 文件(&F) &Tools 工具(&T) &Preferences 选项(&P) &Help 帮助(&H) E&xit 退出(&x) Ctrl+Q Ctrl+Q Update &index 更新索引(&i) &Erase document history 删除文档历å²ï¼ˆ&E) &About Recoll Recoll说明(&A) &User manual 用户手册(&U) Document &History 文档历å²ï¼ˆ&H) Document History æ–‡æ¡£åŽ†å² &Advanced Search 高端æœç´¢ï¼ˆ&A) Advanced/complex Search 高端/夿‚æœç´¢ &Sort parameters 排åºå‚数(&S) Sort parameters 排åºå‚æ•° Term &explorer è¯è¯­æŽ¢ç´¢å™¨ï¼ˆ&e) Term explorer tool è¯è¯­æŽ¢ç´¢å™¨ Next page 下一页 Next page of results 下一页结果 First page 第一页 Go to first page of results 跳转到结果的第一页 Previous page 上一页 Previous page of results 上一页结果 &Query configuration 查询é…置(&Q) External index dialog å¤–éƒ¨ç´¢å¼•å¯¹è¯æ¡† &Indexing configuration 索引é…置(&I) All 全部 &Show missing helpers 显示缺少的辅助程åºåˆ—表(&S) PgDown å‘下翻页 PgUp å‘上翻页 &Full Screen å…¨å±ï¼ˆ&F) F11 F11 Full Screen å…¨å± &Erase search history 删除æœç´¢åކå²ï¼ˆ&E) sortByDateAsc 按日期å‡åºæŽ’列 Sort by dates from oldest to newest 按日期排列,最旧的在å‰é¢ sortByDateDesc 按日期é™åºæŽ’列 Sort by dates from newest to oldest 按日期排列,最新的在å‰é¢ Show Query Details 显示查询语å¥ç»†èŠ‚ Show results as table ä»¥è¡¨æ ¼çš„å½¢å¼æ˜¾ç¤ºç»“æžœ &Rebuild index 釿–°æž„造索引(&R) &Show indexed types 显示已索引的文件类型(&S) Shift+PgUp Shift+å‘上翻页 &Indexing schedule 定时索引(&I) E&xternal index dialog å¤–éƒ¨ç´¢å¼•å¯¹è¯æ¡†ï¼ˆ&x) RecollModel Abstract æ‘˜è¦ Author 作者 Document size 文档尺寸 Document date 文档日期 File size 文件尺寸 File name 文件å File date 文件日期 Keywords å…³é”®è¯ Original character set 原字符集 Relevancy rating 相关度 Title 标题 URL 路径 Mtime 修改时间 Date 日期 Date and time æ—¥æœŸåŠæ—¶é—´ Ipath 内部路径 MIME type 文件类型 ResList Result list 结果列表 (show query) (显示查询语å¥ç»†èŠ‚ï¼‰ &Preview 预览(&P) Copy &File Name å¤åˆ¶æ–‡ä»¶å(&F) Copy &URL å¤åˆ¶è·¯å¾„(&U) Find &similar documents 查找类似的文档(&s) Document history æ–‡æ¡£åŽ†å² <p><b>No results found</b><br> <p><b>未找到结果</b><br> Previous 上一页 Next 下一页 Unavailable document 无法访问文档 Preview 预览 Open 打开 <p><i>Alternate spellings (accents suppressed): </i> <p><i>其它拼写形å¼ï¼ˆå¿½è§†å£éŸ³ï¼‰ï¼š</i> &Write to File 写入文件(&W) Preview P&arent document/folder 预览上一级文档/目录(&a) &Open Parent document/folder 打开上一级文档/目录(&O) &Open 打开(&O) Documents 第 out of at least 个文档,最少共有 for 个文档,查询æ¡ä»¶ï¼š ResTable &Reset sort é‡ç½®æŽ’åºæ¡ä»¶ï¼ˆ&R) &Delete column 删除此列(&D) Save table to CSV file 将表格ä¿å­˜æˆCSV文件 Can't open/create file: 无法打开/创建文件: &Preview 预览(&P) &Open 打开(&O) Copy &File Name å¤åˆ¶æ–‡ä»¶å(&F) Copy &URL å¤åˆ¶è·¯å¾„(&U) &Write to File 写入文件(&W) Find &similar documents 查找类似的文档(&s) Preview P&arent document/folder 预览上一级文档/目录(&a) &Open Parent document/folder 打开上一级文档/目录(&O) &Save as CSV ä¿å­˜ä¸ºCSV(&S) Add "%1" column 添加"%1"列 ResTableDetailArea &Preview 预览(&P) &Open 打开(&O) Copy &File Name å¤åˆ¶æ–‡ä»¶å(&F) Copy &URL å¤åˆ¶è·¯å¾„(&U) &Write to File 写入文件(&W) Find &similar documents 查找类似的文档(&s) Preview P&arent document/folder 预览上一级文档/目录(&a) &Open Parent document/folder 打开上一级文档/目录(&O) SSearch Any term 任一è¯è¯­ All terms 全部è¯è¯­ File name 文件å Query language 查询语言 Bad query string 查询语言格å¼ä¸æ­£ç¡® Out of memory 内存ä¸è¶³ Too many completions 有太多与之相关的补全选项啦 Completions 补全选项 Select an item: 选择一个æ¡ç›®ï¼š Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-23T08:43:25" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-23T09:07:39" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .Standard { font-size:12pt; font-family:Nimbus Roman No9 L; writing-mode:page; } .T1 { font-style:italic; } .T2 { font-style:italic; } .T4 { font-weight:bold; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="Standard">输入查询语言表达å¼ã€‚简è¦è¯´æ˜Žï¼š<br/><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2</span> : 'è¯è¯­1'å’Œ'è¯è¯­2'åŒæ—¶å‡ºçŽ°åœ¨ä»»æ„字段中。<br/><span class="T2">字段</span><span class="T1">:</span><span class="T2">è¯è¯­</span><span class="T1">1</span> : 'è¯è¯­1'出现在字段'字段'中。<br/>标准字段å/åŒä¹‰å:<br/>title/subject/captionã€author/fromã€recipient/toã€filenameã€ext。<br/>伪字段å:dirã€mime/formatã€type/rclcatã€date。<br/>日期段的两个示例:2009-03-01/2009-05-20 2009-03-01/P2M。<br/><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2 OR </span><span class="T2">è¯è¯­</span><span class="T1">3</span> : è¯è¯­1 <span class="T4">与</span> (è¯è¯­2 <span class="T4">或</span> è¯è¯­3)。<br/>ä¸å…è®¸ç”¨çœŸæ­£çš„æ‹¬å·æ¥è¡¨ç¤ºé€»è¾‘关系。<br/><span class="T1">"</span><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2"</span> : è¯ç»„(必须按原样出现)。å¯ç”¨çš„修饰è¯ï¼š<br/><span class="T1">"</span><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2"p</span> : 以默认è·ç¦»è¿›è¡Œçš„æ— åºè¿‘ä¼¼æœç´¢ã€‚<br/>有疑问时å¯ä½¿ç”¨<span class="T4">显示查询语å¥ç»†èŠ‚</span>é“¾æŽ¥æ¥æŸ¥çœ‹æŸ¥è¯¢è¯­å¥çš„细节,å¦å¤–请查看手册(&lt;F1&gt;)以了解更多内容。</p></body></html> Enter file name wildcard expression. 输入文件å通é…符表达å¼ã€‚ Enter search terms here. Type ESC SPC for completions of current term. åœ¨æ­¤è¾“å…¥è¦æœç´¢çš„è¯è¯­ã€‚按Esc ç©ºæ ¼æ¥æŸ¥çœ‹é’ˆå¯¹å½“å‰è¯è¯­çš„补全选项。 SSearchBase SSearchBase SSearchBase Clear 清空 Ctrl+S Ctrl+S Erase search entry 删除æœç´¢æ¡ç›® Search æœç´¢ Start query 开始查询 Enter search terms here. Type ESC SPC for completions of current term. åœ¨æ­¤è¾“å…¥è¦æœç´¢çš„è¯è¯­ã€‚按Esc ç©ºæ ¼æ¥æŸ¥çœ‹é’ˆå¯¹å½“å‰è¯è¯­çš„补全选项。 Choose search type. 选择æœç´¢ç±»åž‹ã€‚ SearchClauseW Select the type of query that will be performed with the words 选择è¦å¯¹å³è¾¹çš„è¯è¯­è¿›è¡Œçš„æŸ¥è¯¢ç±»åž‹ Number of additional words that may be interspersed with the chosen ones å…许在选中的è¯è¯­ä¹‹é—´å‡ºçŽ°çš„é¢å¤–è¯è¯­çš„个数 No field ä¸é™å­—段 Any ä»»æ„ All 全部 None æ—  Phrase è¯ç»„ Proximity è¿‘ä¼¼ File name 文件å SpellBase Term Explorer è¯è¯­æŽ¢ç´¢å™¨ &Expand 展开(&E) Alt+E Alt+E &Close 关闭(&C) Alt+C Alt+C No db info. 未找到数æ®åº“ä¿¡æ¯ã€‚ SpellW Wildcards 通é…符 Regexp æ­£åˆ™è¡¨è¾¾å¼ Stem expansion è¯æ ¹æ‰©å±• Spelling/Phonetic 拼写/å‘音检查 error retrieving stemming languages æå–è¯æ ¹è¯­è¨€æ—¶å‡ºé”™ Aspell init failed. Aspell not installed? Aspellåˆå§‹åŒ–å¤±è´¥ã€‚æ˜¯å¦æœªå®‰è£…Aspell? Aspell expansion error. Aspell扩展出错。 No expansion found 未找到扩展 Term è¯è¯­ Doc. / Tot. 文档数/总数 Index: %1 documents, average length %2 terms 索引:%1个文档,平å‡é•¿åº¦ä¸º%2个è¯è¯­ UIPrefsDialog error retrieving stemming languages æå–è¯æ ¹è¯­è¨€æ—¶å‡ºé”™ The selected directory does not appear to be a Xapian index é€‰ä¸­çš„ç›®å½•ä¸æ˜¯Xapian索引 This is the main/local index! 这是主è¦/æœ¬åœ°ç´¢å¼•ï¼ The selected directory is already in the index list 选中的目录已ç»åœ¨ç´¢å¼•列表中 Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) 选择xapian索引目录(例如:/home/buddy/.recoll/xapiandb) Choose 选择 ViewAction Changing actions with different current values 正在针对ä¸åŒçš„当å‰å€¼è€Œæ”¹å˜åŠ¨ä½œ Command 命令 MIME type 文件类型 ViewActionBase Native Viewers 本地查看器 Select one or several file types, then click Change Action to modify the program used to open them 选中一个或多个文件类型,然åŽç‚¹å‡»â€œä¿®æ”¹åŠ¨ä½œâ€æ¥ä¿®æ”¹ç”¨æ¥æ‰“å¼€è¿™äº›æ–‡ä»¶çš„ç¨‹åº Change Action 修改动作 Close 关闭 Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. 选中一个或多个文件类型祟点击“修改动作â€<br>或者å¯ä»¥å…³é—­è¿™ä¸ªå¯¹è¯æ¡†ï¼Œè€Œåœ¨ä¸»é¢æ¿ä¸­é€‰ä¸­â€œä½¿ç”¨æ¡Œé¢é»˜è®¤è®¾ç½®â€<br>那样就会无视这个列表而使用桌é¢çš„默认设置。 confgui::ConfBeaglePanelW Steal Beagle indexing queue 窃å–Beagle索引队列 Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) ä¸å¯è¿è¡ŒBeagle。å¯ç”¨å¯¹beagle队列的处ç†ï¼Œä»¥ç´¢å¼•ç«ç‹ç½‘页历å²ã€‚<br>(你还需è¦å®‰è£…ç«ç‹Beagleæ’件) Entries will be recycled once the size is reached 当尺寸达到设定值时,这些æ¡ç›®ä¼šè¢«å¾ªçŽ¯ä½¿ç”¨ Web page store directory name 网页储存目录å The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. 用æ¥å‚¨å­˜å¤åˆ¶è¿‡æ¥çš„已访问网页的目录å。<br>如果使用相对路径,则会相对于é…置目录的路径进行处ç†ã€‚ Max. size for the web store (MB) 网页存储的最大尺寸(MB) confgui::ConfIndexW Can't write configuration file 无法写入é…置文件 confgui::ConfParamFNW Choose 选择 confgui::ConfParamSLW + + - - confgui::ConfSubPanelW Global 全局 Max. compressed file size (KB) 压缩文件最大尺寸(KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. 尺寸大于这个值的压缩文件ä¸ä¼šè¢«å¤„ç†ã€‚设置æˆ-1以表示ä¸åР任何é™åˆ¶ï¼Œè®¾ç½®æˆ0以表示根本ä¸å¤„ç†åŽ‹ç¼©æ–‡ä»¶ã€‚ Max. text file size (MB) 文本文件最大尺寸(MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. 尺寸大于这个值的文本文件ä¸ä¼šè¢«å¤„ç†ã€‚设置æˆ-1以表示ä¸åŠ é™åˆ¶ã€‚ 其作用是从索引中排除巨型的记录文件。 Text file page size (KB) 文本文件å•页尺寸(KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). 如果设置咯这个值(ä¸ç­‰äºŽ-1),则文本文件会被分割æˆè¿™ä¹ˆå¤§çš„å—,并且进行索引。 è¿™æ˜¯ç”¨æ¥æœç´¢å¤§åž‹æ–‡æœ¬æ–‡ä»¶çš„(例如记录文件)。 Max. filter exec. time (S) 过滤器的最长执行时间(S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. 外部过滤器的执行时间如果超过这个值,则会被强行中断。在罕è§çš„æƒ…况下,æŸäº›æ–‡æ¡£ï¼ˆä¾‹å¦‚postscript)会导致过滤器陷入死循环。设置æˆ-1以表示ä¸åŠ é™åˆ¶ã€‚ confgui::ConfTopPanelW Top directories 顶级目录 The list of directories where recursive indexing starts. Default: your home. 索引从这个列表中的目录开始,递归地进行。默认:你的家目录。 Skipped paths 略过的路径 These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') 索引进程ä¸ä¼šè¿›å…¥å…·æœ‰è¿™äº›å字的目录。<br>å¯ä»¥åŒ…å«é€šé…符。必须匹é…索引进程自身所è§åˆ°çš„路径(例如:如果topdirs包å«'/home/me',而实际上'/home'是到'/usr/home'的链接,则正确的skippedPathæ¡ç›®åº”当是'/home/me/tmp*'ï¼Œè€Œä¸æ˜¯'/usr/home/me/tmp*') Stemming languages è¯æ ¹è¯­è¨€ The languages for which stemming expansion<br>dictionaries will be built. 将会针对这些语言<br>æž„é€ è¯æ ¹æ‰©å±•è¯å…¸ã€‚ Log file name 记录文件å The file where the messages will be written.<br>Use 'stderr' for terminal output 程åºè¾“出的消æ¯ä¼šè¢«ä¿å­˜åˆ°è¿™ä¸ªæ–‡ä»¶ã€‚<br>使用'stderr'以表示将消æ¯è¾“出到终端 Log verbosity level 记录的è¯ç—¨çº§åˆ« This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. 这个值调整的是输出的消æ¯çš„æ•°é‡ï¼Œ<br>其级别从仅输出报错信æ¯åˆ°è¾“出一大堆调试信æ¯ã€‚ Index flush megabytes interval 刷新索引的间隔,兆字节 This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB è¿™ä¸ªå€¼è°ƒæ•´çš„æ˜¯ï¼Œå½“ç§¯ç´¯å’¯å¤šå°‘ç´¢å¼•æ•°æ®æ—¶ï¼Œæ‰å°†æ•°æ®åˆ·æ–°åˆ°ç¡¬ç›˜ä¸ŠåŽ»ã€‚<br>ç”¨æ¥æŽ§åˆ¶ç´¢å¼•è¿›ç¨‹çš„å†…å­˜å ç”¨æƒ…况。默认为10MB Max disk occupation (%) 最大硬盘å ç”¨çŽ‡ï¼ˆ%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). 当硬盘的å ç”¨çŽ‡è¾¾åˆ°è¿™ä¸ªæ•°æ—¶ï¼Œç´¢å¼•ä¼šå¤±è´¥å¹¶ä¸”åœæ­¢ï¼ˆä»¥é¿å…塞满你的硬盘)。<br>设为0则表示ä¸åŠ é™åˆ¶ï¼ˆè¿™æ˜¯é»˜è®¤å€¼ï¼‰ã€‚ No aspell usage ä¸ä½¿ç”¨aspell Aspell language Aspell语言 The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. aspellè¯å…¸çš„è¯­è¨€ã€‚è¡¨ç¤ºæ–¹å¼æ˜¯'en'或'fr'……<br>如果ä¸è®¾ç½®è¿™ä¸ªå€¼ï¼Œåˆ™ä¼šä½¿ç”¨ç³»ç»ŸçŽ¯å¢ƒä¸­çš„è‡ªç„¶è¯­è¨€è®¾ç½®ä¿¡æ¯ï¼Œè€Œé‚£ä¸ªé€šå¸¸æ˜¯æ­£ç¡®çš„ã€‚è¦æƒ³æŸ¥çœ‹ä½ çš„系统中安装咯哪些语言的è¯ï¼Œå°±æ‰§è¡Œ'aspell config',å†åœ¨'data-dir'目录中找.dat文件。 Database directory name æ•°æ®åº“目录å The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. 用æ¥å‚¨å­˜ç´¢å¼•æ•°æ®çš„目录的åå­—<br>如果使用相对路径,则路径会相对于é…置目录进行计算。默认值是'xapiandb'。 Use system's 'file' command 使用系统里的'file'命令 Use the system's 'file' command if internal<br>mime type identification fails. 当内部的文件类型识别功能失效时<br>使用系统里的'file'命令。 Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. ç¦æ­¢åœ¨è¯è¯­æŽ¢ç´¢å™¨ä¸­ä½¿ç”¨aspellæ¥ç”Ÿæˆæ‹¼å†™ç›¸è¿‘çš„è¯è¯­ã€‚<br>在没有安装aspellæˆ–è€…å®ƒå·¥ä½œä¸æ­£å¸¸æ—¶ä½¿ç”¨è¿™ä¸ªé€‰é¡¹ã€‚ uiPrefsDialogBase User preferences 用户选项 User interface ç”¨æˆ·ç•Œé¢ Number of entries in a result page 一个结果页é¢ä¸­æ˜¾ç¤ºçš„ç»“æžœæ¡æ•° If checked, results with the same content under different names will only be shown once. å¦‚æžœé€‰ä¸­è¿™ä¸ªï¼Œåˆ™æ‹¥æœ‰ç›¸åŒæ–‡ä»¶å†…容的ä¸åŒæ–‡ä»¶ååªä¼šæ˜¾ç¤ºä¸€ä¸ªã€‚ Hide duplicate results. éšè—é‡å¤ç»“果。 Highlight color for query terms 查询è¯è¯­çš„高亮颜色 Result list font 结果列表字体 Opens a dialog to select the result list font æ‰“å¼€ä¸€ä¸ªå¯¹è¯æ¡†ï¼Œä»¥é€‰æ‹©ç”¨äºŽç»“果列表的字体 Helvetica-10 文泉驿微米黑-12 Resets the result list font to the system default 将结果列表中的字体é‡è®¾ä¸ºç³»ç»Ÿé»˜è®¤å€¼ Reset é‡ç½® Texts over this size will not be highlighted in preview (too slow). 超过这个长度的文本ä¸ä¼šåœ¨é¢„览窗å£é‡Œé«˜äº®æ˜¾ç¤ºï¼ˆå¤ªæ…¢ï¼‰ã€‚ Maximum text size highlighted for preview (megabytes) 在预览中对其进行高亮显示的最大文本尺寸(兆字节) Use desktop preferences to choose document editor. 使用桌é¢ç³»ç»Ÿçš„设置æ¥é€‰æ‹©æ–‡æ¡£ç¼–辑器。 Choose editor applications é€‰æ‹©ç¼–è¾‘å™¨ç¨‹åº Display category filter as toolbar instead of button panel (needs restart). 将文件类型过滤器显示æˆå·¥å…·æ¡ï¼Œè€Œä¸æ˜¯æŒ‰é’®é¢æ¿ï¼ˆéœ€è¦é‡å¯ç¨‹åºï¼‰ã€‚ Auto-start simple search on whitespace entry. è¾“å…¥ç©ºæ ¼æ—¶è‡ªåŠ¨å¼€å§‹è¿›è¡Œç®€å•æœç´¢ã€‚ Start with advanced search dialog open. å¯åŠ¨æ—¶æ‰“å¼€é«˜ç«¯æœç´¢å¯¹è¯æ¡†ã€‚ Remember sort activation state. è®°ä½æŽ’åºçжæ€ã€‚ Prefer Html to plain text for preview. 预览中优先使用Html。 Search parameters æœç´¢å‚æ•° Stemming language è¯æ ¹è¯­è¨€ A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. 对[滚 石] (2个è¯è¯­)çš„æœç´¢ä¼šå˜æˆ[滚 or 石 or (滚 2个è¯è¯­ 石)]。 对于那些æœç´¢è¯è¯­åœ¨å…¶ä¸­æŒ‰ç…§åŽŸæ ·å‡ºçŽ°çš„ç»“æžœï¼Œå…¶ä¼˜å…ˆçº§ä¼šé«˜ä¸€äº›ã€‚ Automatically add phrase to simple searches 自动将è¯ç»„æ·»åŠ åˆ°ç®€å•æœç´¢ä¸­ Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. 是å¦è¦ä½¿ç”¨æŸ¥è¯¢è¯è¯­å‘¨å›´çš„ä¸Šä¸‹æ–‡æ¥æž„造结果列表æ¡ç›®ä¸­çš„æ‘˜è¦ï¼Ÿ 对于大的文档å¯èƒ½ä¼šå¾ˆæ…¢ã€‚ Dynamically build abstracts åŠ¨æ€æž„é€ æ‘˜è¦ Do we synthetize an abstract even if the document seemed to have one? å³ä½¿æ–‡æ¡£æœ¬èº«æ‹¥æœ‰ä¸€ä¸ªæ‘˜è¦ï¼Œæˆ‘们ä»ç„¶è‡ªè¡Œåˆæˆæ‘˜è¦ä¿¡æ¯ï¼Ÿ Replace abstracts from documents å–ä»£æ–‡æ¡£ä¸­è‡ªå¸¦çš„æ‘˜è¦ Synthetic abstract size (characters) åˆæˆæ‘˜è¦é•¿åº¦ï¼ˆå­—符个数) Synthetic abstract context words åˆæˆæ‘˜è¦ä¸Šä¸‹æ–‡ The words in the list will be automatically turned to ext:xxx clauses in the query language entry. 这个列表中的è¯è¯­ä¼šåœ¨æŸ¥è¯¢è¯­è¨€è¾“å…¥æ¡†é‡Œè‡ªåŠ¨å˜æˆext:xxx语å¥ã€‚ Query language magic file name suffixes. 查询语言神奇文件ååŽç¼€ã€‚ Enable å¯ç”¨ External Indexes 外部索引 Toggle selected 切æ¢é€‰ä¸­é¡¹ Activate All 全部激活 Deactivate All 全部ç¦ç”¨ Remove from list. This has no effect on the disk index. 从列表中删除。这ä¸ä¼šå¯¹ç¡¬ç›˜ä¸Šçš„ç´¢å¼•é€ æˆæŸå®³ã€‚ Remove selected 删除选中项 Click to add another index directory to the list 点击这里,以将å¦ä¸€ä¸ªç´¢å¼•目录添加到列表中 Add index 添加索引 Apply changes 使改å˜ç”Ÿæ•ˆ &OK 确定(&O) Discard changes æ”¾å¼ƒè¿™äº›æ”¹å˜ &Cancel å–æ¶ˆï¼ˆ&C) Abstract snippet separator 摘è¦ä¸­çš„片段的分隔符 Style sheet æ ·å¼å• Opens a dialog to select the style sheet file æ‰“å¼€ä¸€ä¸ªå¯¹è¯æ¡†ï¼Œä»¥é€‰æ‹©æ ·å¼å•文件 Choose 选择 Resets the style sheet to default 将样å¼å•é‡ç½®ä¸ºé»˜è®¤å€¼ Lines in PRE text are not folded. Using BR loses some indentation. PRE中的文字ä¸ä¼šæ¢è¡Œã€‚使用BRçš„è¯ä¼šä½¿ä¸€äº›ç¼©è¿›å¤±æ•ˆã€‚ Use <PRE> tags instead of <BR>to display plain text as html in preview. 在将纯文本显示æˆhtml预览的时候,使用<PRE>æ ‡ç­¾ï¼Œè€Œä¸æ˜¯<BR>标签。 Result List 结果列表 Edit result paragraph format string 编辑结果段è½çš„æ ¼å¼å­—符串 Edit result page html header insert 编辑结果页é¢çš„html头部æ’入项 Date format (strftime(3)) 日期格å¼ï¼ˆstrftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). 这是一个频率阈值,超过这个值的è¯ï¼Œæˆ‘们就ä¸ä¼šæŠŠè¯è¯­æ”¾åˆ°è‡ªåЍè¯ç»„中。 高频è¯è¯­æ˜¯è¯ç»„ä¸­æ€§èƒ½é—®é¢˜çš„ä¸»è¦æ¥æºã€‚ 略过的è¯è¯­ä¼šå¢žåŠ è¯ç»„的空缺值,因此会é™ä½Žè‡ªåЍè¯ç»„功能的效率。 默认值是2(百分比)。 Autophrase term frequency threshold percentage 自动è¯ç»„频率阈值百分比 recoll-1.17.3/qtgui/i18n/recoll_zh_CN.qm000644 001750 000000 00000245353 11757435371 020325 0ustar00dockeswheel000000 000000 <¸dÊÍ!¿`¡½ÝB+ ^- ‹¯ ¬+;$KH,­ H,Â/H,ûaHYûŠIAÃÂZlÌXmbÐ÷¦y†Ù¨¥É¨¶E±VÐDcÙ]LôÏšVE¶šVEüf¾ÏÀlÀÅ2¬¬ô½wEî7ë$—ז'HäÑ(*Ð%¾¸*ì0¿!+Lôƒ°+f¾Ì+f¾Ñž+f¾Ôè1ø v:Îd¼OG…Ô5•GßÃH6óþ H6õþ:J+‚…1J+‚ù‚J6•J6•L™b±±Ph¨ËT°5ËŽWT‡}WÈÕ¶¼XÉÄ6.[ %Ì/e®……gwîØsºñÁsºñ¼yv8“·ãv®Âv®Â¼Ëzϳ¤€€£)ì„jªŒ!þ Ò0œÀÍoªJ-®½Þ,öÊð©Îº°÷ÃÞÓÐùƒ»þÐùƒMÐùƒÂã3ÈÛãn Õ æEµºõ&`Ž#U0,…~>.cŒ«Do2´[XM¹2X®©E`Þ^Îh0 ùlÿtûänÚˆÛwñ…Ë]wñ…®„3ÿÆ‘vã&Εñ“ŒvœW­}ž€Þ³¢‰j£cê †ÎxC‰ÞñƒÜó L¬ÒþSIø[ÿµª çŒï#¸Î¶p#vå¶ávå¥Êqw 5Ê¢w 5ø0w 5û³wîÊÑ€¢#×ÔŒU`Ÿ.«»£¹Þ Z©Ö³#ª6•ý«¯†”«»f3Á{ËÂî²éͼu2Ðgž¼ðÔÂõ…ÆØ.^Jê•Êø¾ì;U®ðï¡©FúU†—úeî > ¬˜ðŒµ8R`³Å‘" û.:ª UKô7jp h&—u9düv2㇖T#ˆn—B…VšKg¦ %1¦öõ9¨«‡»«¶7лÄÖ[µ­ÊXÔ IënDªÂðw)üüþ!ØC'~#+ä8‘7I^¾éFW#ü>F¯N+{H:"̬H:"ÑÌH:"Õ _gucjŒÍwÍŒÍwÒ!ŒÍwՌϗÏänͦ“’ž' ¦š´½ ²ð ÎÁ²ð ÓDzð ÖG´ù€¾l¯¸Ót½HÈૉɆt:ãéŽ#ƪ3‚µ áùÉ:uî3ïQçÇ‹Òoz ¸}}‹•€;EÔŸŽÄ^1t”ò“8Èœ .¼¨0ÎÄúÃÌí³ƒßͳÐb×°­ÊÝÜ"±äœcµä´¥«Ræí:¯àö¨åbú Ã<“ ´H½ä 9Zyú… ;´3´” K¨óÄÆ ]#—¶ cÄIÔ k¨µˆ¥ lMˆ‚ˆ ‰Œî: ŸÁòÐ ŸÁòÔG ŸÁòÖÛ «ƒÔÉR ­î6 ®œ¯*Ü ²9ª ü>4¹ äî‰_ íåõ'é *N‡; Üc‚ ).~¿R *REÒ +<”5 6 ¯µ G.~c) `Pµ `ç£ c·EÃë d8„ y†^ ˜Iœ$ ¤ž_ ±TúØ[ ²ëCÏQ ²ëCÓý ²ëCÖ‡ Áùš² ÄãÏ* âæçà åKÄ"ó æõçÃ3 ®ˆ ®ùÂÁ Ô… - yeDÉ THm ŽÚ„ =!f CK€„à Kj×Ëù T|cÀè h¹°„H tÓ9ë é £Ü ˆ< ¨Î£ÄJ »ïµ¯V ÖüõÆì Û·åÅ^ ÛÓ(ƒ Vd´Ò 'ИÁé /¥µA 97Ãr 9É· L*ÒR PÖ™¬R RVŽ»K T#Ž Vü® \iC5Ô ]æù ‘ `F¥> hôîÑc v—¥¸« {l4S €!Y¸l ‘–²°à ©zóî ¬æàª‘ Ër(Ñ Óͺ# Ú÷Ï Ýøì&] é—~0¼ ö†ÀýÛ zs? m£Ë/ 'Rçcª -èôË» 8þ$€ FÁ²¹ OE°bä m†C0e uò0Æl y· y¹~Û ‚±3§ …È©)O ‡uøŒ ‰P¬* ‰P»× 5d3 ’ãnÞ ¤š„¶d ¬Š©D\ ½ý7€* ÕHu û£• q©¾o€/Ö%Ýn‘./¸.¦16“É<Þ9~F÷Qá~5 Y~sÁ;[žsÇë\НEg3Ä—pû~€_Õ  «!&  ‚´‹Z­c@µ“Ãø÷»m€Ó@¿­cÂ|“7¬ÎÁ'¹âî£Æ8ó l½Ÿü©ÜËü¶Li<ÑQhègaNö All clauses AdvSearchNûagaNö Any clause AdvSearche‡Nö\:[øÇnäVhv„TSUOMN kcxn$Bad multiplier suffix in size filter AdvSearch YZ’OSe‡Nömedia AdvSearch®Nömessages AdvSearchQv[ƒother AdvSearchoy:e‡z? presentations AdvSearchu5[Pˆhh< spreadsheets AdvSearche‡g,texts AdvSearch !yûR¨Qhè <----- All AdvSearchBase !yûR¨ N-˜y <----- Sel AdvSearchBasemûR gaNö Add clause AdvSearchBasešØzïd}"Advanced search AdvSearchBase yûR¨Qhè!’ All ----> AdvSearchBaseÌSó¹v„b@g —^zz[WkµýOc qg;‘Nÿ QhègaNö  ˜yÿ b;‘bÿ NûagaNö  ˜yÿ ge~ÄT0<br> Nûa  Qhè TŒ eà N yÍ[Wkµ|{W‹ýc¥SדQe{€SU‹Í‹íTŒSÌ_S÷_u(v„‹Í~Äv„~ÄT0<br>zzv„“QehFOˆ«_ýue0All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBasemO‰ÈBrowse AdvSearchBase c Y'|{geÇnä By categories AdvSearchBase N-ÙN*ÿ NåO¿”ˆ[ùeågÛˆLÇnä'Check this to enable filtering on dates AdvSearchBase" N-ÙN*ÿ NåO¿”ˆ[ùe‡Nö|{W‹ÛˆLÇnä,Check this to enable filtering on file types AdvSearchBase" N-ÙN*ÿ NåO¿”ˆ[ùe‡Nö\:[øÛˆLÇnä'Check this to enable filtering on sizes AdvSearchBase4 N-ÙN*ÿ NåO¿Ou(ƒY'v„R|{ÿ € N Ou(QwOSv„e‡Nö|{W‹;Check this to use file categories instead of raw mime types AdvSearchBaseQs•íClose AdvSearchBaseR –dgaNö Delete clause AdvSearchBase“Qe‰d}"v„gN \Bvî_UEnter top directory for search AdvSearchBaseÇnäFilter AdvSearchBaseÇnäeåg Filter dates AdvSearchBaseÇnä\:[ø Filter sizes AdvSearchBasegåb~Find AdvSearchBaseNÎFrom AdvSearchBase‰_ýuev„e‡Nö|{W‹Ignored file types AdvSearchBase SÍlÇnägaNöInvert AdvSearchBasegY'\:[ø Max. Size AdvSearchBase0gY'\:[ø0O`SïOu(k/K0m/M0g/GO\N:SUOM4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBaseg\\:[ø Min. Size AdvSearchBase0g\\:[ø0O`SïOu(k/K0m/M0g/GO\N:SUOM4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase –P[še‡Nö|{W‹Restrict file types AdvSearchBase"\~ÓgœN-v„e‡Nö–P[šW(kd[Pvî_UhN-ÿ%Restrict results to files in subtree: AdvSearchBase OÝ[XN:žØ‹¤P<Save as default AdvSearchBase(d}"<br>ná³NåN gaNö<br>v„e‡hcÿ'Search for
documents
satisfying: AdvSearchBase\ˆ«d}"v„e‡Nö|{W‹Searched file types AdvSearchBase yûR¨ N-˜y!’ Sel -----> AdvSearchBase_YËd}" Start Search AdvSearchBaseR0To AdvSearchBase<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T19:47:37" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T19:56:53" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } .T3 { font-style:italic; } .T4 { font-family:Courier New,courier; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> by‘Ï}"_‹¡RNûR¡(cron) </p><p class="P1">kÏN*[WkµýSïNåSbìNN*‘M{&(*)0SUN*ep[WP<0S÷R–”v„Rˆh(1,3,5)TŒƒVô(1-7)0fôQÆxnW0‹ôÿ ÙN›[WkµOˆ«<span class="T3">c SŸh7</span>“QúR0crontab e‡NöN-ÿ VàkdÙ‘ÌSïNåOu(crontab v„b@g ‹ílÕÿ S€crontab(5)0</p><p class="P1"><br/>O‹Y‚ÿ W(<span class="T3">eåg</span>N-“Qe<span class="T4">*</span>ÿ <span class="T3">\eö</span>N-“Qe<span class="T4">12,19</span>ÿ <span class="T3">R”Ÿ</span>N-“Qe<span class="T4">15 </span>v„‹Ýÿ OW(kÏY)v„12:15 AM TŒ7:15 PMT/R¨recollindex0</p><p class="P1">NN*˜‘~AbgˆLv„‹¡RNûR¡ÿ Qv`'€ýSï€ýkÔN N [žeö}"_0</p></body></html> Å

Recoll batch indexing schedule (cron)

Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used as is inside the crontab file, and the full crontab syntax can be used, see crontab(5).


For example, entering * in Days, 12,19 in Hours and 15 in Minutes would start recollindex every day at 12:15 AM and 7:15 PM

A schedule with very frequent activations is probably less efficient than real time indexing.

 CronToolWª<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:08:00" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:11:47" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T2 { font-style:italic; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1">p¹Qû<span class="T2">yu(</span>NåP\kbÛˆLêR¨Sv„by‘Ï}"_ÿ p¹Qû<span class="T2">T/u(</span>NåT/u(kdRŸ€ýÿ p¹Qû<span class="T2">SÖmˆ</span>RN e9SØNûOUN‰0</p></body></html> š

Click Disable to stop automatic batch indexing, Enable to activate it, Cancel to change nothing.

 CronToolW‹¡RNûR¡[ù‹ÝhF Cron Dialog CronToolW&fgeå(*b0-7ÿ 0b7f/cfgY)))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolWyu(Disable CronToolWT/u(Enable CronToolW$cÒQecrongavîeöQú•0‹÷hÀgå‹ílÕ03Error installing cron entry. Bad syntax in fields ? CronToolW\eö(*b0-23)Hours (* or 0-23) CronToolWPw wge]ò~Ïg bKR¨‘Çv„recollindexgavîN†ÿ VàkdeàlÕ‘crontabPIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolWR”Ÿ(0-59)Minutes (0-59) CronToolW[ù‹ÝhFDialog EditDialogà<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:14:44" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:23:13" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T2 { font-weight:bold; } .T4 { font-style:italic; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T2">g*b~R0[ù^”NŽkd‘Mn[žO‹v„}"_epcn0</span><br/><br/>Y‚gœO`Sê`óNåN~ÄTtv„žØ‹¤SÂepge}"_O`v„[¶vî_Uv„‹Ýÿ \1vôc¥c <span class="T4">zËSs_YË}"_</span>c ”®0NåTØSïNåŒet‘MnSÂepv„0</p><p class="P1">Y‚gœO``óŒetgÐN›N‰v„‹Ýÿ \1Ou(N —bv„”þc¥geŒetQvN-v„}"_‘MnTŒ[šeö‹¡RT'0</p><p class="P1">ÙN›]åQwSïW(NåTÇ<span class="T4"> ˜y</span>ƒÜSU‹¿•î0</p></body></html> ê

It appears that the index for this configuration does not exist.

If you just want to index your home directory with a set of reasonable defaults, press the Start indexing now button. You will be able to adjust the details later.

If you want more control, use the following links to adjust the indexing configuration and schedule.

These tools can be accessed later from the Preferences menu.

FirstIdxDialog{,Nk!}"_‹¾nFirst indexing setupFirstIdxDialog}"_‘MnIndexing configurationFirstIdxDialog [šeö}"_NûR¡Indexing scheduleFirstIdxDialog zËSs_YË}"_Start indexing nowFirstIdxDialog^W(Ù‘ÌSïNåŒetO``ó‰[ùQvÛˆL}"_v„vî_Uÿ NåSÊQv[ƒSÂepÿ O‹Y‚ÿ‰c’–dTŒï_„bT [W0žØ‹¤[W{&–Æ & &This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.FirstIdxDialogdW(Ù‘ÌSïNå béf/‰ÛˆLby‘Ï}"_Øf/[žeö}"_ÿ ØSïN勾nNN*êR¨Sv„[šeöÿOu(cronÿ by‘Ï}"_NûR¡0€This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron).FirstIdxDialogJ<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:27:11" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:30:49" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> }"_z ^Sïc~íЈL^vNW(e‡NöSÑuSØSeö[ùQvÛˆL}"_ÿ N_SïNå•ô–”N[šeö•ôЈLNk!0</p><p class="P1">O`SïNå‹ûNN bKQŒÿ NåO¿fôY}W0PZQúb‰béÿc F1ÿ 0</p><p class="P1">ÙN*]åQwSï^.R©O`‹¾nNN*êR¨ÛˆLby‘Ï}"_v„[šeöNûR¡ÿ b€‹¾nb_SO`v{_UeöO¿T/R¨[žeö}"_ÿb€N$€T eöÛˆLÿ _Sq6£QàNNl¡g aNIÿ 0</p></body></html> ¿

Recoll indexing can run permanently, indexing files as they change, or run at discrete intervals.

Reading the manual may help you to decide between these approaches (press F1).

This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense).

 IdxSchedW[šeöNûR¡Cron scheduling IdxSchedWy:[Wkµ Show fieldsPreviewTextEditf>y:VþrG Show imagePreviewTextEdit f>y:N;e‡g,Show main textPreviewTextEdit<b>ê[šNIv„[Pvî_UhCustomised subtreesQObjectº<i>NåN v„SÂepÿ _SO`W(N —bv„RˆhN-N N-NûOUgavîb€ N-NN*zzˆLeöÿ <br>\1f/”ˆ[ù˜v~§vî_UwO\u(v„ÿ T&RO¿f/[ù N-v„[Pvî_UwO\u(v„0<br>O`SïNåp¹Qû+/-c ”®ÿ NåO¿mûR bR –dvî_U0ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObjectBeagleQ˜uS†SòBeagle web historyQObject žØ‹¤[W{&–ÆDefault character setQObject ߎ*{&S÷”þc¥Follow symbolic linksQObject4W(}"_eöߎ*{&S÷”þc¥0žØ‹¤f/N ߎ*v„ÿ NåQM‘ÍY }"_TFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObjectQh\@SÂepGlobal parametersQObject[ùb@g e‡NöT ÛˆL}"_Index all file namesQObjectT[ù£N›eàlÕR$e­bYtQvQ…[¹ÿg*wå|{W‹bQv|{W‹N ˆ«e/cÿ v„e‡Növ„T [WÛˆL}"_0žØ‹¤N:f/}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject\@èSÂepLocal parametersQObject‰ueÇv„e‡NöT  Skipped namesQObjectZÙf/]ò}"_v„vî_UhN-v„NN›[Pvî_U~Äbv„Rˆh<br>ÿ [ƒNìv„gÐN›SÂep—‰‘Í[šNI0žØ‹¤ÿzzv}0sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObject$Qwg ÙN›j!_v„e‡Nöbvî_UN Oˆ«}"_0LThese are patterns for file or directory names which should not be indexed.QObject„Ùf/u(ge‹ûSÖ£N›g*hfꎫv„[W{&–Æv„e‡Nöeöb@Ou(v„[W{&–Æÿ O‹Y‚~¯e‡g,e‡Nö0<br>žØ‹¤PThe default value is empty, and the value from the NLS environnement is used.QObject~<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T21:00:38" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T21:02:43" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> }"_z ^SïNåNå[ˆb¤Ûz v„e¹_ЈLÿ W(e‡NöSÑuSØSeöO¿[žeöfôe°}"_0Ùh7O`v„}"_Nvôf/Ne‡NöT kev„ÿ OFf/OS`u(N[šv„|û~ßDn0</p></body></html> .

Recoll indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.

RTIToolWT eökdk!N_zËSsT/R¨}"_Ûz 0%Also start indexing daemon right now.RTIToolW*êR¨T/R¨e‡Nö]ò~ÏR –d0N_‰g@k{_SRMÛz Tÿ2Autostart file deleted. Kill current process too ?RTIToolW eàlÕR^úÿCan't create: RTIToolWeàlÕbgˆLrecollindexCould not execute recollindexRTIToolW kcW(R –de‡Nö Deleting fileRTIToolW kcW(R –dÿ Deleting: RTIToolW[žeö}"_êR¨T/R¨"Real time indexing automatic startRTIToolWkcW(R –dêR¨T/R¨˜yRemoving autostartRTIToolW kcW(fÿcbe‡NöReplacing fileRTIToolW kcW(fÿcbÿ Replacing: RTIToolW$W(bv„hL—bO‹ÝT/R¨eöO¿T/R¨}"_Ûz 0.Start indexing daemon with my desktop session.RTIToolW‹fTJWarningRTIToolWÿ[ùQhè‹íŠÛˆL‹Íh9‹¡{—ÿ (all languages)RclMainÿN ÛˆL‹Íh9‹¡{—ÿ  (no stemming)RclMainRecoll‹ôf About RecollRclMainQhèAllRclMain>”ˆ[ù%1v„gåw T}Nä[%2]‘MnQú• ‹÷hÀgåmimeconfe‡NöCBad viewer command line for %1: [%2] Please check the mimeconf fileRclMaineàlÕ‹¿•îe‡NöÿCan't access file: RclMaineàlÕR^ú˜„‰Èz—SãCan't create preview windowRclMaineàlÕ‰ãS‹)kde‡NöÿCan't uncompress file: RclMaineàlÕfôe°}"_ÿ}"_z ^]òW(ЈL#Can't update index: indexer runningRclMaineàlÕcÐSÖe‡hcbR^úN4eöe‡Nö0Cannot extract document or create temporary fileRclMaineàlÕNÎepcn^“ƒ·SÖe‡hcOá`o+Cannot retrieve document info from databaseRclMainkcW(Qs•íClosingRclMain]ò~ÏN:ÙN›e‡Nö|{W‹}"_QvQ…[¹ÿ.Content has been indexed for these mime types:RclMain4eàlÕbS_Yè}"_0epcn^“g*bS_0‹÷hÀgåYè}"_Rˆh0HCould not open external index. Db not open. Check external indexes list.RclMaine‡hcR|{ÇnäVhDocument category filterRclMaine‡hcS†SòDocument historyRclMain]ò[ŒbDoneRclMain kcW(R –d}"_ Erasing indexRclMain•‹ïErrorRclMain kcW(bgˆLÿ[ Executing: [RclMain@—‰u(ge…R©[ùO`v„e‡NöÛˆL}"_ÿ StSÈb~N R0v„Yèz ^/T}Näÿ SExternal applications/commands needed and not found for indexing your file types: RclMainS†Sòepcn History dataRclMain }"_g*bS_Index not openRclMainnkde‡Növ„}"_]òÇeö0z ^bÒ~Ýf>y:•‹ïv„gavî0‹÷p¹Qûxn[šNåfôe°kde‡Növ„}"_ÿ {I_…}"_[ŒbNKTQgå‹â0b€ÿ SÖmˆ0´Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel.RclMain }"_gå‹âQú•Index query errorRclMain]ò}"_v„e‡Nö|{W‹Indexed MIME TypesRclMain}"_Y1%Indexing failedRclMain kcW(}"_ÿIndexing in progress: RclMaing*b~R0v„…R©z ^Missing helper programsRclMainvщÆVhMonitorRclMain$”ˆ[ùkdyÍe‡Nö|{W‹l¡g ‘MnYègåw Vh[-No external viewer configured for mime type [RclMainvîRMN :\NûOU…R©z ^No helpers found missingRclMain g*b~R0~ÓgœNo results foundRclMaineàNoneRclMainR –dPurgeRclMain gå‹â‹íSå~Æ‚‚ Query detailsRclMainLgå‹âkcW(ÛˆLN-0<br>u1NŽ}"_^“v„gÐN›–PR6ÿ <br>SÖmˆv„‹ÝO[üôz ^QúeQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMaingå‹â~Ógœ Query resultsRclMainNÎY4‘Íe°_YË}"_Tÿ(Reset the index and start from scratch ?RclMain~ÓgœepÿO0‹¡P<ÿ Result count (est.)RclMainOÝ[Xe‡Nö Save fileRclMainStemepcn^“StemdbRclMainP\kb}"_ÿ&Iÿ Stop &IndexingRclMainL_SRM}"_Ûz N f/u1kduL—bT/R¨v„0p¹Qûxn[šNåg@k{[ƒÿ b€p¹QûSÖmˆNå‹©[ƒêu1ЈLyThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMainNl¡g b~R0mimeviewN-N:%1: %2‘Mnv„gåw Vh0 f/T&‰bS_ ˜y[ù‹ÝhFÿhThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMainÙN*gå‹â]ò~ÏN f/m;Ãv„N†"This search is not active any moreRclMaing*wåUnknownRclMainfôe°}"_ÿ&Iÿ  Update &IndexRclMainkcW(fôe°UpdatingRclMain‹fTJWarningRclMaincÐSÖ‹Íh9‹íŠeöQú•#error retrieving stemming languagesRclMain]òÇnäfilteredRclMain YZ’OSe‡NömediaRclMain®NömessageRclMainQv[ƒotherRclMainoy:e‡hc presentationRclMain]òc’^sortedRclMainu5[Pˆhh< spreadsheetRclMaine‡g,e‡NötextRclMainRecoll‹ôfÿ&Aÿ  &About Recoll RclMainBasešØzïd}"ÿ&Aÿ &Advanced Search RclMainBaseR –de‡hcS†Sòÿ&Eÿ &Erase document history RclMainBaseR –dd}"S†Sòÿ&Eÿ &Erase search history RclMainBase e‡Nöÿ&Fÿ &File RclMainBase Qh\Oÿ&Fÿ  &Full Screen RclMainBase ^.R©ÿ&Hÿ &Help RclMainBase}"_‘Mnÿ&Iÿ &Indexing configuration RclMainBase[šeö}"_ÿ&Iÿ &Indexing schedule RclMainBase ˜yÿ&Pÿ  &Preferences RclMainBasegå‹â‘Mnÿ&Qÿ &Query configuration RclMainBase‘Íe°g„ }"_ÿ&Rÿ &Rebuild index RclMainBasef>y:]ò}"_v„e‡Nö|{W‹ÿ&Sÿ &Show indexed types RclMainBasef>y::\v„…R©z ^Rˆhÿ&Sÿ &Show missing helpers RclMainBasec’^SÂepÿ&Sÿ &Sort parameters RclMainBase ]åQwÿ&Tÿ &Tools RclMainBaseu(b7bKQŒÿ&Uÿ  &User manual RclMainBasešØzï/Y gBd}"Advanced/complex Search RclMainBaseQhèAll RclMainBase Ctrl+QCtrl+Q RclMainBasee‡hcS†SòDocument History RclMainBasee‡hcS†Sòÿ&Hÿ Document &History RclMainBase Qúÿ&xÿ E&xit RclMainBaseYè}"_[ù‹ÝhFÿ&xÿ E&xternal index dialog RclMainBaseYè}"_[ù‹ÝhFExternal index dialog RclMainBaseF11F11 RclMainBase{,N˜u First page RclMainBaseQh\O Full Screen RclMainBaseólR0~Ógœv„{,N˜uGo to first page of results RclMainBaseN N˜u Next page RclMainBase N N˜u~ÓgœNext page of results RclMainBaseTN û˜uPgDown RclMainBaseTN û˜uPgUp RclMainBaseN N˜u Previous page RclMainBase N N˜u~ÓgœPrevious page of results RclMainBase RecollRecoll RclMainBase~ÓgœRˆh Result list RclMainBased}"]åQw Search tools RclMainBaseShift+TN û˜u Shift+PgUp RclMainBasef>y:gå‹â‹íSå~Æ‚‚Show Query Details RclMainBaseNåˆhhy:~ÓgœShow results as table RclMainBasec eågc’Rÿ ge°v„W(RM—b#Sort by dates from newest to oldest RclMainBasec eågc’Rÿ geçv„W(RM—b#Sort by dates from oldest to newest RclMainBasec’^SÂepSort parameters RclMainBase‹Í‹íc¢}"Vhÿ&eÿ Term &explorer RclMainBase ‹Í‹íc¢}"VhTerm explorer tool RclMainBasefôe°}"_ÿ&iÿ  Update &index RclMainBasec eågSG^c’R sortByDateAsc RclMainBasec eåg–M^c’RsortByDateDesc RclMainBasedX‰Abstract RecollModelO\€Author RecollModeleågDate RecollModel eågSÊeö•ô Date and time RecollModele‡hceåg Document date RecollModele‡hc\:[ø Document size RecollModele‡Nöeåg File date RecollModele‡NöT  File name RecollModele‡Nö\:[ø File size RecollModelQ…èï_„Ipath RecollModelQs•.‹ÍKeywords RecollModele‡Nö|{W‹ MIME type RecollModelOîe9eö•ôMtime RecollModelSŸ[W{&–ÆOriginal character set RecollModelvøQs^¦Relevancy rating RecollModelh˜˜Title RecollModelï_„URL RecollModel bS_ÿ&Oÿ &OpenResListbS_N N~§e‡hc/vî_Uÿ&Oÿ &Open Parent document/folderResList ˜„‰Èÿ&Pÿ &PreviewResListQ™Qee‡Nöÿ&Wÿ &Write to FileResListÿf>y:gå‹â‹íSå~Æ‚‚ÿ  (show query)ResList&<p><b>g*b~R0~Ógœ</b><br>

No results found
ResList.<p><i>Qv[ƒbüQ™_b_ÿ_ý‰ÆSã—óÿ ÿ</i>4

Alternate spellings (accents suppressed): ResListY R6e‡NöT ÿ&Fÿ Copy &File NameResListY R6ï_„ÿ&Uÿ  Copy &URLResListe‡hcS†SòDocument historyResList{, DocumentsResListgåb~|{O <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-23T08:43:25" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-23T09:07:39" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .Standard { font-size:12pt; font-family:Nimbus Roman No9 L; writing-mode:page; } .T1 { font-style:italic; } .T2 { font-style:italic; } .T4 { font-weight:bold; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="Standard">“Qegå‹â‹íŠˆh¾_0{€‰‹ôfÿ<br/><span class="T2">‹Í‹í</span><span class="T1">1 </span><span class="T2">‹Í‹í</span><span class="T1">2</span> : '‹Í‹í1'TŒ'‹Í‹í2'T eöQús°W(Nûa[WkµN-0<br/><span class="T2">[Wkµ</span><span class="T1">:</span><span class="T2">‹Í‹í</span><span class="T1">1</span> : '‹Í‹í1'Qús°W([Wkµ'[Wkµ'N-0<br/>hQÆ[WkµT /T NIT ÿ<br/>title/subject/caption0author/from0recipient/to0filename0ext0<br/>O*[WkµT ÿdir0mime/format0type/rclcat0date0<br/>eågkµv„N$N*y:O‹ÿ2009-03-01/2009-05-20 2009-03-01/P2M0<br/><span class="T2">‹Í‹í</span><span class="T1">1 </span><span class="T2">‹Í‹í</span><span class="T1">2 OR </span><span class="T2">‹Í‹í</span><span class="T1">3</span> : ‹Í‹í1 <span class="T4">N</span> (‹Í‹í2 <span class="T4">b</span> ‹Í‹í3)0<br/>N QA‹¸u(wkcv„bìS÷geˆhy:;‘Qs|û0<br/><span class="T1">"</span><span class="T2">‹Í‹í</span><span class="T1">1 </span><span class="T2">‹Í‹í</span><span class="T1">2"</span> : ‹Í~Äÿ_Ř{c SŸh7Qús°ÿ 0Sïu(v„Oî™p‹Íÿ<br/><span class="T1">"</span><span class="T2">‹Í‹í</span><span class="T1">1 </span><span class="T2">‹Í‹í</span><span class="T1">2"p</span> : NåžØ‹¤Ýy»ÛˆLv„eà^ÑOg u‘•îeöSïOu(<span class="T4">f>y:gå‹â‹íSå~Æ‚‚</span>”þc¥gegåw gå‹â‹íSåv„~Æ‚‚ÿ SæY‹÷gåw bKQŒÿ&lt;F1&gt;ÿ NåN†‰ãfôYQ…[¹0</p></body></html> éEnter query language expression. Cheat sheet:
term1 term2 : 'term1' and 'term2' in any field.
field:term1 : 'term1' in field 'field'.
Standard field names/synonyms:
title/subject/caption, author/from, recipient/to, filename, ext.
Pseudo-fields: dir, mime/format, type/rclcat, date.
Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
term1 term2 OR term3 : term1 AND (term2 OR term3).
No actual parentheses allowed.
"term1 term2" : phrase (must occur exactly). Possible modifiers:
"term1 term2"p : unordered proximity search with default distance.
Use Show Query link when in doubt about result and see manual (<F1>) for more detail. SSearchBW(kd“Qe‰d}"v„‹Í‹í0c Esc zzhSelect the type of query that will be performed with the words SearchClauseW Qs•íÿ&Cÿ &Close SpellBase \U_ÿ&Eÿ &Expand  SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBaseg*b~R0epcn^“Oá`o0 No db info. SpellBase ‹Í‹íc¢}"Vh Term Explorer SpellBaseAspellbi\UQú•0Aspell expansion error. SpellW0AspellRYËSY1%0f/T&g*[‰ˆÅAspellÿ)Aspell init failed. Aspell not installed?SpellW e‡hcep/`;ep Doc. / Tot.SpellW&}"_ÿ%1N*e‡hcÿ ^sWG•^¦N:%2N*‹Í‹í,Index: %1 documents, average length %2 termsSpellW g*b~R0bi\UNo expansion foundSpellW kcRˆh¾_RegexpSpellWbüQ™/SÑ—óhÀgåSpelling/PhoneticSpellW‹Íh9bi\UStem expansionSpellW‹Í‹íTermSpellW‘M{& WildcardsSpellWcÐSÖ‹Íh9‹íŠeöQú•#error retrieving stemming languagesSpellW béChoose UIPrefsDialogZ béxapian}"_vî_UÿO‹Y‚ÿ/home/buddy/.recoll/xapiandbÿ @Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) UIPrefsDialog N-v„vî_UN f/Xapian}"_;The selected directory does not appear to be a Xapian index UIPrefsDialog N-v„vî_U]ò~ÏW(}"_RˆhN-3The selected directory is already in the index list UIPrefsDialogÙf/N;‰/g,W0}"_ÿThis is the main/local index! UIPrefsDialogcÐSÖ‹Íh9‹íŠeöQú•#error retrieving stemming languages UIPrefsDialogkcW(”ˆ[ùN T v„_SRMP<€ e9SØR¨O\.Changing actions with different current values ViewActionT}NäCommand ViewActione‡Nö|{W‹ MIME type ViewActionOîe9R¨O\ Change ActionViewActionBaseQs•íCloseViewActionBase g,W0gåw VhNative ViewersViewActionBaseH N-NN*bYN*e‡Nö|{W‹ÿ q6Tp¹Qû Oîe9R¨O\ geOîe9u(gebS_ÙN›e‡Növ„z ^bSelect one or several file types, then click Change Action to modify the program used to open themViewActionBasež N-NN*bYN*e‡Nö|{W‹y_p¹Qû Oîe9R¨O\ <br>b€SïNåQs•íÙN*[ù‹ÝhFÿ € W(N;—bgN- N- Ou(hL—bžØ‹¤‹¾n <br>£h7\1Oeà‰ÆÙN*Rˆh€ Ou(hL—bv„žØ‹¤‹¾n0ÉSelect one or several mime types then click "Change Action"
You can also close this dialog and check "Use desktop preferences"
in the main panel to ignore this list and use your desktop defaults.ViewActionBasetN SïЈLBeagle0T/u([ùbeagle–Rv„Ytÿ Nå}"_pkrÐQ˜uS†Sò0<br>ÿO`Ø—‰[‰ˆÅpkrÐBeaglecÒNöÿ ”Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.
(you should also install the Firefox Beagle plugin)confgui::ConfBeaglePanelW(_S\:[ø¾R0‹¾[šPY‚gœOu(vø[ùï_„ÿ ROvø[ùNŽ‘Mnvî_Uv„ï_„ÛˆLYt0‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWQ˜uP¨[Xvî_UT Web page store directory nameconfgui::ConfBeaglePanelWeàlÕQ™Qe‘Mne‡NöCan't write configuration fileconfgui::ConfIndexW béChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWœYèÇnäVhv„bgˆLeö•ôY‚gœ…ÇÙN*P<ÿ ROˆ«_:ˆLN-e­0W(U‰Áv„`ÅQµN ÿ gÐN›e‡hcÿO‹Y‚postscriptÿ O[üôÇnäVh–wQek{_ªs¯0‹¾nb-1Nåˆhy:N R –PR60 «External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. confgui::ConfSubPanelWQh\@Globalconfgui::ConfSubPanelW|Y‚gœ‹¾nT¯ÙN*P<ÿN {INŽ-1ÿ ÿ Re‡g,e‡NöOˆ«RRrbÙNHY'v„WWÿ ^vNÛˆL}"_0 Ùf/u(ged}"Y'W‹e‡g,e‡Növ„ÿO‹Y‚‹°_Ue‡Nöÿ 0¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWS‹)e‡NögY'\:[øÿKBÿ Max. compressed file size (KB)confgui::ConfSubPanelWÇnäVhv„g•bgˆLeö•ôÿSÿ Max. filter exec. time (S)confgui::ConfSubPanelWe‡g,e‡NögY'\:[øÿMBÿ Max. text file size (MB)confgui::ConfSubPanelWe‡g,e‡NöSU˜u\:[øÿKBÿ Text file page size (KB)confgui::ConfSubPanelWd\:[øY'NŽÙN*PW(l¡g [‰ˆÅaspellb€[ƒ]åO\N kc^8eöOu(ÙN* ˜y0†Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelWR7e°}"_v„•ô–”ÿ QF[W‚‚Index flush megabytes intervalconfgui::ConfTopPanelW ‹°_Ue‡NöT  Log file nameconfgui::ConfTopPanelW‹°_Uv„‹Ýuè~§R+Log verbosity levelconfgui::ConfTopPanelWgY'xlvØS`u(s‡ÿ%ÿ Max disk occupation (%)confgui::ConfTopPanelWN Ou(aspellNo aspell usageconfgui::ConfTopPanelW ueÇv„ï_„ Skipped pathsconfgui::ConfTopPanelW‹Íh9‹íŠStemming languagesconfgui::ConfTopPanelWTz ^“Qúv„mˆ`oOˆ«OÝ[XR0ÙN*e‡Nö0<br>Ou('stderr'Nåˆhy:\mˆ`o“QúR0~ÈzïPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWaspell‹ÍQxv„‹íŠ0ˆhy:e¹_f/'en'b'fr' & &<br>Y‚gœN ‹¾nÙN*P<ÿ ROOu(|û~ßs¯XƒN-v„êq6‹íŠ‹¾nOá`oÿ € £N*^8f/kcxnv„0‰`ógåw O`v„|û~ßN-[‰ˆÅT¯TêN›‹íŠv„‹Ýÿ \1bgˆL'aspell config'ÿ QW('data-dir'vî_UN-b~.date‡Nö02The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW*\O”ˆ[ùÙN›‹íŠ<br>g„ ‹Íh9bi\U‹ÍQx0IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW:}"_NÎÙN*RˆhN-v„vî_U_YËÿ _RW0ÛˆL0žØ‹¤ÿO`v„[¶vî_U0LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWtu(geP¨[X}"_epcnv„vî_Uv„T [W<br>Y‚gœOu(vø[ùï_„ÿ Rï_„Ovø[ùNŽ‘Mnvî_UÛˆL‹¡{—0žØ‹¤PA non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelW>}"_Ûz N OÛQeQwg ÙN›T [Wv„vî_U0<br>SïNåST+‘M{&0_Ř{S9‘M}"_Ûz ꎫb@‰ÁR0v„ï_„ÿO‹Y‚ÿY‚gœtopdirsST+'/home/me'ÿ € [ž–EN '/home'f/R0'/usr/home'v„”þc¥ÿ Rkcxnv„skippedPathgavî^”_Sf/'/home/me/tmp*'ÿ € N f/'/usr/home/me/tmp*'ÿ #These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelWr_SxlvØv„S`u(s‡¾R0ÙN*epeöÿ }"_OY1%^vNP\kbÿNåQMX^náO`v„xlvØÿ 0<br>‹¾N:0Rˆhy:N R –PR6ÿÙf/žØ‹¤P<ÿ 0—This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).
0 means no limit (this is the default).confgui::ConfTopPanelWvÙN*P<Œetv„f/ÿ _Syï}/T¯Y\}"_epcneöÿ bM\epcnR7e°R0xlvØN S»0<br>u(gec§R6}"_Ûz v„Q…[XS`u(`ÅQµ0žØ‹¤N:10MBŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWTÙN*P<Œetv„f/“Qúv„mˆ`ov„ep‘Ïÿ <br>Qv~§R+NÎNÅ“Qúb¥•Oá`oR0“QúNY'XŒ‹ÕOá`o0ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW˜v~§vî_UTop directoriesconfgui::ConfTopPanelWOu(|û~ß‘Ìv„'file'T}NäUse system's 'file' commandconfgui::ConfTopPanelWD_SQ…èv„e‡Nö|{W‹‹ÆR+RŸ€ýY1eHeö<br>Ou(|û~ß‘Ìv„'file'T}Nä0NUse the system's 'file' command if internal
mime type identification fails.confgui::ConfTopPanelW SÖmˆÿ&Cÿ &CanceluiPrefsDialogBase xn[šÿ&Oÿ &OKuiPrefsDialogBase’[ù[nÚ wó] (2N*‹Í‹í)v„d}"OSØb[nÚ or wó or (nÚ 2N*‹Í‹í wó)]0 [ùNŽ£N›d}"‹Í‹íW(QvN-c qgSŸh7Qús°v„~Ógœÿ QvOQH~§OšØNN›0ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBasedX‰N-v„rGkµv„R–”{&Abstract snippet separatoruiPrefsDialogBaseQhèoÀm; Activate AlluiPrefsDialogBasemûR }"_ Add indexuiPrefsDialogBase Oe9SØueH Apply changesuiPrefsDialogBase “Qezzh_ÙN›e9SØDiscard changesuiPrefsDialogBase>\e‡Nö|{W‹ÇnäVhf>y:b]åQwgaÿ € N f/c ”®—bgÿ—‰‘ÍT/z ^ÿ 0KDisplay category filter as toolbar instead of button panel (needs restart).uiPrefsDialogBase4SsOe‡hcg,Ž«båg NN*dX‰ÿ bNìNÍq6êˆLTbdX‰Oá`oÿEDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseTf/T&‰Ou(gå‹â‹Í‹íThVôv„N N e‡geg„ ~ÓgœRˆhgavîN-v„dX‰ÿ [ùNŽY'v„e‡hcSï€ýO_ˆab0zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBase R¨`g„ dX‰Dynamically build abstractsuiPrefsDialogBase ‘~Ógœ˜u—bv„htmlY4ècÒQe˜y#Edit result page html header insertuiPrefsDialogBase‘~Ógœkµ„=v„h<_[W{&N2#Edit result paragraph format stringuiPrefsDialogBaseT/u(EnableuiPrefsDialogBaseYè}"_External IndexesuiPrefsDialogBase¾Ùf/NN*˜‘s‡–P<ÿ …ÇÙN*PR0êR¨‹Í~ÄN-0 šØ˜‘‹Í‹íf/‹Í~ÄN-`'€ý•v„N;‰gen0 ueÇv„‹Í‹íOXžR ‹Í~Äv„zz:P<ÿ VàkdO–MONêR¨‹Í~ÄRŸ€ýv„eHs‡0 žØ‹¤Py:NN*0XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBase6PREN-v„e‡[WN OcbˆL0Ou(BRv„‹ÝOONN›)ÛY1eH0BLines in PRE text are not folded. Using BR loses some indentation.uiPrefsDialogBase0W(˜„‰ÈN-[ùQvÛˆLšØN®f>y:v„gY'e‡g,\:[øÿQF[W‚‚ÿ 5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseNN*~Ógœ˜u—bN-f>y:v„~Ógœgaep"Number of entries in a result pageuiPrefsDialogBase(bS_NN*[ù‹ÝhFÿ Nå béu(NŽ~ÓgœRˆhv„[WOS-Opens a dialog to select the result list fontuiPrefsDialogBase bS_NN*[ù‹ÝhFÿ Nå béh7_SUe‡Nö-Opens a dialog to select the style sheet fileuiPrefsDialogBase˜„‰ÈN-OQHOu(Html0&Prefer Html to plain text for preview.uiPrefsDialogBasegå‹â‹íŠy^YGe‡NöT T0(Query language magic file name suffixes.uiPrefsDialogBase‹°OOc’^r¶`0Remember sort activation state.uiPrefsDialogBase,NÎRˆhN-R –d0ÙN O[ùxlvØN v„}"_ bc_[³07Remove from list. This has no effect on the disk index.uiPrefsDialogBase R –d N-˜yRemove selecteduiPrefsDialogBaseSÖNãe‡hcN-ê^&v„dX‰ Replace abstracts from documentsuiPrefsDialogBase‘ÍnResetuiPrefsDialogBase"\~ÓgœRˆhN-v„[WOS‘Í‹¾N:|û~ߞ؋¤P<1Resets the result list font to the system defaultuiPrefsDialogBase\h7_SU‘ÍnN:žØ‹¤P<!Resets the style sheet to defaultuiPrefsDialogBase~ÓgœRˆh Result ListuiPrefsDialogBase ~ÓgœRˆh[WOSResult list fontuiPrefsDialogBased}"SÂepSearch parametersuiPrefsDialogBaseT/R¨eöbS_šØzïd}"[ù‹ÝhF0'Start with advanced search dialog open.uiPrefsDialogBase‹Íh9‹íŠStemming languageuiPrefsDialogBaseh7_SU Style sheetuiPrefsDialogBaseTbdX‰N N e‡ Synthetic abstract context wordsuiPrefsDialogBaseTbdX‰•^¦ÿ[W{&N*epÿ $Synthetic abstract size (characters)uiPrefsDialogBase4…ÇÙN*•^¦v„e‡g,N OW(˜„‰Èz—Sã‘ÌšØN®f>y:ÿY*abÿ 0CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase@ÙN*RˆhN-v„‹Í‹íOW(gå‹â‹íŠ“QehF‘ÌêR¨SØbext:xxx‹íSå0bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase Rcb N-˜yToggle selecteduiPrefsDialogBaseLW(\~¯e‡g,f>y:bhtml˜„‰Èv„eöPÿ Ou(<PRE>h{~ÿ € N f/<BR>h{~0GUse

 tags instead of 
to display plain text as html in preview.uiPrefsDialogBase$Ou(hL—b|û~ßv„‹¾nge bée‡hc‘Vh02Use desktop preferences to choose document editor.uiPrefsDialogBaseu(b7uL—bUser interfaceuiPrefsDialogBaseu(b7 ˜yUser preferencesuiPrefsDialogBaserecoll-1.17.3/qtgui/i18n/recoll_zh_CN.ts000644 001750 000000 00000314753 11757435273 020340 0ustar00dockeswheel000000 000000 AdvSearch All clauses 全部æ¡ä»¶ Any clause ä»»æ„æ¡ä»¶ texts 文本 spreadsheets 电å­è¡¨æ ¼ presentations 演示文稿 media 多媒体文件 messages 邮件 other 其它 Bad multiplier suffix in size filter 文件尺寸过滤器的åŽç¼€å•ä½ä¸æ­£ç¡® AdvSearchBase Advanced search 高端æœç´¢ Search for <br>documents<br>satisfying: æœç´¢<br>满足以下æ¡ä»¶<br>的文档: Delete clause 删除æ¡ä»¶ Add clause 添加æ¡ä»¶ Restrict file types é™å®šæ–‡ä»¶ç±»åž‹ Check this to enable filtering on file types 选中这个,以便针对文件类型进行过滤 By categories 按大类æ¥è¿‡æ»¤ Check this to use file categories instead of raw mime types 选中这个,以便使用较大的分类,而ä¸ä½¿ç”¨å…·ä½“的文件类型 Save as default ä¿å­˜ä¸ºé»˜è®¤å€¼ Searched file types 将被æœç´¢çš„æ–‡ä»¶ç±»åž‹ All ----> 移动全部→ Sel -----> 移动选中项→ <----- Sel â†ç§»åЍ选䏭项 <----- All â†ç§»åŠ¨å…¨éƒ¨ Ignored file types è¦å¿½ç•¥çš„æ–‡ä»¶ç±»åž‹ Enter top directory for search è¾“å…¥è¦æœç´¢çš„æœ€ä¸Šå±‚目录 Browse æµè§ˆ Restrict results to files in subtree: 将结果中的文件é™å®šåœ¨æ­¤å­ç›®å½•树中: Start Search 开始æœç´¢ Close 关闭 All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. å³è¾¹çš„æ‰€æœ‰éžç©ºå­—段都会按照逻辑与(“全部æ¡ä»¶â€é€‰é¡¹ï¼‰æˆ–é€»è¾‘æˆ–ï¼ˆâ€œä»»æ„æ¡ä»¶â€é€‰é¡¹ï¼‰æ¥ç»„åˆã€‚<br>“任æ„â€â€œå…¨éƒ¨â€å’Œâ€œæ— â€ä¸‰ç§å­—段类型都接å—输入简å•è¯è¯­å’ŒåŒå¼•å·å¼•用的è¯ç»„的组åˆã€‚<br>空的输入框会被忽略。 Invert å转过滤æ¡ä»¶ Minimum size. You can use k/K,m/M,g/G as multipliers 最å°å°ºå¯¸ã€‚ä½ å¯ä½¿ç”¨k/Kã€m/Mã€g/G作为å•ä½ Min. Size 最å°å°ºå¯¸ Maximum size. You can use k/K,m/M,g/G as multipliers 最大尺寸。你å¯ä½¿ç”¨k/Kã€m/Mã€g/G作为å•ä½ Max. Size 最大尺寸 Filter 过滤 From 从 To 到 Check this to enable filtering on dates 选中这个,以便针对日期进行过滤 Filter dates 过滤日期 Find 查找 Check this to enable filtering on sizes 选中这个,以便针对文件尺寸进行过滤 Filter sizes 过滤尺寸 CronToolW Cron Dialog è®¡åˆ’ä»»åŠ¡å¯¹è¯æ¡† <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T19:47:37" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T19:56:53" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } .T3 { font-style:italic; } .T4 { font-family:Courier New,courier; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> 批é‡ç´¢å¼•计划任务(cron) </p><p class="P1">æ¯ä¸ªå­—段都å¯ä»¥åŒ…括一个通é…符(*)ã€å•个数字值ã€é€—å·åˆ†éš”的列表(1,3,5)和范围(1-7)。更准确地说,这些字段会被<span class="T3">按原样</span>输出到crontab 文件中,因此这里å¯ä»¥ä½¿ç”¨crontab 的所有语法,å‚考crontab(5)。</p><p class="P1"><br/>例如,在<span class="T3">日期</span>中输入<span class="T4">*</span>,<span class="T3">å°æ—¶</span>中输入<span class="T4">12,19</span>,<span class="T3">分钟</span>中输入<span class="T4">15 </span>çš„è¯ï¼Œä¼šåœ¨æ¯å¤©çš„12:15 AM å’Œ7:15 PMå¯åЍrecollindex。</p><p class="P1">ä¸€ä¸ªé¢‘ç¹æ‰§è¡Œçš„计划任务,其性能å¯èƒ½æ¯”ä¸ä¸Šå®žæ—¶ç´¢å¼•。</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) 星期日(*或0-7,0或7是指星期天) Hours (* or 0-23) å°æ—¶(*或0-23) Minutes (0-59) 分钟(0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:08:00" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:11:47" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T2 { font-style:italic; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1">点击<span class="T2">ç¦ç”¨</span>ä»¥åœæ­¢è¿›è¡Œè‡ªåŠ¨åŒ–çš„æ‰¹é‡ç´¢å¼•,点击<span class="T2">å¯ç”¨</span>以å¯ç”¨æ­¤åŠŸèƒ½ï¼Œç‚¹å‡»<span class="T2">å–æ¶ˆ</span>åˆ™ä¸æ”¹å˜ä»»ä½•东西。</p></body></html> Enable å¯ç”¨ Disable ç¦ç”¨ It seems that manually edited entries exist for recollindex, cannot edit crontab 看起æ¥å·²ç»æœ‰æ‰‹åŠ¨ç¼–è¾‘è¿‡çš„recollindexæ¡ç›®äº†ï¼Œå› æ­¤æ— æ³•编辑crontab Error installing cron entry. Bad syntax in fields ? æ’å…¥cronæ¡ç›®æ—¶å‡ºé”™ã€‚请检查语法。 EditDialog Dialog å¯¹è¯æ¡† FirstIdxDialog First indexing setup 第一次索引设置 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:14:44" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:23:13" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T2 { font-weight:bold; } .T4 { font-style:italic; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T2">未找到对应于此é…置实例的索引数æ®ã€‚</span><br/><br/>å¦‚æžœä½ åªæƒ³ä»¥ä¸€ç»„åˆç†çš„é»˜è®¤å‚æ•°æ¥ç´¢å¼•你的家目录的è¯ï¼Œå°±ç›´æŽ¥æŒ‰<span class="T4">ç«‹å³å¼€å§‹ç´¢å¼•</span>按钮。以åŽè¿˜å¯ä»¥è°ƒæ•´é…ç½®å‚æ•°çš„。</p><p class="P1">如果你想调整æŸäº›ä¸œè¥¿çš„è¯ï¼Œå°±ä½¿ç”¨ä¸‹é¢çš„链接æ¥è°ƒæ•´å…¶ä¸­çš„索引é…置和定时计划å§ã€‚</p><p class="P1">这些工具å¯åœ¨ä»¥åŽé€šè¿‡<span class="T4">选项</span>èœå•访问。</p></body></html> Indexing configuration 索引é…ç½® This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. 在这里å¯ä»¥è°ƒæ•´ä½ æƒ³è¦å¯¹å…¶è¿›è¡Œç´¢å¼•的目录,以åŠå…¶å®ƒå‚æ•°ï¼Œä¾‹å¦‚ï¼šè¦æŽ’é™¤å’Œè·¯å¾„æˆ–åå­—ã€é»˜è®¤å­—符集…… Indexing schedule 定时索引任务 This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). 在这里å¯ä»¥é€‰æ‹©æ˜¯è¦è¿›è¡Œæ‰¹é‡ç´¢å¼•还是实时索引,还å¯ä»¥è®¾ç½®ä¸€ä¸ªè‡ªåŠ¨åŒ–çš„å®šæ—¶ï¼ˆä½¿ç”¨cron)批é‡ç´¢å¼•任务。 Start indexing now ç«‹å³å¼€å§‹ç´¢å¼• IdxSchedW Index scheduling setup 定时索引设置 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:27:11" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:30:49" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> 索引程åºå¯æŒç»­è¿è¡Œå¹¶ä¸”在文件å‘生å˜åŒ–时对其进行索引,也å¯ä»¥é—´éš”一定时间è¿è¡Œä¸€æ¬¡ã€‚</p><p class="P1">ä½ å¯ä»¥è¯»ä¸€ä¸‹æ‰‹å†Œï¼Œä»¥ä¾¿æ›´å¥½åœ°åšå‡ºæŠ‰æ‹©ï¼ˆæŒ‰F1)。</p><p class="P1">这个工具å¯å¸®åŠ©ä½ è®¾ç½®ä¸€ä¸ªè‡ªåŠ¨è¿›è¡Œæ‰¹é‡ç´¢å¼•的定时任务,或者设置æˆå½“你登录时便å¯åŠ¨å®žæ—¶ç´¢å¼•ï¼ˆæˆ–è€…ä¸¤è€…åŒæ—¶è¿›è¡Œï¼Œå½“然那几乎没有æ„义)。</p></body></html> Cron scheduling 定时任务 The tool will let you decide at what time indexing should run and will install a crontab entry. 这个工具帮助你确定一个让索引è¿è¡Œçš„æ—¶é—´ï¼Œå®ƒä¼šæ’入一个crontabæ¡ç›®ã€‚ Real time indexing start up 实时索引设置 Decide if real time indexing will be started when you log in (only for the default index). 作出决定,是å¦è¦åœ¨ç™»å½•时便å¯åŠ¨å®žæ—¶ç´¢å¼•ï¼ˆåªå¯¹é»˜è®¤ç´¢å¼•有效)。 ListDialog Dialog å¯¹è¯æ¡† GroupBox 分组框 Main No db directory in configuration é…置实例中没有数æ®åº“目录 "history" file is damaged or un(read)writeable, please check or remove it: "history"文件被æŸå,或者ä¸å¯ï¼ˆè¯»ï¼‰å†™ï¼Œè¯·æ£€æŸ¥ä¸€ä¸‹æˆ–者删除它: Preview Close Tab 关闭标签页 Cancel å–æ¶ˆ Missing helper program: 缺少辅助程åºï¼š Can't turn doc into internal representation for æ— æ³•ä¸ºæ­¤æ–‡ä»¶å°†æ–‡æ¡£è½¬æ¢æˆå†…部表示方å¼ï¼š Creating preview text 正在创建预览文本 Loading preview text into editor 正在将预览文本载入到编辑器中 &Search for: æœç´¢ï¼ˆ&S): &Next 下一个(&N) &Previous 上一个(&P) Clear 清空 Match &Case 匹é…大å°å†™ï¼ˆ&C) Cannot create temporary directory: 无法创建临时目录: Error while loading file 文件载入出错 PreviewTextEdit Show fields 显示字段 Show main text 显示主文本 Print æ‰“å° Print Current Preview 打å°å½“å‰é¢„览文本 Show image 显示图片 Select All 全选 Copy å¤åˆ¶ Save document to file 将文档ä¿å­˜åˆ°æ–‡ä»¶ Fold lines 自动æ¢è¡Œ Preserve indentation ä¿ç•™ç¼©è¿›ç¬¦ QObject Global parameters 免局傿•° Local parameters å±€éƒ¨å‚æ•° <b>Customised subtrees <b>自定义的å­ç›®å½•æ ‘ The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. 这是已索引的目录树中的一些å­ç›®å½•组æˆçš„列表<br>,它们的æŸäº›å‚数需è¦é‡å®šä¹‰ã€‚默认:空白。 <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>ä»¥ä¸‹çš„å‚æ•°ï¼Œå½“你在上é¢çš„列表中ä¸é€‰ä¸­ä»»ä½•æ¡ç›®æˆ–者选中一个空行时,<br>就是针对顶级目录起作用的,å¦åˆ™ä¾¿æ˜¯å¯¹é€‰ä¸­çš„å­ç›®å½•起作用的。<br>ä½ å¯ä»¥ç‚¹å‡»+/-按钮,以便添加或删除目录。 Skipped names è¦ç•¥è¿‡çš„æ–‡ä»¶å These are patterns for file or directory names which should not be indexed. 具有这些模å¼çš„æ–‡ä»¶æˆ–目录ä¸ä¼šè¢«ç´¢å¼•。 Default character set 默认字符集 This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. 这是用æ¥è¯»å–那些未标明自身的字符集的文件时所使用的字符集,例如纯文本文件。<br>é»˜è®¤å€¼æ˜¯ç©ºï¼Œä¼šä½¿ç”¨ç³»ç»Ÿé‡Œçš„è‡ªç„¶è¯­è¨€çŽ¯å¢ƒå‚æ•°ä¸­çš„值。 Follow symbolic links 跟踪符å·é“¾æŽ¥ Follow symbolic links while indexing. The default is no, to avoid duplicate indexing 在索引时跟踪符å·é“¾æŽ¥ã€‚默认是ä¸è·Ÿè¸ªçš„,以é¿å…é‡å¤ç´¢å¼• Index all file names 对所有文件å进行索引 Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true 对那些无法判断或处ç†å…¶å†…容(未知类型或其类型ä¸è¢«æ”¯æŒï¼‰çš„æ–‡ä»¶çš„å字进行索引。默认为是 Beagle web history Beagleç½‘é¡µåŽ†å² RTIToolW Real time indexing automatic start 实时索引自动å¯åЍ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T21:00:38" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T21:02:43" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> 索引程åºå¯ä»¥ä»¥å®ˆæŠ¤è¿›ç¨‹çš„æ–¹å¼è¿è¡Œï¼Œåœ¨æ–‡ä»¶å‘生å˜åŒ–æ—¶ä¾¿å®žæ—¶æ›´æ–°ç´¢å¼•ã€‚è¿™æ ·ä½ çš„ç´¢å¼•ä¸€ç›´æ˜¯ä¸Žæ–‡ä»¶åŒæ­¥çš„,但是会å ç”¨ä¸€å®šçš„系统资æºã€‚</p></body></html> Start indexing daemon with my desktop session. 在我的桌é¢ä¼šè¯å¯åŠ¨æ—¶ä¾¿å¯åŠ¨ç´¢å¼•è¿›ç¨‹ã€‚ Also start indexing daemon right now. åŒæ—¶æ­¤æ¬¡ä¹Ÿç«‹å³å¯åŠ¨ç´¢å¼•è¿›ç¨‹ã€‚ Replacing: 正在替æ¢ï¼š Replacing file æ­£åœ¨æ›¿æ¢æ–‡ä»¶ Can't create: 无法创建: Warning 警告 Could not execute recollindex 无法执行recollindex Deleting: 正在删除: Deleting file 正在删除文件 Removing autostart 正在删除自动å¯åЍ项 Autostart file deleted. Kill current process too ? 自动å¯åŠ¨æ–‡ä»¶å·²ç»åˆ é™¤ã€‚ä¹Ÿè¦æ€æ­»å½“å‰è¿›ç¨‹å—? RclMain (no stemming) (ä¸è¿›è¡Œè¯æ ¹è®¡ç®—) (all languages) ï¼ˆå¯¹å…¨éƒ¨è¯­è¨€è¿›è¡Œè¯æ ¹è®¡ç®—) error retrieving stemming languages æå–è¯æ ¹è¯­è¨€æ—¶å‡ºé”™ Indexing in progress: 正在索引: Purge 删除 Stemdb Stemæ•°æ®åº“ Closing 正在关闭 Unknown 未知 Query results 查询结果 Cannot retrieve document info from database 无法从数æ®åº“èŽ·å–æ–‡æ¡£ä¿¡æ¯ Warning 警告 Can't create preview window æ— æ³•åˆ›å»ºé¢„è§ˆçª—å£ This search is not active any more 这个查询已ç»ä¸æ˜¯æ´»è·ƒçš„了 Bad viewer command line for %1: [%2] Please check the mimeconf file 针对%1的查看命令[%2]é…置出错 请检查mimeconf文件 Cannot extract document or create temporary file 无法æå–文档或创建临时文件 Executing: [ 正在执行:[ About Recoll Recoll说明 History data åŽ†å²æ•°æ® Document history æ–‡æ¡£åŽ†å² Update &Index 更新索引(&I) Stop &Indexing åœæ­¢ç´¢å¼•(&I) All 全部 media 多媒体文件 message 邮件 other 其它 presentation 演示文档 spreadsheet 电å­è¡¨æ ¼ text 文本文件 sorted å·²æŽ’åº filtered 已过滤 External applications/commands needed and not found for indexing your file types: 需è¦ç”¨æ¥è¾…助对你的文件进行索引,å´åˆæ‰¾ä¸åˆ°çš„外部程åº/命令: No helpers found missing ç›®å‰ä¸ç¼ºå°‘ä»»ä½•è¾…åŠ©ç¨‹åº Missing helper programs æœªæ‰¾åˆ°çš„è¾…åŠ©ç¨‹åº Document category filter 文档分类过滤器 No external viewer configured for mime type [ é’ˆå¯¹æ­¤ç§æ–‡ä»¶ç±»åž‹æ²¡æœ‰é…置外部查看器[ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? 没有找到mimeview中为%1: %2é…置的查看器。 是å¦è¦æ‰“å¼€é€‰é¡¹å¯¹è¯æ¡†ï¼Ÿ Can't access file: 无法访问文件: Can't uncompress file: 无法解压缩此文件: Save file ä¿å­˜æ–‡ä»¶ Result count (est.) 结果数(估计值) Query details 查询语å¥ç»†èŠ‚ Could not open external index. Db not open. Check external indexes list. 无法打开外部索引。数æ®åº“未打开。请检查外部索引列表。 No results found 未找到结果 None æ—  Updating 正在更新 Done å·²å®Œæˆ Monitor 监视器 Indexing failed 索引失败 The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone 当å‰ç´¢å¼•è¿›ç¨‹ä¸æ˜¯ç”±æ­¤ç•Œé¢å¯åŠ¨çš„ã€‚ç‚¹å‡»ç¡®å®šä»¥æ€æ­»å®ƒï¼Œæˆ–è€…ç‚¹å‡»å–æ¶ˆä»¥è®©å®ƒè‡ªç”±è¿è¡Œ Erasing index 正在删除索引 Reset the index and start from scratch ? ä»Žå¤´é‡æ–°å¼€å§‹ç´¢å¼•å—? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program 查询正在进行中。<br>由于索引库的æŸäº›é™åˆ¶ï¼Œ<br>å–æ¶ˆçš„è¯ä¼šå¯¼è‡´ç¨‹åºé€€å‡º Error 错误 Index not open 索引未打开 Index query error 索引查询出错 Content has been indexed for these mime types: å·²ç»ä¸ºè¿™äº›æ–‡ä»¶ç±»åž‹ç´¢å¼•其内容: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. æ­¤æ–‡ä»¶çš„ç´¢å¼•å·²è¿‡æ—¶ã€‚ç¨‹åºæ‹’ç»æ˜¾ç¤ºé”™è¯¯çš„æ¡ç›®ã€‚è¯·ç‚¹å‡»ç¡®å®šä»¥æ›´æ–°æ­¤æ–‡ä»¶çš„ç´¢å¼•ï¼Œç­‰å¾…ç´¢å¼•å®Œæˆä¹‹åŽå†æŸ¥è¯¢ã€‚æˆ–è€…ï¼Œå–æ¶ˆã€‚ Can't update index: indexer running 无法更新索引:索引程åºå·²åœ¨è¿è¡Œ Indexed MIME Types 已索引的文件类型 RclMainBase Recoll Recoll Search tools æœç´¢å·¥å…· Result list 结果列表 &File 文件(&F) &Tools 工具(&T) &Preferences 选项(&P) &Help 帮助(&H) E&xit 退出(&x) Ctrl+Q Ctrl+Q Update &index 更新索引(&i) &Erase document history 删除文档历å²ï¼ˆ&E) &About Recoll Recoll说明(&A) &User manual 用户手册(&U) Document &History 文档历å²ï¼ˆ&H) Document History æ–‡æ¡£åŽ†å² &Advanced Search 高端æœç´¢ï¼ˆ&A) Advanced/complex Search 高端/夿‚æœç´¢ &Sort parameters 排åºå‚数(&S) Sort parameters 排åºå‚æ•° Term &explorer è¯è¯­æŽ¢ç´¢å™¨ï¼ˆ&e) Term explorer tool è¯è¯­æŽ¢ç´¢å™¨ Next page 下一页 Next page of results 下一页结果 First page 第一页 Go to first page of results 跳转到结果的第一页 Previous page 上一页 Previous page of results 上一页结果 &Query configuration 查询é…置(&Q) External index dialog å¤–éƒ¨ç´¢å¼•å¯¹è¯æ¡† &Indexing configuration 索引é…置(&I) All 全部 &Show missing helpers 显示缺少的辅助程åºåˆ—表(&S) PgDown å‘下翻页 PgUp å‘上翻页 &Full Screen å…¨å±ï¼ˆ&F) F11 F11 Full Screen å…¨å± &Erase search history 删除æœç´¢åކå²ï¼ˆ&E) sortByDateAsc 按日期å‡åºæŽ’列 Sort by dates from oldest to newest 按日期排列,最旧的在å‰é¢ sortByDateDesc 按日期é™åºæŽ’列 Sort by dates from newest to oldest 按日期排列,最新的在å‰é¢ Show Query Details 显示查询语å¥ç»†èŠ‚ Show results as table ä»¥è¡¨æ ¼çš„å½¢å¼æ˜¾ç¤ºç»“æžœ &Rebuild index 釿–°æž„造索引(&R) &Show indexed types 显示已索引的文件类型(&S) Shift+PgUp Shift+å‘上翻页 &Indexing schedule 定时索引(&I) E&xternal index dialog å¤–éƒ¨ç´¢å¼•å¯¹è¯æ¡†ï¼ˆ&x) RecollModel Abstract æ‘˜è¦ Author 作者 Document size 文档尺寸 Document date 文档日期 File size 文件尺寸 File name 文件å File date 文件日期 Keywords å…³é”®è¯ Original character set 原字符集 Relevancy rating 相关度 Title 标题 URL 路径 Mtime 修改时间 Date 日期 Date and time æ—¥æœŸåŠæ—¶é—´ Ipath 内部路径 MIME type 文件类型 ResList Result list 结果列表 (show query) (显示查询语å¥ç»†èŠ‚ï¼‰ &Preview 预览(&P) Copy &File Name å¤åˆ¶æ–‡ä»¶å(&F) Copy &URL å¤åˆ¶è·¯å¾„(&U) Find &similar documents 查找类似的文档(&s) Document history æ–‡æ¡£åŽ†å² <p><b>No results found</b><br> <p><b>未找到结果</b><br> Previous 上一个 Next 下一个 Unavailable document 无法访问文档 Preview 预览 Open 打开 <p><i>Alternate spellings (accents suppressed): </i> <p><i>其它拼写形å¼ï¼ˆå¿½è§†å£éŸ³ï¼‰ï¼š</i> &Write to File 写入文件(&W) Preview P&arent document/folder 预览上一级文档/目录(&a) &Open Parent document/folder 打开上一级文档/目录(&O) &Open 打开(&O) Documents 第 out of at least 个文档,最少共有 for 个文档,查询æ¡ä»¶ï¼š ResTable &Reset sort é‡ç½®æŽ’åºæ¡ä»¶ï¼ˆ&R) &Delete column 删除此列(&D) Save table to CSV file 将表格ä¿å­˜æˆCSV文件 Can't open/create file: 无法打开/创建文件: &Preview 预览(&P) &Open 打开(&O) Copy &File Name å¤åˆ¶æ–‡ä»¶å(&F) Copy &URL å¤åˆ¶è·¯å¾„(&U) &Write to File 写入文件(&W) Find &similar documents 查找类似的文档(&s) Preview P&arent document/folder 预览上一级文档/目录(&a) &Open Parent document/folder 打开上一级文档/目录(&O) &Save as CSV ä¿å­˜ä¸ºCSV(&S) Add "%1" column 添加"%1"列 ResTableDetailArea &Preview 预览(&P) &Open 打开(&O) Copy &File Name å¤åˆ¶æ–‡ä»¶å(&F) Copy &URL å¤åˆ¶è·¯å¾„(&U) &Write to File 写入文件(&W) Find &similar documents 查找类似的文档(&s) Preview P&arent document/folder 预览上一级文档/目录(&a) &Open Parent document/folder 打开上一级文档/目录(&O) SSearch Any term 任一è¯è¯­ All terms 全部è¯è¯­ File name 文件å Query language 查询语言 Bad query string 查询语言格å¼ä¸æ­£ç¡® Out of memory 内存ä¸è¶³ Too many completions 有太多与之相关的补全选项啦 Completions 补全选项 Select an item: 选择一个æ¡ç›®ï¼š Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-23T08:43:25" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-23T09:07:39" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .Standard { font-size:12pt; font-family:Nimbus Roman No9 L; writing-mode:page; } .T1 { font-style:italic; } .T2 { font-style:italic; } .T4 { font-weight:bold; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="Standard">输入查询语言表达å¼ã€‚简è¦è¯´æ˜Žï¼š<br/><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2</span> : 'è¯è¯­1'å’Œ'è¯è¯­2'åŒæ—¶å‡ºçŽ°åœ¨ä»»æ„字段中。<br/><span class="T2">字段</span><span class="T1">:</span><span class="T2">è¯è¯­</span><span class="T1">1</span> : 'è¯è¯­1'出现在字段'字段'中。<br/>标准字段å/åŒä¹‰å:<br/>title/subject/captionã€author/fromã€recipient/toã€filenameã€ext。<br/>伪字段å:dirã€mime/formatã€type/rclcatã€date。<br/>日期段的两个示例:2009-03-01/2009-05-20 2009-03-01/P2M。<br/><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2 OR </span><span class="T2">è¯è¯­</span><span class="T1">3</span> : è¯è¯­1 <span class="T4">与</span> (è¯è¯­2 <span class="T4">或</span> è¯è¯­3)。<br/>ä¸å…è®¸ç”¨çœŸæ­£çš„æ‹¬å·æ¥è¡¨ç¤ºé€»è¾‘关系。<br/><span class="T1">"</span><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2"</span> : è¯ç»„(必须按原样出现)。å¯ç”¨çš„修饰è¯ï¼š<br/><span class="T1">"</span><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2"p</span> : 以默认è·ç¦»è¿›è¡Œçš„æ— åºè¿‘ä¼¼æœç´¢ã€‚<br/>有疑问时å¯ä½¿ç”¨<span class="T4">显示查询语å¥ç»†èŠ‚</span>é“¾æŽ¥æ¥æŸ¥çœ‹æŸ¥è¯¢è¯­å¥çš„细节,å¦å¤–请查看手册(&lt;F1&gt;)以了解更多内容。</p></body></html> Enter file name wildcard expression. 输入文件å通é…符表达å¼ã€‚ Enter search terms here. Type ESC SPC for completions of current term. åœ¨æ­¤è¾“å…¥è¦æœç´¢çš„è¯è¯­ã€‚按Esc ç©ºæ ¼æ¥æŸ¥çœ‹é’ˆå¯¹å½“å‰è¯è¯­çš„补全选项。 SSearchBase SSearchBase SSearchBase Clear 清空 Ctrl+S Ctrl+S Erase search entry 删除æœç´¢æ¡ç›® Search æœç´¢ Start query 开始查询 Enter search terms here. Type ESC SPC for completions of current term. åœ¨æ­¤è¾“å…¥è¦æœç´¢çš„è¯è¯­ã€‚按Esc ç©ºæ ¼æ¥æŸ¥çœ‹é’ˆå¯¹å½“å‰è¯è¯­çš„补全选项。 Choose search type. 选择æœç´¢ç±»åž‹ã€‚ SearchClauseW Select the type of query that will be performed with the words 选择è¦å¯¹å³è¾¹çš„è¯è¯­è¿›è¡Œçš„æŸ¥è¯¢ç±»åž‹ Number of additional words that may be interspersed with the chosen ones å…许在选中的è¯è¯­ä¹‹é—´å‡ºçŽ°çš„é¢å¤–è¯è¯­çš„个数 No field ä¸é™å­—段 Any ä»»æ„ All 全部 None æ—  Phrase è¯ç»„ Proximity è¿‘ä¼¼ File name 文件å SpellBase Term Explorer è¯è¯­æŽ¢ç´¢å™¨ &Expand 展开(&E) Alt+E Alt+E &Close 关闭(&C) Alt+C Alt+C No db info. 未找到数æ®åº“ä¿¡æ¯ã€‚ SpellW Wildcards 通é…符 Regexp æ­£åˆ™è¡¨è¾¾å¼ Stem expansion è¯æ ¹æ‰©å±• Spelling/Phonetic 拼写/å‘音检查 error retrieving stemming languages æå–è¯æ ¹è¯­è¨€æ—¶å‡ºé”™ Aspell init failed. Aspell not installed? Aspellåˆå§‹åŒ–å¤±è´¥ã€‚æ˜¯å¦æœªå®‰è£…Aspell? Aspell expansion error. Aspell扩展出错。 No expansion found 未找到扩展 Term è¯è¯­ Doc. / Tot. 文档数/总数 Index: %1 documents, average length %2 terms 索引:%1个文档,平å‡é•¿åº¦ä¸º%2个è¯è¯­ UIPrefsDialog error retrieving stemming languages æå–è¯æ ¹è¯­è¨€æ—¶å‡ºé”™ The selected directory does not appear to be a Xapian index é€‰ä¸­çš„ç›®å½•ä¸æ˜¯Xapian索引 This is the main/local index! 这是主è¦/æœ¬åœ°ç´¢å¼•ï¼ The selected directory is already in the index list 选中的目录已ç»åœ¨ç´¢å¼•列表中 Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) 选择xapian索引目录(例如:/home/buddy/.recoll/xapiandb) Choose 选择 ViewAction Changing actions with different current values 正在针对ä¸åŒçš„当å‰å€¼è€Œæ”¹å˜åŠ¨ä½œ Command 命令 MIME type 文件类型 ViewActionBase Native Viewers 本地查看器 Select one or several file types, then click Change Action to modify the program used to open them 选中一个或多个文件类型,然åŽç‚¹å‡»â€œä¿®æ”¹åŠ¨ä½œâ€æ¥ä¿®æ”¹ç”¨æ¥æ‰“å¼€è¿™äº›æ–‡ä»¶çš„ç¨‹åº Change Action 修改动作 Close 关闭 Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. 选中一个或多个文件类型祟点击“修改动作â€<br>或者å¯ä»¥å…³é—­è¿™ä¸ªå¯¹è¯æ¡†ï¼Œè€Œåœ¨ä¸»é¢æ¿ä¸­é€‰ä¸­â€œä½¿ç”¨æ¡Œé¢é»˜è®¤è®¾ç½®â€<br>那样就会无视这个列表而使用桌é¢çš„默认设置。 confgui::ConfBeaglePanelW Steal Beagle indexing queue 窃å–Beagle索引队列 Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) ä¸å¯è¿è¡ŒBeagle。å¯ç”¨å¯¹beagle队列的处ç†ï¼Œä»¥ç´¢å¼•ç«ç‹ç½‘页历å²ã€‚<br>(你还需è¦å®‰è£…ç«ç‹Beagleæ’件) Entries will be recycled once the size is reached 当尺寸达到设定值时,这些æ¡ç›®ä¼šè¢«å¾ªçŽ¯ä½¿ç”¨ Web page store directory name 网页储存目录å The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. 用æ¥å‚¨å­˜å¤åˆ¶è¿‡æ¥çš„已访问网页的目录å。<br>如果使用相对路径,则会相对于é…置目录的路径进行处ç†ã€‚ Max. size for the web store (MB) 网页存储的最大尺寸(MB) confgui::ConfIndexW Can't write configuration file 无法写入é…置文件 confgui::ConfParamFNW Choose 选择 confgui::ConfParamSLW + + - - confgui::ConfSubPanelW Global 全局 Max. compressed file size (KB) 压缩文件最大尺寸(KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. 尺寸大于这个值的压缩文件ä¸ä¼šè¢«å¤„ç†ã€‚设置æˆ-1以表示ä¸åР任何é™åˆ¶ï¼Œè®¾ç½®æˆ0以表示根本ä¸å¤„ç†åŽ‹ç¼©æ–‡ä»¶ã€‚ Max. text file size (MB) 文本文件最大尺寸(MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. 尺寸大于这个值的文本文件ä¸ä¼šè¢«å¤„ç†ã€‚设置æˆ-1以表示ä¸åŠ é™åˆ¶ã€‚ 其作用是从索引中排除巨型的记录文件。 Text file page size (KB) 文本文件å•页尺寸(KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). 如果设置咯这个值(ä¸ç­‰äºŽ-1),则文本文件会被分割æˆè¿™ä¹ˆå¤§çš„å—,并且进行索引。 è¿™æ˜¯ç”¨æ¥æœç´¢å¤§åž‹æ–‡æœ¬æ–‡ä»¶çš„(例如记录文件)。 Max. filter exec. time (S) 过滤器的最长执行时间(S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. 外部过滤器的执行时间如果超过这个值,则会被强行中断。在罕è§çš„æƒ…况下,æŸäº›æ–‡æ¡£ï¼ˆä¾‹å¦‚postscript)会导致过滤器陷入死循环。设置æˆ-1以表示ä¸åŠ é™åˆ¶ã€‚ confgui::ConfTopPanelW Top directories 顶级目录 The list of directories where recursive indexing starts. Default: your home. 索引从这个列表中的目录开始,递归地进行。默认:你的家目录。 Skipped paths 略过的路径 These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') 索引进程ä¸ä¼šè¿›å…¥å…·æœ‰è¿™äº›å字的目录。<br>å¯ä»¥åŒ…å«é€šé…符。必须匹é…索引进程自身所è§åˆ°çš„路径(例如:如果topdirs包å«'/home/me',而实际上'/home'是到'/usr/home'的链接,则正确的skippedPathæ¡ç›®åº”当是'/home/me/tmp*'ï¼Œè€Œä¸æ˜¯'/usr/home/me/tmp*') Stemming languages è¯æ ¹è¯­è¨€ The languages for which stemming expansion<br>dictionaries will be built. 将会针对这些语言<br>æž„é€ è¯æ ¹æ‰©å±•è¯å…¸ã€‚ Log file name 记录文件å The file where the messages will be written.<br>Use 'stderr' for terminal output 程åºè¾“出的消æ¯ä¼šè¢«ä¿å­˜åˆ°è¿™ä¸ªæ–‡ä»¶ã€‚<br>使用'stderr'以表示将消æ¯è¾“出到终端 Log verbosity level 记录的è¯ç—¨çº§åˆ« This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. 这个值调整的是输出的消æ¯çš„æ•°é‡ï¼Œ<br>其级别从仅输出报错信æ¯åˆ°è¾“出一大堆调试信æ¯ã€‚ Index flush megabytes interval 刷新索引的间隔,兆字节 This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB è¿™ä¸ªå€¼è°ƒæ•´çš„æ˜¯ï¼Œå½“ç§¯ç´¯å’¯å¤šå°‘ç´¢å¼•æ•°æ®æ—¶ï¼Œæ‰å°†æ•°æ®åˆ·æ–°åˆ°ç¡¬ç›˜ä¸ŠåŽ»ã€‚<br>ç”¨æ¥æŽ§åˆ¶ç´¢å¼•è¿›ç¨‹çš„å†…å­˜å ç”¨æƒ…况。默认为10MB Max disk occupation (%) 最大硬盘å ç”¨çŽ‡ï¼ˆ%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). 当硬盘的å ç”¨çŽ‡è¾¾åˆ°è¿™ä¸ªæ•°æ—¶ï¼Œç´¢å¼•ä¼šå¤±è´¥å¹¶ä¸”åœæ­¢ï¼ˆä»¥é¿å…塞满你的硬盘)。<br>设为0则表示ä¸åŠ é™åˆ¶ï¼ˆè¿™æ˜¯é»˜è®¤å€¼ï¼‰ã€‚ No aspell usage ä¸ä½¿ç”¨aspell Aspell language Aspell语言 The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. aspellè¯å…¸çš„è¯­è¨€ã€‚è¡¨ç¤ºæ–¹å¼æ˜¯'en'或'fr'……<br>如果ä¸è®¾ç½®è¿™ä¸ªå€¼ï¼Œåˆ™ä¼šä½¿ç”¨ç³»ç»ŸçŽ¯å¢ƒä¸­çš„è‡ªç„¶è¯­è¨€è®¾ç½®ä¿¡æ¯ï¼Œè€Œé‚£ä¸ªé€šå¸¸æ˜¯æ­£ç¡®çš„ã€‚è¦æƒ³æŸ¥çœ‹ä½ çš„系统中安装咯哪些语言的è¯ï¼Œå°±æ‰§è¡Œ'aspell config',å†åœ¨'data-dir'目录中找.dat文件。 Database directory name æ•°æ®åº“目录å The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. 用æ¥å‚¨å­˜ç´¢å¼•æ•°æ®çš„目录的åå­—<br>如果使用相对路径,则路径会相对于é…置目录进行计算。默认值是'xapiandb'。 Use system's 'file' command 使用系统里的'file'命令 Use the system's 'file' command if internal<br>mime type identification fails. 当内部的文件类型识别功能失效时<br>使用系统里的'file'命令。 Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. ç¦æ­¢åœ¨è¯è¯­æŽ¢ç´¢å™¨ä¸­ä½¿ç”¨aspellæ¥ç”Ÿæˆæ‹¼å†™ç›¸è¿‘çš„è¯è¯­ã€‚<br>在没有安装aspellæˆ–è€…å®ƒå·¥ä½œä¸æ­£å¸¸æ—¶ä½¿ç”¨è¿™ä¸ªé€‰é¡¹ã€‚ uiPrefsDialogBase User preferences 用户选项 User interface ç”¨æˆ·ç•Œé¢ Number of entries in a result page 一个结果页é¢ä¸­æ˜¾ç¤ºçš„ç»“æžœæ¡æ•° If checked, results with the same content under different names will only be shown once. å¦‚æžœé€‰ä¸­è¿™ä¸ªï¼Œåˆ™æ‹¥æœ‰ç›¸åŒæ–‡ä»¶å†…容的ä¸åŒæ–‡ä»¶ååªä¼šæ˜¾ç¤ºä¸€ä¸ªã€‚ Hide duplicate results. éšè—é‡å¤ç»“果。 Highlight color for query terms 查询è¯è¯­çš„高亮颜色 Result list font 结果列表字体 Opens a dialog to select the result list font æ‰“å¼€ä¸€ä¸ªå¯¹è¯æ¡†ï¼Œä»¥é€‰æ‹©ç”¨äºŽç»“果列表的字体 Helvetica-10 文泉驿微米黑-12 Resets the result list font to the system default 将结果列表中的字体é‡è®¾ä¸ºç³»ç»Ÿé»˜è®¤å€¼ Reset é‡ç½® Texts over this size will not be highlighted in preview (too slow). 超过这个长度的文本ä¸ä¼šåœ¨é¢„览窗å£é‡Œé«˜äº®æ˜¾ç¤ºï¼ˆå¤ªæ…¢ï¼‰ã€‚ Maximum text size highlighted for preview (megabytes) 在预览中对其进行高亮显示的最大文本尺寸(兆字节) Use desktop preferences to choose document editor. 使用桌é¢ç³»ç»Ÿçš„设置æ¥é€‰æ‹©æ–‡æ¡£ç¼–辑器。 Choose editor applications é€‰æ‹©ç¼–è¾‘å™¨ç¨‹åº Display category filter as toolbar instead of button panel (needs restart). 将文件类型过滤器显示æˆå·¥å…·æ¡ï¼Œè€Œä¸æ˜¯æŒ‰é’®é¢æ¿ï¼ˆéœ€è¦é‡å¯ç¨‹åºï¼‰ã€‚ Auto-start simple search on whitespace entry. è¾“å…¥ç©ºæ ¼æ—¶è‡ªåŠ¨å¼€å§‹è¿›è¡Œç®€å•æœç´¢ã€‚ Start with advanced search dialog open. å¯åŠ¨æ—¶æ‰“å¼€é«˜ç«¯æœç´¢å¯¹è¯æ¡†ã€‚ Remember sort activation state. è®°ä½æŽ’åºçжæ€ã€‚ Prefer Html to plain text for preview. 预览中优先使用Html。 Search parameters æœç´¢å‚æ•° Stemming language è¯æ ¹è¯­è¨€ A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. 对[滚 石] (2个è¯è¯­)çš„æœç´¢ä¼šå˜æˆ[滚 or 石 or (滚 2个è¯è¯­ 石)]。 对于那些æœç´¢è¯è¯­åœ¨å…¶ä¸­æŒ‰ç…§åŽŸæ ·å‡ºçŽ°çš„ç»“æžœï¼Œå…¶ä¼˜å…ˆçº§ä¼šé«˜ä¸€äº›ã€‚ Automatically add phrase to simple searches 自动将è¯ç»„æ·»åŠ åˆ°ç®€å•æœç´¢ä¸­ Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. 是å¦è¦ä½¿ç”¨æŸ¥è¯¢è¯è¯­å‘¨å›´çš„ä¸Šä¸‹æ–‡æ¥æž„造结果列表æ¡ç›®ä¸­çš„æ‘˜è¦ï¼Ÿ 对于大的文档å¯èƒ½ä¼šå¾ˆæ…¢ã€‚ Dynamically build abstracts åŠ¨æ€æž„é€ æ‘˜è¦ Do we synthetize an abstract even if the document seemed to have one? å³ä½¿æ–‡æ¡£æœ¬èº«æ‹¥æœ‰ä¸€ä¸ªæ‘˜è¦ï¼Œæˆ‘们ä»ç„¶è‡ªè¡Œåˆæˆæ‘˜è¦ä¿¡æ¯ï¼Ÿ Replace abstracts from documents å–ä»£æ–‡æ¡£ä¸­è‡ªå¸¦çš„æ‘˜è¦ Synthetic abstract size (characters) åˆæˆæ‘˜è¦é•¿åº¦ï¼ˆå­—符个数) Synthetic abstract context words åˆæˆæ‘˜è¦ä¸Šä¸‹æ–‡ The words in the list will be automatically turned to ext:xxx clauses in the query language entry. 这个列表中的è¯è¯­ä¼šåœ¨æŸ¥è¯¢è¯­è¨€è¾“å…¥æ¡†é‡Œè‡ªåŠ¨å˜æˆext:xxx语å¥ã€‚ Query language magic file name suffixes. 查询语言神奇文件ååŽç¼€ã€‚ Enable å¯ç”¨ External Indexes 外部索引 Toggle selected 切æ¢é€‰ä¸­é¡¹ Activate All 全部激活 Deactivate All 全部ç¦ç”¨ Remove from list. This has no effect on the disk index. 从列表中删除。这ä¸ä¼šå¯¹ç¡¬ç›˜ä¸Šçš„ç´¢å¼•é€ æˆæŸå®³ã€‚ Remove selected 删除选中项 Click to add another index directory to the list 点击这里,以将å¦ä¸€ä¸ªç´¢å¼•目录添加到列表中 Add index 添加索引 Apply changes 使改å˜ç”Ÿæ•ˆ &OK 确定(&O) Discard changes æ”¾å¼ƒè¿™äº›æ”¹å˜ &Cancel å–æ¶ˆï¼ˆ&C) Abstract snippet separator 摘è¦ä¸­çš„片段的分隔符 Style sheet æ ·å¼å• Opens a dialog to select the style sheet file æ‰“å¼€ä¸€ä¸ªå¯¹è¯æ¡†ï¼Œä»¥é€‰æ‹©æ ·å¼å•文件 Choose 选择 Resets the style sheet to default 将样å¼å•é‡ç½®ä¸ºé»˜è®¤å€¼ Lines in PRE text are not folded. Using BR loses some indentation. PRE中的文字ä¸ä¼šæ¢è¡Œã€‚使用BRçš„è¯ä¼šä½¿ä¸€äº›ç¼©è¿›å¤±æ•ˆã€‚ Use <PRE> tags instead of <BR>to display plain text as html in preview. 在将纯文本显示æˆhtml预览的时候,使用<PRE>æ ‡ç­¾ï¼Œè€Œä¸æ˜¯<BR>标签。 Result List 结果列表 Edit result paragraph format string 编辑结果段è½çš„æ ¼å¼å­—符串 Edit result page html header insert 编辑结果页é¢çš„html头部æ’入项 Date format (strftime(3)) 日期格å¼ï¼ˆstrftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). 这是一个频率阈值,超过这个值的è¯ï¼Œæˆ‘们就ä¸ä¼šæŠŠè¯è¯­æ”¾åˆ°è‡ªåЍè¯ç»„中。 高频è¯è¯­æ˜¯è¯ç»„ä¸­æ€§èƒ½é—®é¢˜çš„ä¸»è¦æ¥æºã€‚ 略过的è¯è¯­ä¼šå¢žåŠ è¯ç»„的空缺值,因此会é™ä½Žè‡ªåЍè¯ç»„功能的效率。 默认值是2(百分比)。 Autophrase term frequency threshold percentage 自动è¯ç»„频率阈值百分比 recoll-1.17.3/qtgui/i18n/recoll_cs.qm000644 001750 000000 00000243327 11757435371 017730 0ustar00dockeswheel000000 000000 <¸dÊÍ!¿`¡½ÝB °+ìi-ì–¯Š+;,H,…VH,¤­H,Ò*HYÒUIA¦ÒZl³mb¹p¦yeC¨¥¯°¶EŒÙ] Lô·¡VE”’VEÓf¾·ËlÀ¨ø¬Ú ¬ôžsEî1@$—Â_'H乕*Ð% *ì0 ‘+Lô`Ê+f¾³L+f¾º!+f¾¾Á1ø>:Îd G…Ô-¦Gߥ´H6óÕÆH6õÕóJ+‚b¥J+‚ϯJ6• 1J6•àL™bŒ“Ph¨±ŒT°5±ýWTe}WÈÕ”¼XÉÄ.[ %²âe®cgwîÂîsºñ)sºñCv8“–av®Â’v®Â§zϳ6€€£õ„j€ËŒ!þ°0œûÉÍÝØ®½Þ(m¶Êð€€ÃÞ»óÐùƒœ€ÐùƒÚzÐùƒÞUã3®‰ãnôÕ ^Eµ›/&`Žö0,…û[>.cm‹Do2‘iXM¹(-X®©2­`Þ^µUh0è”lÿtÒÑnÚgW„3Ø‘v㵕ñ“m<œW­àŠž€ÞŽÍ¢‰òë£cêæÎxCg­Þñƒo¬ó L… þSIÎÿµø[ çn#¸Îp#kvå”ív奰½w 5±w 5ÍÅw 5ÒŒwî±C€¢#·ŒUøŸ.ƒe£¹Þé©Ö³Ú6ª6•ÕZ¯†”‚k»f3£µËÂîŽͼu(üÐgžÐÔÂõczØ.^â ê•Êίì;Uˆ(ï¡©4úUdÛúeîú ¬8F!D/— ‹ND&Á<.‡NpA7Î ¸=úd0(?údª5?úd¸ãG$ßµJUY‹ÌJUY¶·Y ôØÆ[–uf_n×Ýs¾~6?z ÓÞæº™35u!o–Ê·‡—¯¡3¢Ê—¥xÎÅå*#Ôä^%ÝôL«ã¿ÖÌìxú¶ùJg NþA¢­‚B \ß<.)çÞÏTõ«çëd¬Œ;[¾Ö <Äö»[LƒàEe 2’ÞvhÕêþ€ã‡†Å…(P‡6Œ¯b¯€’"3 ’ZÓ «˜I¼aø™n•1štµ…{Ÿf•ÛŸf•ì-Ÿf•«¤Ö«Ï௃W4Z¯ƒW^›Äy%1¶Äy% ß΄՘VÐ: EÚ#!ãX|ï åõW0¥Ì”  -Z ÜzÏ×/-¼­Ô)ÖT.ÈB9€øÏBìSÔk¶Þ¨¦oˆ•Ô r?)´{rž„©|ôò„kå´-„k廤„kå¿Ã‹¦,ª‹ÜðÙ'ŒÇ<£í›ˆ˜Ñ¯¦AS™ªÃ¢—È·¨ »œRÖ¿gu¡/Ç¢•¶ Ç¢•¼¸Ç¢•À×I^§=Ø~C yèêÈŒHéã>]hðŒµ2`³©•" Ñá:ªæýUKô0{p hhu9Iò–T#fÈ—BbÚšKê¦ %E¦öõ稫‡œ¶7¹ÄÖ[“ ÊXÔënDÄðw)ÔIþÙC-#+ä2`7I^ GFW#Ó?F¯N¦H:"³}H:"ºSH:"¾ý_guGXŒÍw³ûŒÍwºÒŒÍw¿†ŒÏ—·ùn´Ã“’ž¦š´ž²ð ¶d²ð ½²ð À‚´ù€ÿ ¾l¯–šÓtž>Èàƒ)Ɇt5êéŽ#«3_ áùÛ8:uî*ÚQçÇkæozìÃ}}k€;E¾RŽÄ^'7”ò“2©œ .r¸¨0ÎÜÄÑnÌí³`÷ͳ¸­×°†^ÝÜ*äœc §ä´¥‚Üæí:‰¢ö¨åü³ú Ã8¢ ´Hžì 9ZyÑ K¨ó¨D ]#—“¾ cÄIäñ k¨µg lMˆ^Ì ‰Œî4º ŸÁò¸( ŸÁò½Ì ŸÁòÁN «ƒÔ¯N ­îõã ®œ¯‰ ²9ñà ü>,> äîh íåõÜ Ücf ).~ È *R3 +<”ýÚ 6 ‰q G.~Fñ `P’- `ç£ c·E¦û d8ß“ ydh ˜Iœñ ¤žïJ ±Túä ²ëC·> ²ëC½h ²ëCÀà Áùš Äã· âæç¦_ åKĈ æõç¥é ®¥ ®ù¥] Ô… C ye1ƒ TH5 ŽÚa0 =!KÛ CK€b& KjײРT|c¢è h¹°ah tÓ9Ø éò^ £Ü f† ¨Î£§Œ »ïµˆÞ Öüõ«z Û·å©H ÛÓú Vd‘Î 'И¤C /¥’ 97Ãþ 9É•@ L*» PÖ™„^ RVŽ›¡ T#oø Vüý \iC-ý ]æùçÔ `F¥ d hôî¹Ø v—¥—‰ {l+Œ €!Y—. ‘–²‹b ©zó` ¬æà Ërh ÓÍ™ï Ú÷Ùº Ýøì é—~& ö†ÀÕŒ zs½ m£±» 'RçG´ -èô², 8þ[ FÁŽ9 OE°F€ m†C%ˆ uò0ªÖ y·Ý y¹~Å ‚±3² …È©: ‡uÎk ‰P„* ‰PœM 5d)t ’ãnßÅ ¤š„”4 ¬Š©0ä ½ý7ZÜ ÕH ½ û£Ùf q©Ÿ­€$Ñ%Ýnu$/¸.ˆ16“®ì<Þ3Ã4‹Qá~,ËY~s£a[žs­1\Н1èg3¨pû~[Õ  î!® ‚´k(µ“ÃÎú»m€¼EÂ|“0çÎÁ'—þâ‚ó lž›ü©Ücü¶L£i9Vaechny výrazy All clauses AdvSearch Nkterý z výrazo Any clause AdvSearchZ`patná pYípona násobitele ve filtru velikosti$Bad multiplier suffix in size filter AdvSearchMultimediamedia AdvSearch Zprávymessages AdvSearchJinéother AdvSearchPYedstavení presentations AdvSearchTabulky spreadsheets AdvSearch Textytexts AdvSearch<----- Vae <----- All AdvSearchBase<----- Výbr <----- Sel AdvSearchBase"PYidat nový výraz Add clause AdvSearchBase"Pokro ilé hledáníAdvanced search AdvSearchBaseVae ----> All ----> AdvSearchBase:Vaechna pole napravo, která nejsou prázdná, budou spojována spojeními AND (volba "Vaechny výrazy") nebo OR (volba "Nkterý z výrazo"). <br>Typy polí "Jakékoli" "Vae" a "}ádné" mohou pYijmout sms jednoduchých slov, a vty uzavYené dvojitými uvozovkami.<br>Pole bez dat jsou pYehlí~ena.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBaseProcházetBrowse AdvSearchBasePodle skupin By categories AdvSearchBasefZaakrtnte pro zapnutí filtrování na souborové typy,Check this to enable filtering on file types AdvSearchBasenZaakrtnte pro pou~ívání skupin souboro místo mime-typo;Check this to use file categories instead of raw mime types AdvSearchBase ZavYítClose AdvSearchBase*Smazat poslední výraz Delete clause AdvSearchBaseHZadejte základní adresáY pro hledáníEnter top directory for search AdvSearchBaseFiltrovatFilter AdvSearchBaseZFrom AdvSearchBase2PYehlí~ené souborové typyIgnored file types AdvSearchBaseObrátitInvert AdvSearchBase"Nejvtaí velikost Max. Size AdvSearchBasexNejvtaí velikost: Mo~ete pou~ít k/K,m/M,g/G jako násobitele4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase"Nejmenaí velikost Min. Size AdvSearchBasexNejmenaí velikost: Mo~ete pou~ít k/K,m/M,g/G jako násobitele4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase.Omezit souborových typoRestrict file types AdvSearchBaselOmezit výsledky na soubory v následujícím podadresáYi:%Restrict results to files in subtree: AdvSearchBase&Ulo~it jako výchozíSave as default AdvSearchBasejHledat dokumenty, které splHují následující hlediska:'Search for
documents
satisfying: AdvSearchBase,Hledané souborové typySearched file types AdvSearchBaseVýbr -----> Sel -----> AdvSearchBaseSpustit hledání Start Search AdvSearchBaseKTo AdvSearchBaseÚ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> dávkový rejstYíkovací rozvrh (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ka~dé pole mo~e obsahovat zástupný symbol (*), jednoduchou  íselnou hodnotu,  árkou oddlené seznamy (1,3,5) a rozsahy (1-7). Obecnji, pole se budou pou~ívat <span style=" font-style:italic;">jak je</span> uvnitY souboru crontab, a lze pou~ít úplnou stavbu crontab, podívejte se na crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />NapYíklad, zadání <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Dny, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> a <span style=" font-family:'Courier New,courier';">15</span> v <span style=" font-style:italic;">Minuty</span> spustí rejstYíkování (recollindex) ka~dý den v 12:15 dopoledne a 7:15 odpoledne</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rozvrh s velmi  astým spuatním je pravdpodobn mén ú inný ne~ je rejstYíkování ve skute ném  ase.</p></body></html>Å

Recoll batch indexing schedule (cron)

Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used as is inside the crontab file, and the full crontab syntax can be used, see crontab(5).


For example, entering * in Days, 12,19 in Hours and 15 in Minutes would start recollindex every day at 12:15 AM and 7:15 PM

A schedule with very frequent activations is probably less efficient than real time indexing.

 CronToolW€<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Klepnte na <span style=" font-style:italic;">Zakázat</span> pro zastavení automatického dávkového rejstYíkování, <span style=" font-style:italic;">Povolit</span> pro jeho zapnutí, <span style=" font-style:italic;">Zruait</span>, aby vae zostalo beze zmny.</p></body></html>š

Click Disable to stop automatic batch indexing, Enable to activate it, Cancel to change nothing.

 CronToolWDialog Cron Cron Dialog CronToolWXDny v týdnu (* nebo 0-7, 0 nebo 7 je nedle))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolWZakázatDisable CronToolWPovolitEnable CronToolWtChyba pYi instalaci záznamu cron. `patná skladba v polích?3Error installing cron entry. Bad syntax in fields ? CronToolW(Hodiny (* nebo 0-23)Hours (* or 0-23) CronToolW¢Zdá se, ~e pro recollindex existují ru n upravené záznamy, nelze upravit crontabPIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolWMinuty (0-59)Minutes (0-59) CronToolW DialogDialog EditDialog è<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Zdá se, ~e rejstYík pro toto nastavení neexistuje.</span><br /><br />Pokud chcete pouze zrejstYíkovat svoj domovský adresáY sadou rozumných výchozích nastavení, stisknte tla ítko <span style=" font-style:italic;">Spustit rejstYíkování nyní</span>. Podrobnosti budete moci upravit pozdji. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pokud chcete mít vtaí dohled, pou~ijte následující odkazy pro upravení nastavení rejstYíkování a rozvrhu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">K tmto nástrojom lze pYistupovat pozdji v nabídce <span style=" font-style:italic;">Nastavení</span>.</p></body></html>ê

It appears that the index for this configuration does not exist.

If you just want to index your home directory with a set of reasonable defaults, press the Start indexing now button. You will be able to adjust the details later.

If you want more control, use the following links to adjust the indexing configuration and schedule.

These tools can be accessed later from the Preferences menu.

FirstIdxDialog:První nastavení rejstYíkováníFirst indexing setupFirstIdxDialog.Nastavení rejstYíkováníIndexing configurationFirstIdxDialog(Rozvrh rejstYíkováníIndexing scheduleFirstIdxDialog4Spustit rejstYíkování nyníStart indexing nowFirstIdxDialog"Toto vám umo~ní nastavit adresáYe, které chcete rejstYíkovat, a dalaí parametry, jako jsou cesty pro vylou ené soubory, výchozí znakové sady atd.This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.FirstIdxDialogFToto vám umo~ní zvolit mezi dávkovým rejstYíkováním a rejstYíkováním ve skute ném  ase, a nastavit automatický rozvrh pro dávkové rejstYíkování (za pou~ití cronu).€This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron).FirstIdxDialog $<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> rejstYíkování mo~e b~et nepYetr~it, soubory se rejstYíkují pYi jejich zmn, nebo b~et v samostatných intervalech. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> etba pYíru ky vám mo~e pomoci pYi rozhodování se mezi tmito pYístupy (stisknte F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tento nástroj vám mo~e pomoci s nastavením rozvrhu pro automatizaci bho dávkového rejstYíkování, nebo spustit rejstYíkování ve skute ném  ase, kdy~ se pYihlásíte (nebo obojí, co~ zYídkakdy dává smysl). </p></body></html>¿

Recoll indexing can run permanently, indexing files as they change, or run at discrete intervals.

Reading the manual may help you to decide between these approaches (press F1).

This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense).

 IdxSchedWRozvrh cronCron scheduling IdxSchedWÖRozhodnte, zda se rejstYíkování ve skute ném  ase spustí, kdy~ se pYihlásíte (pouze pro výchozí rejstYík).ZDecide if real time indexing will be started when you log in (only for the default index). IdxSchedW>Nastavení rozvrhu rejstYíkováníIndex scheduling setup IdxSchedWPSpuatní rejstYíkování ve skute ném  aseReal time indexing start up IdxSchedW¶Nástroj vám umo~ní rozhodnout se, kdy má rejstYíkování b~et, a nainstaluje záznam crontab._The tool will let you decide at what time indexing should run and will install a crontab entry. IdxSchedW DialogDialog ListDialog$Seskupovací okénkoGroupBox ListDialogÐSoubor "history" je poakozen nebo nezapisovatelný/ne itelný. ProvYte jej, prosím, anebo jej odstraHte: K"history" file is damaged or un(read)writeable, please check or remove it: MainFNenastaven ~ádný databázový adresáY No db directory in configurationMain &Dalaí&NextPreview&PYedchozí &PreviousPreview&Hledat: &Search for:PreviewDChyba pYi rejstYíkování dokumentu 0Can't turn doc into internal representation for Preview ZruaitCancelPreview@Nelze vytvoYit do asný adresáY: #Cannot create temporary directory: PreviewVyprázdnitClearPreviewZavYít kartu Close TabPreview2VytváYí se náhledový textCreating preview textPreview6Chyba pYi nahrávání souboruError while loading filePreviewHNáhledový text se nahrává do editoru Loading preview text into editorPreviewLDbát na &psaní velkých a malých písmen Match &CasePreview4Chybí program s nápovdou:Missing helper program: PreviewKopírovatCopyPreviewTextEditTiskPrintPreviewTextEdit2Vytisknout nynjaí náhledPrint Current PreviewPreviewTextEdit4Ulo~it dokument do souboruSave document to filePreviewTextEditVybrat vae Select AllPreviewTextEditUkázat pole Show fieldsPreviewTextEditUkázat obrázek Show imagePreviewTextEdit$Ukázat hlavní textShow main textPreviewTextEdit(<b>Vlastní podstromyCustomised subtreesQObject¾<i>Parametry, které následují, jsou nastaveny bu na nejvyaaí úrovni, pokud nic<br>nebo je v seznamu výae vybrán prázdný Yádek, nebo pro vybraný podadresáY.<br>AdresáYe mo~ete pYidat anebo odebrat klepnutím na tla ítka +/-.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject6Internetová historie BeagleBeagle web historyQObject(Výchozí znaková sadaDefault character setQObject4Sledovat symbolické odkazyFollow symbolic linksQObjectæBhem rejstYíkování sledovat symbolické odkazy. Výchozí nastavení je ne kvoli vyvarovaní se dvojitého rejstYíkováníTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject"Celkové parametryGlobal parametersQObjectHRejstYíkovat vaechny souborové názvyIndex all file namesQObjectRejstYíkovat vaechny názvy souboro, jejich~ obsah nelze ur it nebo zpracovat (~ádný nebo nepodporovaný mime typ). Výchozí hodnota je ano}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject Místní parametryLocal parametersQObject PYesko ené názvy Skipped namesQObjectäSeznam podadresáYo v rejstYíkované hierarchii <br>kde nkteré parametry je potYeba nov vymezit. Výchozí: prázdný.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObjectœToto jsou vzory pro názvy souboro nebo adresáYo, které se nemají rejstYíkovat.LThese are patterns for file or directory names which should not be indexed.QObject~Toto je znaková sada, která se pou~ívá pro  tení souboro, které svou znakovou sadu vnitYn neur ují, napY.. soubory s textem.<br>Výchozí hodnota je prázdná a pou~ívá se hodnota prostYedí NLS.ÒThis is the character set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObjectº<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> rejstYíkování mo~e být nastaveno tak, aby b~elo jako démon. Soubory jsou aktualizovány pYi jejich zmn, ve skute ném  ase. Získáte tak v~dy nejnovjaí rejstYík, ale prostYedky systému se pYi tom pou~ívají nepYetr~it.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>.

Recoll indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.

RTIToolWJSpustit rejstYíkovacího démona ihned.%Also start indexing daemon right now.RTIToolW|Soubor automatického spuatní smazán. Zabít i sou asný proces?2Autostart file deleted. Kill current process too ?RTIToolW Nelze vytvoYit: Can't create: RTIToolWBNepodaYilo se spustit recollindexCould not execute recollindexRTIToolWSmazání souboru Deleting fileRTIToolWMazání: Deleting: RTIToolWhAutomatické spuatní rejstYíkování ve skute ném  ase"Real time indexing automatic startRTIToolWBOdstranní automatického spuatníRemoving autostartRTIToolW"Nahrazení souboruReplacing fileRTIToolWNahrazení: Replacing: RTIToolWzSpustit rejstYíkovacího démona s mým sezením pracovní plochy..Start indexing daemon with my desktop session.RTIToolWVarováníWarningRTIToolW (vaechny jazyky)(all languages)RclMain:(~ádné rozaíYení kmene slova) (no stemming)RclMain"O programu Recoll About RecollRclMainVaeAllRclMain„Chybový pYíkaz pro prohlí~e pro %1: [%2] ProvYte soubor mimeconfCBad viewer command line for %1: [%2] Please check the mimeconf fileRclMain8Nelze pYistoupit k souboru: Can't access file: RclMain:Nelze vytvoYit náhledové oknoCan't create preview windowRclMain.Nelze rozbalit soubor: Can't uncompress file: RclMainRNelze obnovit rejstYík: b~í rejstYíkova #Can't update index: indexer runningRclMainjNelze vytáhnout dokument nebo vytvoYit do asný soubor0Cannot extract document or create temporary fileRclMainL}ádné informace o dokumentu v databázi+Cannot retrieve document info from databaseRclMainZavYeníClosingRclMainTObsah byl rejstYíkován pro tyto mime typy:.Content has been indexed for these mime types:RclMain¾NepodaYilo se otevYít vnjaí rejstYík. Databáze neotevYena. ProvYte seznam vnjaích rejstYíko.HCould not open external index. Db not open. Check external indexes list.RclMain6Filtr pro skupinu dokumentuDocument category filterRclMain$Historie dokumentuDocument historyRclMain HotovoDoneRclMain"Smazání rejstYíku Erasing indexRclMain ChybaErrorRclMainProvádí se: [ Executing: [RclMainÊPro rejstYíkování vaaich mime typo jsou potYeba vnjaí programy/pYíkazy, které ale nebyly nalezeny: SExternal applications/commands needed and not found for indexing your file types: RclMainHistorická data History dataRclMain$RejstYík neotevYenIndex not openRclMainÌRejstYík není pro tento soubor nejnovjaí. Odmítá se riziko, ~e by byl ukázán apatný záznam. Klepnte na OK pro obnovení rejstYíku pro tento soubor, pak, a~ bude rejstYíkování hotovo, spusete dotaz znovu. Jinak klepnte na Zruait.´Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel.RclMain8Chyba pYi dotazu na rejstYíkIndex query errorRclMain4RejstYíkování se nezdaYiloIndexing failedRclMain RejstYíkuje se: Indexing in progress: RclMain,Chybí pomocné programyMissing helper programsRclMain DohledMonitorRclMainh}ádný vnjaí prohlí~e nebyl nastaven pro mime typ [-No external viewer configured for mime type [RclMainBNenalezeny ~ádné pomocné programyNo helpers found missingRclMain2Nenalezeny ~ádné výsledkyNo results foundRclMain }ádnýNoneRclMainVy istitPurgeRclMain*Podrobnosti o hledání Query detailsRclMain Hledání b~í.<br>Kvoli omezením rejstYíkovací knihovny<br>zruaení ukon í programeQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMainVýsledky Query resultsRclMainPNastavit rejstYík znovu a za ít od nuly?(Reset the index and start from scratch ?RclMain,Po et výsledko (odhad)Result count (est.)RclMainUlo~it soubor Save fileRclMainKmeny slovStemdbRclMain.Zastavit &rejstYíkováníStop &IndexingRclMainNynjaí rejstYíkovací proces nebyl spuatn z tohoto rozhraní. Klepnte na OK pro jeho zabití, nebo na Zruait, aby byl ponechán sámyThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMain¼Prohlí~e stanovený v mime zobrazení pro %1: %2 nenalezen. Chcete spustit dialog s nastavením?hThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMain4Toto hledání u~ není  inné"This search is not active any moreRclMainNeznámýUnknownRclMain"Obnovit &rejstYík Update &IndexRclMain ObnovaUpdatingRclMainVarováníWarningRclMainLChyba pYi vyhledání jazyka kmene slova#error retrieving stemming languagesRclMainFiltrovánofilteredRclMainMultimediamediaRclMain ZprávamessageRclMainJinéotherRclMainPYedstavení presentationRclMainTYídnosortedRclMainTabulky spreadsheetRclMainTexttextRclMain$&O programu Recoll &About Recoll RclMainBase$&Pokro ilé hledání&Advanced Search RclMainBase6&Vymazat historii dokumentu&Erase document history RclMainBase2&Vymazat historii hledání&Erase search history RclMainBase&Soubor&File RclMainBase&Celá obrazovka &Full Screen RclMainBase&Nápovda&Help RclMainBase0Nastavení &rejstYíkování&Indexing configuration RclMainBase*Rozvrh &rejstYíkování&Indexing schedule RclMainBase&Nastavení &Preferences RclMainBase$Nastavení &hledání&Query configuration RclMainBase0&Sestavit rejstYík znovu&Rebuild index RclMainBase4&Ukázat rejstYíkované typy&Show indexed types RclMainBaseD&Ukázat chybjící pomocné programy&Show missing helpers RclMainBase$Parametry &tYídní&Sort parameters RclMainBase&Nástroje&Tools RclMainBase*&U~ivatelská pYíru ka &User manual RclMainBase2Pokro ilé/Slo~ené hledáníAdvanced/complex Search RclMainBaseVaeAll RclMainBase Ctrl+QCtrl+Q RclMainBase$Historie dokumentuDocument History RclMainBase&&Historie dokumentuDocument &History RclMainBase&Ukon itE&xit RclMainBase@Dialog pro &vnjaí rejstYíkováníE&xternal index dialog RclMainBase>Dialog pro vnjaí rejstYíkováníExternal index dialog RclMainBaseF11F11 RclMainBasePrvní strana First page RclMainBase$Na celou obrazovku Full Screen RclMainBase<Jít na první stranu s výsledkyGo to first page of results RclMainBaseDalaí strana Next page RclMainBase.Dalaí strana s výsledkyNext page of results RclMainBase,O stranu dolo (PgDown)PgDown RclMainBase,O stranu nahoru (PgUp)PgUp RclMainBase PYedchozí strana Previous page RclMainBase6PYedchozí strana s výsledkyPrevious page of results RclMainBase RecollRecoll RclMainBase"Seznam s výsledky Result list RclMainBase(Nástroje pro hledání Search tools RclMainBaseShift+PgUp Shift+PgUp RclMainBase4Ukázat podrobnosti hledáníShow Query Details RclMainBase8Ukázat výsledky jako tabulkuShow results as table RclMainBasebRoztYídit podle data od nejnovjaího po nejstaraí#Sort by dates from newest to oldest RclMainBasebRoztYídit podle data od nejstaraího po nejnovjaí#Sort by dates from oldest to newest RclMainBase"Parametry tYídníSort parameters RclMainBase$Prozkumník &výrazoTerm &explorer RclMainBase4Nástroj prozkumníka výrazoTerm explorer tool RclMainBase"Obnovit &rejstYík Update &index RclMainBase6TYídit podle data vzestupn sortByDateAsc RclMainBase4TYídit podle data sestupnsortByDateDesc RclMainBase VýtahAbstract RecollModel AutorAuthor RecollModel DatumDate RecollModelDatum a  as Date and time RecollModelDatum dokumentu Document date RecollModel$Velikost dokumentu Document size RecollModelDatum souboru File date RecollModelNázev souboru File name RecollModel Velikost souboru File size RecollModel IpathIpath RecollModelKlí ová slovaKeywords RecollModel MtimeMtime RecollModel(Povodní znaková sadaOriginal character set RecollModel(Hodnocení záva~nostiRelevancy rating RecollModel NázevTitle RecollModelAdresa (URL)URL RecollModel&OtevYít&OpenResListF&OtevYít rodi ovský dokument/slo~ku&Open Parent document/folderResList&Náhled&PreviewResList$&Zapsat do souboru&Write to FileResList (ukázat hledání) (show query)ResListX<p><b>Nebyly nalezeny ~ádné výsledky</b><br>

No results found
ResListd<p><i>Náhradní pravopis (pYízvuky potla eny): </i>4

Alternate spellings (accents suppressed): ResList0Kopírovat název &souboruCopy &File NameResList.Kopírovat adresu (&URL) Copy &URLResList$Historie dokumentuDocument historyResListDokumenty DocumentsResList0Najít &podobné dokumentyFind &similar documentsResList DalaíNextResListOtevYítOpenResList NáhledPreviewResListJNáhled na &rodi ovský dokument/slo~kuPreview P&arent document/folderResListPYedchozíPreviousResListVýsledky Result listResList&Nedostupný dokumentUnavailable documentResListproforResListmimo alespoHout of at leastResList&Smazat sloupec&Delete columnResTable&OtevYít&OpenResTableF&OtevYít rodi ovský dokument/slo~ku&Open Parent document/folderResTable&Náhled&PreviewResTable.Nastavit tYídní &znovu &Reset sortResTable &Ulo~it jako CSV &Save as CSVResTable$&Zapsat do souboru&Write to FileResTable&PYidat sloupec "%1"Add "%1" columnResTable>Nelze otevYít/vytvoYit soubor: Can't open/create file: ResTable0Kopírovat název &souboruCopy &File NameResTable.Kopírovat adresu (&URL) Copy &URLResTable0Najít &podobné dokumentyFind &similar documentsResTableJNáhled na &rodi ovský dokument/slo~kuPreview P&arent document/folderResTable<Ulo~it tabulku jako soubor CSVSave table to CSV fileResTable&OtevYít&OpenResTableDetailAreaF&OtevYít rodi ovský dokument/slo~ku&Open Parent document/folderResTableDetailArea&Náhled&PreviewResTableDetailArea$&Zapsat do souboru&Write to FileResTableDetailArea0Kopírovat název &souboruCopy &File NameResTableDetailArea.Kopírovat adresu (&URL) Copy &URLResTableDetailArea0Najít &podobné dokumentyFind &similar documentsResTableDetailAreaJNáhled na &rodi ovský dokument/slo~kuPreview P&arent document/folderResTableDetailAreaVaechny výrazy All termsSSearchJakýkoli výrazAny termSSearch,`patný Yetzec hledáníBad query stringSSearchDoplnní CompletionsSSearchvZadejte ~olíkový výraz (zástupný symbol) pro název souboru.$Enter file name wildcard expression.SSearch Zadejte výraz jazyka hledání. Seznam:<br> <i>term1 term2</i> : 'term1' a 'term2' do kteréhokoli pole.<br> <i>field:term1</i> : 'term1' do pole 'field'.<br> Obvyklé názvy polí/synonyma:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudopole: dir, mime/format, type/rclcat, date.<br> PYíklady intervalo dvou dat: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> Nepovoleny ~ádné závorky.<br> <i>"term1 term2"</i> : vtný úsek (musí se objevit pYesn). Mo~né modifikátory:<br> <i>"term1 term2"p</i> : neuspoYádané hledání podle blízkosti s výchozí vzdáleností.<br> Pou~ijte odkaz <b>Ukázat hledání</b>, kdy~ máte o výsledku pochybnost, a podívejte se do pYíru ky (&lt;F1>) na dalaí podrobnosti. éEnter query language expression. Cheat sheet:
term1 term2 : 'term1' and 'term2' in any field.
field:term1 : 'term1' in field 'field'.
Standard field names/synonyms:
title/subject/caption, author/from, recipient/to, filename, ext.
Pseudo-fields: dir, mime/format, type/rclcat, date.
Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
term1 term2 OR term3 : term1 AND (term2 OR term3).
No actual parentheses allowed.
"term1 term2" : phrase (must occur exactly). Possible modifiers:
"term1 term2"p : unordered proximity search with default distance.
Use Show Query link when in doubt about result and see manual (<F1>) for more detail. SSearchšZde zadejte hledané výrazy. Stisknte ESC SPC pro doplnní sou asného výrazu.FEnter search terms here. Type ESC SPC for completions of current term.SSearchNázev souboru File nameSSearch>Není dostupná ~ádná dalaí pame Out of memorySSearchJazyk hledáníQuery languageSSearch Vyberte polo~ku:Select an item:SSearch*PYília mnoho doplnníToo many completionsSSearch(Vyberte typ hledání.Choose search type. SSearchBase SmazatClear SSearchBase Ctrl+SCtrl+S SSearchBasešZde zadejte hledané výrazy. Stisknte ESC SPC pro doplnní sou asného výrazu.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase*Smazat hledaný záznamErase search entry SSearchBaseSSearchBase SSearchBase SSearchBase HledatSearch SSearchBaseSpustit hledání Start query SSearchBaseVaeAll SearchClauseWJakýkolivAny SearchClauseWNázev souboru File name SearchClauseW}ádné poleNo field SearchClauseW }ádnýNone SearchClauseWdPo et slov, která se smjí nacházet mezi hledanýmiHNumber of additional words that may be interspersed with the chosen ones SearchClauseWTato slovaPhrase SearchClauseWPodobné výrazy Proximity SearchClauseWjVyberte druh hledání, se kterým se slova budou hledat>Select the type of query that will be performed with the words SearchClauseW&ZavYít&Close SpellBase&Rozbalit &Expand  SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBase6}ádné informace o databázi. No db info. SpellBase"Prozkumník výrazo Term Explorer SpellBase0Chyba rozaíYení Aspell. Aspell expansion error. SpellWjChyba pYi spuatní Aspellu. Aspell není nainstalován?)Aspell init failed. Aspell not installed?SpellWDok. / Tot. Doc. / Tot.SpellWfRejstYík: %1 dokumento, promrná délka %2 výrazy(o),Index: %1 documents, average length %2 termsSpellW4Nenalezeno ~ádné rozaíYeníNo expansion foundSpellWRegulární výrazRegexpSpellW(Pravopis/HláskoslovíSpelling/PhoneticSpellW*RozaíYení kmene slovaStem expansionSpellW VýrazTermSpellW Zástupné symboly WildcardsSpellWLChyba pYi vyhledání jazyka kmene slova#error retrieving stemming languagesSpellW VybratChoose UIPrefsDialogºVyberte adresáY s rejstYíkem Xapian Indexverzeichnis (napY.: /home/benutzer/.recoll/xapiandb)@Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) UIPrefsDialognZdá se, ~e vybraný adresáY není rejstYíkem Xapian Index;The selected directory does not appear to be a Xapian index UIPrefsDialogdVybraný adresáY je ji~  ástí rejstYíkového seznamu3The selected directory is already in the index list UIPrefsDialog>Toto je hlavní/místní rejstYík!This is the main/local index! UIPrefsDialogLChyba pYi vyhledání jazyka kmene slova#error retrieving stemming languages UIPrefsDialog`Mní se  innosti s odlianými nynjaími hodnotami.Changing actions with different current values ViewAction PYíkazCommand ViewActionZmnit  innost Change ActionViewActionBase ZavYítCloseViewActionBaseProhlí~e eNative ViewersViewActionBaseþWählen Sie einen oder mehrere Dateitypen und klicken Sie auf "Ändere Aktion" um das verknüpfte Programm zum Öffnen anzupassen. bSelect one or several file types, then click Change Action to modify the program used to open themViewActionBaseøVyberte jeden nebo nkolik mime typo a potom klepnte na "Zmnit  innost"<br>Takté~ mo~ete tento dialog zavYít a zaakrtnout "Pou~ít nastavení pracovní plochy"<br>v hlavním panelu, aby se tento seznam pYehlí~el a pracovní plocha se pou~ila jako výchozí.ÉSelect one or several mime types then click "Change Action"
You can also close this dialog and check "Use desktop preferences"
in the main panel to ignore this list and use your desktop defaults.ViewActionBaseJBeagle NESMÏ b~et. Povolí zpracování Yady Beagle pro rejstYíkování internetové historie Firefoxu.<br>(také byste ml nainstalovat pYídavný modul Beagle pro Firefox)”Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.
(you should also install the Firefox Beagle plugin)confgui::ConfBeaglePanelWxZáznamy budou optn pou~ity, jakmile bude velikost dosa~ena1Entries will be recycled once the size is reachedconfgui::ConfBeaglePanelWrNejvtaí velikost pro ukládání internetových stránek (MB) Max. size for the web store (MB)confgui::ConfBeaglePanelW@Ukrást rejstYíkovací Yadu BeagleSteal Beagle indexing queueconfgui::ConfBeaglePanelW"Název pro adresáY, kam se mají ukládat kopie navatívených internetových stránek.<br>Neabsolutní cesta je vzata relativn k adresáYi s nastavením.‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelW^Název adresáYe pro ukládání internetové stránkyWeb page store directory nameconfgui::ConfBeaglePanelW@Nelze zapsat soubor s nastavenímCan't write configuration fileconfgui::ConfIndexW VybratChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWrVnjaí filtry pracující déle ne~ po tak dlouho budou pYeruaeny. Je to pro ten zYídkavý pYípad (napY. postscript), kdy by dokument mohl zapYí init filtr loopSet na -1 pro ~ádné omezení. «External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. confgui::ConfSubPanelWCelkovéGlobalconfgui::ConfSubPanelWªPokud je nastavena tato hodnota (nerovná se -1), textové soubory budou pro rejstYíkování rozdleny na kousky o této velikosti. To pomo~e pYi prohledávání velmi velkých textových souboro (napY. souboro se zápisem).¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWRNejvtaí velikost zabaleného souboru (KB)Max. compressed file size (KB)confgui::ConfSubPanelWHNejvtaí  as na provedení filtru (s)Max. filter exec. time (S)confgui::ConfSubPanelWPNejvtaí velikost textového souboru (KB)Max. text file size (MB)confgui::ConfSubPanelWNVelikost stránky textového souboru (KB)Text file page size (KB)confgui::ConfSubPanelW"Tato hodnota nastavuje práh, za kterým nebudou zabalené soubory zpracovávány. Nastavte na -1 pro ~ádné omezení, na 0 pro vobec ~ádné rozbalování.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelW^Tato hodnota nastavuje práh, za kterým nebudou textové soubory zpracovávány. Nastavte na -1 pro ~ádné omezení. Je to kvoli vylou ení obYích souboro se zápisem z rejstYíkování.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelWJazyk aspelluAspell languageconfgui::ConfTopPanelW2Název adresáYe s databázíDatabase directory nameconfgui::ConfTopPanelW6Zaká~e pou~ívání aspellu pro vytvoYení pYibli~né podoby pravopisu v nástroji prozkumníka výrazo.<br> U~ite né, pokud aspell není pYítomen anebo nepracuje. †Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelW\Interval v megabytech pro spláchnutí rejstYíkuIndex flush megabytes intervalconfgui::ConfTopPanelW6Název pro soubor se zápisem Log file nameconfgui::ConfTopPanelW2ÚroveH podrobnosti zápisuLog verbosity levelconfgui::ConfTopPanelW8Nejvtaí vyu~ívání disku (%)Max disk occupation (%)confgui::ConfTopPanelW"Nepou~ívat aspellNo aspell usageconfgui::ConfTopPanelW PYesko ené cesty Skipped pathsconfgui::ConfTopPanelW6Jazyky rozaíYení kmeno slovStemming languagesconfgui::ConfTopPanelW´Soubor, do kterého se zapíae výstupní zpráva.<br>Pro výstupy na terminál pou~ijte 'stderr'PThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelW„Jazyk pro adresáY aspellu. Mlo by to vypadat jako 'en' nebo 'fr' nebo 'cs'...<br>Pokud není tato hodnota nastavena, pou~ije se pro její vypo ítání prostYedí NLS, co~ obvykle pracuje. Pro získání pYedstavy o tom, co je ve vaaem systému nainstalováno, napiate 'aspell config' a hledejte soubory .dat v adresáYi 'data-dir'. 2The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW~Jazyky, pro které se vytvoYí <br>adresáYe rozaíYení kmeno slov.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW²Seznam adresáYo, ve kterých za íná rejstYíkování v etn podslo~ek. Výchozí: adresáY Home.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWNázev pro adresáY, v nm~ se má ukládat rejstYík.<br>Neabsolutní cesta je vzata relativn k adresáYi s nastavením. Výchozí je 'xapiandb'.–The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelW’Názvy adresáYo, které se nebudou rejstYíkovat.<br>Mo~e obsahovat zástupné symboly (~olíky). Musí odpovídat cestám, které rejstYíkova vidí (napY. pokud v pa áte ních adresáYích stojí '/home/me' a '/home' je ve skute nosti odkazem na '/usr/home', potom by byl správným zápisem skippedPath '/home/me/tmp*' a ne '/usr/home/me/tmp*')#These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelWtJde o procentní podíl vyu~ívání disku, kdy rejstYíkování sel~e a zastaví se (kvoli vyhnutí se zaplnní vaaeho disku).<br>0 znamená ~ádné omezení (tato hodnota je nastavena jako výchozí).—This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).
0 means no limit (this is the default).confgui::ConfTopPanelW4Tato hodnota upravuje mno~ství dat, která jsou rejstYíkována mezi spláchnutími na disk.<br>Pomáhá to Yídit pou~ití pamti rejstYíkova e. Výchozí je 10 MB ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWÌTato hodnota upravuje mno~ství zpráv,<br>od pouze chyb a~ po velké mno~ství dat zajímavých pro ladní.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW$Po áte ní adresáYeTop directoriesconfgui::ConfTopPanelW(Pou~ít pYíkaz 'file'Use system's 'file' commandconfgui::ConfTopPanelW‚Pou~ít pYíkaz 'file', kdy~ vnitYní<br>rozpoznání mime typu sel~e.NUse the system's 'file' command if internal
mime type identification fails.confgui::ConfTopPanelWZ&ruait&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase\Hledání [Je~ía Kristus] se zmní na [Je~ía OR Kristus OR (Je~ía PHRASE 2 Kristus)]. Tímto by mly být silnji zvá~eny výsledky, které obsahují pYesné shody s hledaným slovem.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBase2Oddlova kousku pYehleduAbstract snippet separatoruiPrefsDialogBaseZapnout vae Activate AlluiPrefsDialogBasePYidat rejstYík Add indexuiPrefsDialogBasePou~ít zmny Apply changesuiPrefsDialogBaseÚAutomaticky spustit jednoduché hledání, kdy~ je do zadávacího pole pro hledání zadáno prázdné místo (mezera).-Auto-start simple search on whitespace entry.uiPrefsDialogBase^Automatické pYidání vt do jednoduchého hledání+Automatically add phrase to simple searchesuiPrefsDialogBase’ etnost výskytu výrazu (procento) pro automatické tvoYení slovních obrato.Autophrase term frequency threshold percentageuiPrefsDialogBase VybratChooseuiPrefsDialogBase.Vybrat programy editoroChoose editor applicationsuiPrefsDialogBase|Klepnout pro pYidání dalaího rejstYíkového adresáYe do seznamu0Click to add another index directory to the listuiPrefsDialogBase2Formát data (strftime(3))Date format (strftime(3))uiPrefsDialogBaseVypnout vaeDeactivate AlluiPrefsDialogBaseZahodit zmnyDiscard changesuiPrefsDialogBaseÔZobrazit skupinový filtr jako nástrojový pruh místo tla ítkového panelu (potYebuje spustit program znovu).KDisplay category filter as toolbar instead of button panel (needs restart).uiPrefsDialogBase²Stanovení, zda se má vytvoYit pYehled i tehdy, kdy~ dokument ji~ njaký pYehled obsahuje.EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseöStanovení, zda se má vytvoYit pYehled pro výsledky v souvislosti s parametrem hledání. U velkých dokumento mo~e být pomalé.zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBase6VytváYet pYehledy dynamickyDynamically build abstractsuiPrefsDialogBaseRUpravit záhlaví html na stran s výsledky#Edit result page html header insertuiPrefsDialogBaseHUpravit Yetzec formátu pro výsledky#Edit result paragraph format stringuiPrefsDialogBasePovolitEnableuiPrefsDialogBase Vnjaí rejstYíkyExternal IndexesuiPrefsDialogBase>Práh  etnosti (procento), od kterého se výrazy nepou~ívají. Slovní obraty obsahující pYília  etné výrazy zposobují výkonnostní potí~e. PYesko ené výrazy zvtaují vzdálenost slovního obratu a zmenaují ú innost funkce automatického hledání slovního obratu. Výchozí hodnota je 2 (procenta).þFrequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). uiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBase0Skrýt zdvojené výsledky.Hide duplicate results.uiPrefsDialogBase<Zvýraznit barvu výrazo hledáníHighlight color for query termsuiPrefsDialogBase°Je-li zaakrtnuto, budou výsledky se stejným obsahem pod jinými názvy ukázány jen jednou.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBaseŽXádky v textu PRE nejsou slo~eny. Pou~ití BR povede ke ztrát odsazení.BLines in PRE text are not folded. Using BR loses some indentation.uiPrefsDialogBasetNejvtaí velikost textu zvýraznného pro náhled (megabyty)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBase0Po et výsledko na stranu"Number of entries in a result pageuiPrefsDialogBase\OtevYe dialog pro výbr písma seznamu výsledko-Opens a dialog to select the result list fontuiPrefsDialogBasedOtevYe dialog pro výbr souboru se stylovým listem-Opens a dialog to select the style sheet fileuiPrefsDialogBasefUpYednostHovat pro náhled HTML pYed prostým textem.&Prefer Html to plain text for preview.uiPrefsDialogBasedKouzelné pYípony souborového názvu jazyka hledání.(Query language magic file name suffixes.uiPrefsDialogBaseHZapamatovat si stav zapnutí hledání.Remember sort activation state.uiPrefsDialogBase~Odstranit ze seznamu. Nemá to ~ádný ú inek na ulo~ený rejstYík.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase"Odstranit vybranéRemove selecteduiPrefsDialogBase>Nahradit pYehledy v dokumentech Replace abstracts from documentsuiPrefsDialogBaseNastavit znovuResetuiPrefsDialogBasexNastaví písmo pro seznam s výsledky znovu na výchozí hodnotu1Resets the result list font to the system defaultuiPrefsDialogBaseJNastaví stylový list znovu na výchozí!Resets the style sheet to defaultuiPrefsDialogBase"Seznam s výsledky Result ListuiPrefsDialogBase6Písmo pro seznam s výsledkyResult list fontuiPrefsDialogBase"Parametry hledáníSearch parametersuiPrefsDialogBasezPo spuatní automaticky otevYít dialog pro rozaíYené hledání.'Start with advanced search dialog open.uiPrefsDialogBase"Jazyk kmene slovaStemming languageuiPrefsDialogBaseStylový list Style sheetuiPrefsDialogBaseFPo et souvisejících slov v pYehledu Synthetic abstract context wordsuiPrefsDialogBaseDDélka vytvoYeného pYehledu (znaky)$Synthetic abstract size (characters)uiPrefsDialogBaseŽTexty nad tuto velikost nebudou v náhledu zvýrazHovány (pYília pomalé).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase¨Slova v seznamu budou v záznamu jazyka hledání automaticky obrácena na vty ext:xxx.bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase PYepnout vybranéToggle selecteduiPrefsDialogBaseÀPou~ít zna ky <PRE> namísto <BR> pro zobrazení prostého textu formátovaného v náhledu jako HTML.GUse

 tags instead of 
to display plain text as html in preview.uiPrefsDialogBase‚Pou~ít nastavení pracovní plochy pro výbr editoru pro dokumenty.2Use desktop preferences to choose document editor.uiPrefsDialogBase(U~ivatelské rozhraníUser interfaceuiPrefsDialogBase*U~ivatelská nastaveníUser preferencesuiPrefsDialogBaseˆÿrecoll-1.17.3/qtgui/i18n/recoll_de.qm000644 001750 000000 00000064440 11757435371 017710 0ustar00dockeswheel000000 000000 <¸dÊÍ!¿`¡½ÝB°+A5-Ab+;M²¨¥'ALô)ݬ9¶Eî]Ú$—-í*Ð%ð*ì0!+Lô Ë1ø þG…ÔZþGß"…H6ó6{H6õ6¨J+‚ MJ+‚1QJ6•kJ6•>‘WÈÕFXÉÄ\e® ¿sºñ“sºñ˜v8“´v®Âþv®ÂÅzϳ®€€£SœÍ=GÐùƒ Ðùƒ:Ðùƒ=´Eµ'&`ŽLZ0,…AÌ>.c¢‘vãQ#•ñ“SœW­?£cêžÞñƒÁó LŒþSI/ß çp#‹våuw 5'ow 5/¨w 53ꀢ#.G©Ö³9åª6•5û»f3 µͼuXê•Ê0Žì;UNúU õúeî ¶ ¬a—&ÁVì?úd%l?úd*?JUYJUY),Y ô8iº™_¬ÝôLSNã¿7"þA¢&FLƒ>Ë€ã‡Å˜I¼ ™n•MštµÊ«!§«1„Ú#WuãX|A -ZlzÏ7•-¼&˜)ÖT\8BìS5r?)'àrž+‹¦,%:‹Üð8ÊŒÇ< ˜3s¦AS UªÃ¢ñ·¨ -¥»œR6ÕÇ¢•(šÇ¢•+Ç¢•,LØ~CÿðŒµ^³`³$Ú" 3¥UKô]p hPÔ—B zšKD"¦ %E¦öõe¶7*zÊXÔAþJ9CR•FW#4'F¯NUBŒÍw'ªŒÍw*ÚŒÍw, n($“’žQ€²ð (í²ð +e²ð ,ªɆt`P áù:§QçÇ}}²”ò“_ œ .\¨0ÎE.Ä32Ìí³ þͳ* ÝÜK†äœc¡ú Ãaï ´H7 9Zy2Ú K¨ó$7 ®œ¯Sù ü>Yt ÜcŒ ).~R +<”Bé 6 Ý `Pè `ç£ c·E#+ y ’ ˜IœMq ²ëC)x ²ëC+¥ ²ëC,ô âæç"º åKÄKæ ®!Ù ®ù". TH½ ŽÚ 9 h¹° { tÓ9Fg ¨Î£#k »ïµ4 Û·å$• 'И!= 97Ãt PÖ™â RVŽ¥ T# VüB \iC[] `F¥¤ ©zó Ú÷9c ÝøìP† ö†À63 zs- 8þMá FÁž y·<| ‚±3Ö ‡u0N ‰P° ‰PÚ 5dX™ ’ãn>G ÕH û£9€WÉ/¸.=½G7Ò J›^XPÎ`¥bÙ‰pún zc-d‚3..ˆ‚3.1¶“Ýè;¥›P¾ F¦Àè&þË“Br;@ŸQá~ZY~s c[žs%÷g3#ô ‚´Yµ“Ã0çÂ|“]‰âî£%±ó lòü©ÜÛü¶LibOAlle Ausdrücke All clauses AdvSearch&Einen der Ausdrücke Any clause AdvSearch Medienmedia AdvSearchNachrichtenmessages AdvSearch andereother AdvSearchPräsentationen presentations AdvSearchTabellen spreadsheets AdvSearch Textetexts AdvSearch<----- Alle <----- All AdvSearchBase<----- Auswahl <----- Sel AdvSearchBase,Neuen Ausdruck zufügen Add clause AdvSearchBase Erweiterte SucheAdvanced search AdvSearchBaseAlle ----> All ----> AdvSearchBaseDurchsuchenBrowse AdvSearchBasePer Kategorien By categories AdvSearchBasehAuswählen, um Filterung auf Dateitypen zu aktivieren,Check this to enable filtering on file types AdvSearchBase‚Auswählen, um Dateikategorien anstatt der Mime-Typen zu verwenden;Check this to use file categories instead of raw mime types AdvSearchBaseSchließenClose AdvSearchBase0letzten Ausdruck löschen Delete clause AdvSearchBase^Geben Sie das Basisverzeichnis für die Suche anEnter top directory for search AdvSearchBase*Ignorierte DateitypenIgnored file types AdvSearchBase8Einschränkung der DateitypenRestrict file types AdvSearchBaseŽEinschränkung der Ergebnisse auf Dateien in folgendem Unterverzeichnis:%Restrict results to files in subtree: AdvSearchBase,Als Standard speichernSave as default AdvSearchBasenSuche nach Dokumenten, die folgende Kriterien erfüllen:'Search for
documents
satisfying: AdvSearchBase,Durchsuchte DateitypenSearched file types AdvSearchBaseAuswahl -----> Sel -----> AdvSearchBaseSuche starten Start Search AdvSearchBaseLKein Datenbankverzeichnis konfiguriert No db directory in configurationMain&Nächstes&NextPreview&Vorheriges &PreviousPreview&Suche nache: &Search for:PreviewRFehler bei der Indizierung des Dokuments 0Can't turn doc into internal representation for PreviewAbbrechenCancelPreview LeerenClearPreview Reiter schließen Close TabPreview(Erzeuge VorschautextCreating preview textPreview>Lade Vorschautext in den Editor Loading preview text into editorPreview<Groß/Kleinschreibung &beachten Match &CasePreview0Fehlendes Hilfsprogramm:Missing helper program: Preview(Standard ZeichensatzDefault character setQObject0Folge symbolischen LinksFollow symbolic linksQObjectÐFolge symbolischen Links währen der Indizierung. Standard ist nein, um doppelte Indizierung zu vermeidenTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject"Globale ParameterGlobal parametersQObject2Indiziere alle DateinamenIndex all file namesQObject$Indiziere alle Namen der Dateien, deren Inhalt nicht bestimmt oder bearbeitet werden kann (keiner oder nicht unterstützter mime Typ). Standard: ja}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject Lokale ParameterLocal parametersQObject&Übersprungene Namen Skipped namesQObjectfDer Zeichensatz der für Dateien benutzt wird, die ihren Zeichensatz nicht intern definieren, z.B. Textdateien.<br>Standardwert ist leer und der Wert der NLS Umgebung wird benutzt.ÒThis is the character set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObjectWarnungWarningRTIToolW(alle Sprachen)(all languages)RclMain8(keine Wortstammerweiterung) (no stemming)RclMainüber Recoll About RecollRclMainœFehlerhaftes Betrachterkommando für %1: [%2] Überprüfen Sie die Datei mimeconfCBad viewer command line for %1: [%2] Please check the mimeconf fileRclMainRFehler beim Erzeugen des VorschaufenstersCan't create preview windowRclMainšFehler beim Extrahieren des Dokuments oder beim Erzeugen der temporären datei0Cannot extract document or create temporary fileRclMainbKeine Informationen zum Dokument in der Datenbank+Cannot retrieve document info from databaseRclMainSchließenClosingRclMain DokumenthistorieDocument historyRclMainAusführen: [ Executing: [RclMain"Historische Daten History dataRclMain,Indizierung in Arbeit:Indexing in progress: RclMainsäubernPurgeRclMainSuchdetails Query detailsRclMainErgebnisse Query resultsRclMainWortstämmeStemdbRclMain@Diese Suche ist nicht mehr aktiv"This search is not active any moreRclMainUnbekanntUnknownRclMainWarnungWarningRclMainNFehler beim Holen der Wortstammsprachen#error retrieving stemming languagesRclMain MedienmediaRclMain andereotherRclMain&über Recoll &About Recoll RclMainBase"&Erweiterte Suche&Advanced Search RclMainBase0&Lösche Dokumenthistorie&Erase document history RclMainBase &Datei&File RclMainBase &Hilfe&Help RclMainBase4&Indizierungskonfiguration&Indexing configuration RclMainBase"&Voreinstellungen &Preferences RclMainBase$&Suchkonfiguration&Query configuration RclMainBase"&Sortierparameter&Sort parameters RclMainBase&Werkzeuge&Tools RclMainBase"&Benutzerhandbuch &User manual RclMainBase2Erweiterte/komplexe SucheAdvanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBase$DokumentenhistorieDocument History RclMainBase&&DokumentenhistorieDocument &History RclMainBase&BeendenE&xit RclMainBase<Dialog für externe IndizierungExternal index dialog RclMainBaseErste Seite First page RclMainBaseNGehe zu der ersten Seite der ErgebnisseGo to first page of results RclMainBasenächste Seite Next page RclMainBase*nächste ErgebnisseiteNext page of results RclMainBasevorige Seite Previous page RclMainBase(vorige ErgebnisseitePrevious page of results RclMainBase RecollRecoll RclMainBaseErgebnisliste Result list RclMainBaseSuchwerkzeuge Search tools RclMainBase SortierparameterSort parameters RclMainBase$&Ausdruck ExplorerTerm &explorer RclMainBase4Ausdruck Explorer WerkzeugTerm explorer tool RclMainBase&Indizieren Update &index RclMainBase DatumDate RecollModelDateiname File name RecollModel&Vorschau&PreviewResList(Suche zeigen) (show query)ResList<<p><b>keine Ergebnisse</b><br>

No results found
ResList(&Dateinamen kopierenCopy &File NameResList&Url kopieren Copy &URLResList DokumenthistorieDocument historyResList2&Gleiche Dokumente findenFind &similar documentsResListNächstesNextResListVorigesPreviousResListErgebnisse Result listResList0Dokument nicht verfügbarUnavailable documentResList&Vorschau&PreviewResTable(&Dateinamen kopierenCopy &File NameResTable&Url kopieren Copy &URLResTable2&Gleiche Dokumente findenFind &similar documentsResTable&Vorschau&PreviewResTableDetailArea(&Dateinamen kopierenCopy &File NameResTableDetailArea&Url kopieren Copy &URLResTableDetailArea2&Gleiche Dokumente findenFind &similar documentsResTableDetailAreaAlle Ausdrücke All termsSSearch$Irgendein AusdruckAny termSSearch.Fehlerhafter SuchstringBad query stringSSearchErweiterungen CompletionsSSearch¾Suchausdruck hier eingeben. Drücken Sie ESC SPC für Vervollständigungen des aktuellen AusdrucksFEnter search terms here. Type ESC SPC for completions of current term.SSearchDateiname File nameSSearchFKein freier Speicher mehr verfügbar Out of memorySSearchSuchspracheQuery languageSSearch.Wählen Sie ein Element:Select an item:SSearch:Zu viele Vervollständigungen:Too many completionsSSearchLöschenClear SSearchBase Ctrl+SCtrl+S SSearchBase¾Suchausdruck hier eingeben. Drücken Sie ESC SPC für Vervollständigungen des aktuellen AusdrucksFEnter search terms here. Type ESC SPC for completions of current term. SSearchBase&Sucheintrag löschenErase search entry SSearchBaseSSearchBase SSearchBase SSearchBase SuchenSearch SSearchBaseSuche starten Start query SSearchBaseDateiname File name SearchClauseWˆAnzahl der Wörter, die sich zwischen den angegebenen befinden dürfenHNumber of additional words that may be interspersed with the chosen ones SearchClauseW‚Wählen Sie die Suchart aus, mit der nach den Wörtern gesucht wird>Select the type of query that will be performed with the words SearchClauseW&Schließen&Close SpellBase"&Vervollständigen&Expand  SpellBase Alt+SAlt+C SpellBase Alt+VAlt+E SpellBase"Ausdruck Explorer Term Explorer SpellBase@Aspell Vervollständigungsfehler.Aspell expansion error. SpellWFehler bei der Initialisierung von Aspell. Ist Aspell nicht installiert?)Aspell init failed. Aspell not installed?SpellW4Keine Erweiterung gefundenNo expansion foundSpellW$Regulärer AusdruckRegexpSpellW(Ortographie/PhonetikSpelling/PhoneticSpellW*Wortstamm ErweiterungStem expansionSpellWAusdruckTermSpellWWildcards WildcardsSpellWNFehler beim Holen der Wortstammsprachen#error retrieving stemming languagesSpellWœWählen Sie das Xapian Indexverzeichnis (Z.B.: /home/benutzer/.recoll/xapiandb)@Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) UIPrefsDialogzDas ausgewählte Verzeichnis scheint kein Xapian Index zu sein;The selected directory does not appear to be a Xapian index UIPrefsDialogvDas ausgewählte Verzeichnis ist bereits Teil der Indexliste3The selected directory is already in the index list UIPrefsDialog.Das ist der Hauptindex!This is the main/local index! UIPrefsDialogNFehler beim Holen der Wortstammsprachen#error retrieving stemming languages UIPrefsDialogÄndere Aktion Change ActionViewActionBaseSchließenCloseViewActionBase AnzeigeprogrammeNative ViewersViewActionBaseþWählen Sie einen oder mehrere Dateitypen und klicken Sie auf "Ändere Aktion" um das verknüpfte Programm zum Öffnen anzupassen. bSelect one or several file types, then click Change Action to modify the program used to open themViewActionBasePKann Konfigurationsdatei nicht schreibenCan't write configuration fileconfgui::ConfIndexW++confgui::ConfParamSLW--confgui::ConfParamSLW GlobalGlobalconfgui::ConfSubPanelWLog Datei Log file nameconfgui::ConfTopPanelW$Ausgelassene Pfade Skipped pathsconfgui::ConfTopPanelW:WortstammerweiterungssprachenStemming languagesconfgui::ConfTopPanelW¾Die Datei in die Ausgaben geschrieben werden.<br>Für Ausgaben auf demTerminal 'stderr' benutzenPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelW˜Die Sprachen für die Worstammerweiterungs-<br>verzeichnisse erstellt werden.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelWÂDie Liste der Verzeichnisse in der die rekursive Indizierung startet. Standard: Home-Verzeichnis.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelW„Die Namen der Verzeichnisse, die nicht indiziert werden.<br>Kann Wildcards enthalten. Muss den Pfaden entsprechen, die der Indexer sieht (z.B. wenn '/home/me' in den topdirs steht und '/home' eigentlich ein link zu '/usr/home' ist, dann wäre ein korrekter skippedPath Eintrag '/home/me/tmp*' und nicht '/usr/home/me/tmp*')#These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelWÈDieser Wert stellt den Umfang der Ausgaben ein.<br>Nur Fehler bis zu einer Menge von Debug Ausgaben.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW&Start-VerzeichnisseTop directoriesconfgui::ConfTopPanelW.'file' Komando benutzenUse system's 'file' commandconfgui::ConfTopPanelWžBenutze das 'file' Kommando wenn die interne<br>mime Typ Erkennung fehlschlägt.NUse the system's 'file' command if internal
mime type identification fails.confgui::ConfTopPanelW&Abbrechen&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase®Eine Suche nach [Jürgen Klinsmann] wird geändert nach [Jürgen OR Klinsmann OR (Jürgen PHRASE 2 Klinsmann)]. Dadurch sollten Ergebnisse, die exakte Übereinstimmungen der Suchworte enthalten, stärker gewichtet werden.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBaseAlle Auswählen Activate AlluiPrefsDialogBase Index hinzufügen Add indexuiPrefsDialogBase*Änderungen übernehmen Apply changesuiPrefsDialogBaseÂAutomatisch eine einfache Suche starten, wenn ein Worttrenner im Sucheingabefeld eingegeben wird.-Auto-start simple search on whitespace entry.uiPrefsDialogBasehAutomatisches Zufügen von Sätzen zu einfachen Suchen+Automatically add phrase to simple searchesuiPrefsDialogBaseAlle AbwählenDeactivate AlluiPrefsDialogBase(Änderungen verwerfenDiscard changesuiPrefsDialogBaseÞFestlegung ob eine Zusammenfassung auch dann erzeugt wird, wenn das Dokument schon eine Zusammenfassung enthältEDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBase Festlegung ob Zusammenfassungen für Ergebnisse im Kontext der Suchparameter erzeugt werden (kann bei großen Dokumenten langsam sein).zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBaseHZusammenfassungen dynamisch erzeugenDynamically build abstractsuiPrefsDialogBaseexterne IndizesExternal IndexesuiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBase>Anzahl der Ergebnisse pro Seite"Number of entries in a result pageuiPrefsDialogBaseˆÖffnet einen Dialog zur Auswahl der Schriftart für die Ergebnisliste-Opens a dialog to select the result list fontuiPrefsDialogBaseLSpeichern, ob Sortieren aktiviert ist.Remember sort activation state.uiPrefsDialogBaseœAus der Liste entfernen. Dies hat keinen Einfluss auf den gespeicherten Index.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase*Ausgewählte entfernenRemove selecteduiPrefsDialogBase`Ersetzen der Zusammenfassungen in den Dokumenten Replace abstracts from documentsuiPrefsDialogBase ResetResetuiPrefsDialogBaseŒSetzt die Schriftart für die Ergebnisliste zurück auf den Standardwert1Resets the result list font to the system defaultuiPrefsDialogBase8Schriftart für ErgebnislisteResult list fontuiPrefsDialogBaseSuchparameterSearch parametersuiPrefsDialogBaseŒNach dem Start automatisch den Dialog für die erweiterte Suche öffnen.'Start with advanced search dialog open.uiPrefsDialogBase Stemming SpracheStemming languageuiPrefsDialogBase\Anzahl der Kontextworte in der Zusammenfassung Synthetic abstract context wordsuiPrefsDialogBaseZLänge der erzeugten Zusammenfassung (Zeichen)$Synthetic abstract size (characters)uiPrefsDialogBase Auswahl umkehrenToggle selecteduiPrefsDialogBasešDie Einstellung des Dokumenteneditors erfolgt in den Desktopvoreinstellungen.2Use desktop preferences to choose document editor.uiPrefsDialogBase$BenutzeroberflächeUser interfaceuiPrefsDialogBase*BenutzereinstellungenUser preferencesuiPrefsDialogBaseˆrecoll-1.17.3/qtgui/i18n/recoll_es.qm000644 001750 000000 00000252464 11757435371 017734 0ustar00dockeswheel000000 000000 <¸dÊÍ!¿`¡½ÝB+õn-õ›¯+;‹H,аH,«!H,ÚHYÚ®IA­`Zlº`mbÀë¦yi¨¥¶t¶E’~ÐD ÁÙ] óLô¾ÚVE›$VEÛvf¾¿ lÀ¯ˆ¬âª¬ô¤¹Eî>õ$Â—Ê 'HäÁ*Ð%¦j*ì0¦ï+Lôd0+f¾º‰+f¾Á¤+f¾Æ\1ø²:Îd£GG…Ô:åG߬>H6óÞaH6õÞŽJ+‚f]J+‚×äJ6• ÝJ6•èðL™b’ïPh¨¸rT°5¹ WTißWÈÕ›RXÉÄ;Ð[ %º/e®fÍgwîʱsºñCsºñ£{v8“!v®Â¨v®Â£Ùzϳf€€£&”„j†GŒ!þ.0œÍæiªJ q®½Þ*ß¶Êð…øº° 'ÃÞÈÐùƒ¢¸Ðùƒã Ðùƒæðã3µiãný–ÕàEµ¡G&`Ž#0,…>.cr-Do2—õXM¹4ªX®©5;`Þ^¼Žh0ñGlÿtÛ4nÚkÛwñ…¸åwñ…èj„3à‘vã!¬•ñ“qÚœW­éž€Þ•+¢‰üj£cêzÎxCl;Þñƒt¨ó LŠhþSIÖ9ÿµl çr§#¸Îžp#Çvå›sv奷w 5·Úw 5Õòw 5Úçwî¸%€¢#ÊnŒUŸ.ˆÓ£¹ÞñЩֳâת6•Ý÷¯†”‡å»f3ª%ËÂî”Õͼu5Ðgž¤ÔÂõg8Ø.^êòê•ÊÖÐì;UŽï¡©6ºúUh—úeîr ¬FU!D= ‹N&ë&Á*ù.‡NuA7ÎÇ=úd=¹?úd°¥?údÀ@G$ß…'JUY’$JUY½ÜY ôák[–uj‰_nàŠs¾~D@z Óç…º™@ðu-|–Ê·c¯¡3¨ïÊ—¥£¨ÎÅå7Ôä^1NÝôL&@ã¿ßmìxëùJg,5þA¢´>B `<.„çÞ׃õ²}ëd³,;[¾Þ»<ÄöÂìLƒé$e 2™ÈvhÕóã€ã‡Œ_…(PŒèŒ¯b¶D’"3’ZÓ%˜I¼e ™n•“štµŠ×Ÿf•㛟f•õ2Ÿf•$C««L«Ø¯ƒW7¯ƒWaýÄy%4*Äy%,è΄՟2Ð: óÚ#-&ãX|ø~åõW3Ì” ‹ -ZhzÏßÚ-¼´š)ÖT< B9€úBìSÝk¶Þ¯Xoˆ•ܬr?)»ÈržŠ'|ôò›„kå»x„kåÃ7„kåÇl‹¦,°s‹ÜðáÆŒÇ<ªe›ˆ˜Ú¦AS ªÃ¢ž´·¨ ÉÚ»œRß¿gu§Ç¢•½DÇ¢•ÄQÇ¢•ÇÇ×I^­ÏØ~CýèêÈ’¨éã>` ðŒµ?ª`³°" Ú6:ªïÎUKô>p h!cu9Mv2ãi5–T#kF—BfŒšK ;¦ %O¦öõ¨«‡¢C¶7ÀÄÖ[™ùÊXÔënD‡Dðw)ÜÞþÄC"Ä#+ä@7I^¦ŸFW#ÛªF¯N)H:"º¶H:"ÁÒH:"Æ”_guJ`ŒÍw»:ŒÍwÂWŒÍwÇ#ŒÏ—¿6n¼“’ž!ý¦š´¤B²ð ½¡²ð į²ð È/´ù€ N¾l¯vÓt¤tÈàˆ‘ɆtCééŽ#±œ3b‹ áùãÏ:uî7åQçÇpªozõÈ}}pG€;EÅóŽÄ^3¼”ò“@Rœ .wâ¨0ÎWÄÙ¿Ìí³deͳÀ ×°‹òÝÜ-äœc #ä´¥ˆ>æí:Ðö¨åú ÃF¯ ´H¥2 9ZyÙY ;´3˜Z K¨ó®è ]#—š¢ cÄIíº k¨µk‘ lMˆbF ‰ŒîBw ŸÁò¿q ŸÁòÅW ŸÁòÈë «ƒÔ¶ ­îÿ¬ ®œ¯(0 ²9û: ü>9e äîl­ íåõ#w *Ni} Üc  ).~§ *R5Š +<”% 6  G.~Iñ `P˜û `ç£ c·E­‰ d8è6 yh, ˜IœL ¤žø» ±TúËY ²ëC¾o ²ëCÄë ²ëCÈu Áùš“\ Äã¾6 âæç¬é åKÄ‘ æõç¬o ®«~ ®ù«Ý Ô… à ye3í THc ŽÚd˜ =!NÝ CK€eÒ Kj×¹Ë T|c©R h¹°dØ tÓ9Í éûÓ £Ü jø ¨Î£® »ïµŽÐ Öüõ² ۷寶 ÛÓ${ Vd˜° 'Иªµ /¥™[ 97à 9É›Ä L*– PÖ™‰Ò RVŽ¡½ T#tø Vü^ \iC;> ]æùð­ `F¥  hôîÁ[ v—¥žq {l8 €!Yž ‘–²‘¬ ©zór ¬æà‡ Ër$ý ÓÍ Ã Ú÷â[ Ýøì! é—~2f ö†ÀÞ) zsÕ m£¸¡ 'RçJ¾ -èô¹W 8þº FÁ”‰ OE°Ix m†C1É uò0±R y·å¢ y¹~÷ ‚±3³ …È©%Å ‡uÖ~ ‰P‰˜ ‰P¢ 5d6% ’ãnè¤ ¤š„šÖ ¬Š©3L ½ý7]þ ÕH ] û£â  q©¥û€1%Ýnzd/¸.¶16“µº<ÞA7KQá~:Y~s©¿[žs³Û\Н4`g3®Ÿpû~^IÕ Õ! “ ‚´oЭcµ“Ã×!»m€ÃÜ¿­c oÂ|“>’ÎÁ'žââöó l¤ãü©Ü•ü¶LÙiG&Todas las cláusulas All clauses AdvSearch$Cualquier cláusula Any clause AdvSearchfSufijo multiplicador incorrecto en filtro de tamaño$Bad multiplier suffix in size filter AdvSearch mediosmedia AdvSearchmensajesmessages AdvSearch otrosother AdvSearchpresentaciones presentations AdvSearch hojas de cálculo spreadsheets AdvSearch textostexts AdvSearch<----- Todos <----- All AdvSearchBase<----- Sel <----- Sel AdvSearchBaseAñadir cláusula Add clause AdvSearchBase"Búsqueda avanzadaAdvanced search AdvSearchBaseTodos ----> All ----> AdvSearchBasejTodos los campos no vacíos a la derecha serán combinados con conjunciones AND (opción "Todas las cláusulas") o OR (opción "Cualquier cláusula").<br>Los campos "Cualquiera", "Todas" y "Ninguna" pueden aceptar una mezcla de palabras simples y frases dentro de comillas dobles.<br>Campos sin datos son ignorados.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBase BuscarBrowse AdvSearchBasePor categorías By categories AdvSearchBaseXMarque esto para habilitar filtros en fechas'Check this to enable filtering on dates AdvSearchBasenMarque esto para habilitar filtros en tipos de archivos,Check this to enable filtering on file types AdvSearchBaseZMarque esto para habilitar filtros en tamaños'Check this to enable filtering on sizes AdvSearchBasenMarque esto para usar categorías en lugar de tipos MIME;Check this to use file categories instead of raw mime types AdvSearchBase CerrarClose AdvSearchBaseBorrar cláusula Delete clause AdvSearchBaseVIngrese directorio inicial para la búsquedaEnter top directory for search AdvSearchBase FiltroFilter AdvSearchBaseFiltrar fechas Filter dates AdvSearchBase"Filtro de tamaños Filter sizes AdvSearchBase BuscarFind AdvSearchBase DesdeFrom AdvSearchBase4Tipos de fichero ignoradosIgnored file types AdvSearchBaseInvertirInvert AdvSearchBaseTamaño máximo Max. Size AdvSearchBase‚Tamaño máximo. Puede utilizar k/K, m/M o g/G como multiplicadores4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBaseTamaño Mínimo Min. Size AdvSearchBase‚Tamaño mínimo. Puede utilizar k/K, m/M o g/G como multiplicadores4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase6Restringir tipos de ficheroRestrict file types AdvSearchBasedRestringir resultados a ficheros en subdirectorio:%Restrict results to files in subtree: AdvSearchBase6Guardar como predeterminadoSave as default AdvSearchBaseHBuscar documentos<br>que satisfagan:'Search for
documents
satisfying: AdvSearchBase2Tipos de fichero buscadosSearched file types AdvSearchBaseSel -----> Sel -----> AdvSearchBase Iniciar búsqueda Start Search AdvSearchBase HastaTo AdvSearchBaseÎ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> horario de indexado por lotes (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cada campo puede contener un comodín (*), un valor numérico único, listas separadas por comas (1,3,5) y rangos (1-7). Más generalmente, los campos serán usados <span style=" font-style:italic;">tal como son</span> dentro del fichero crontab, y toda la sintaxis crontab puede ser usada, ver crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Por ejemplo, ingresar <span style=" font-family:'Courier New,courier';">*</span> en <span style=" font-style:italic;">Días, </span><span style=" font-family:'Courier New,courier';">12,19</span> en <span style=" font-style:italic;">Horas</span> y <span style=" font-family:'Courier New,courier';">15</span> en <span style=" font-style:italic;">Minutos</span> iniciaría recollindex cada día a las 12:15 AM y 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un horario con activaciones frecuentes es probablemente menos eficiente que el indexado en tiempo real.</p></body></html>Å

Recoll batch indexing schedule (cron)

Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used as is inside the crontab file, and the full crontab syntax can be used, see crontab(5).


For example, entering * in Days, 12,19 in Hours and 15 in Minutes would start recollindex every day at 12:15 AM and 7:15 PM

A schedule with very frequent activations is probably less efficient than real time indexing.

 CronToolWn<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presione <span style=" font-style:italic;">Deshabilitar</span> para detener el indexado por lotes automático, <span style=" font-style:italic;">Habilitar</span> para activarlo, <span style=" font-style:italic;">Cancelar</span> para no cambiar nada.</p></body></html>š

Click Disable to stop automatic batch indexing, Enable to activate it, Cancel to change nothing.

 CronToolWVentana de Cron Cron Dialog CronToolWZDías de la semana (* o 0-7, 0 o 7 es Domingo))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolWDeshabilitarDisable CronToolWHabilitarEnable CronToolWŠError al instalar entrada de cron. Sintaxis incorrecta en los campos?3Error installing cron entry. Bad syntax in fields ? CronToolW Horas (* o 0-23)Hours (* or 0-23) CronToolWÂParece ser que existen entradas para recollindex editadas manualmente, no se puede editar crontabPIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolWMinutos (0-59)Minutes (0-59) CronToolW$Ventana de diálogoDialog EditDialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Parece ser que el índice para esta configuración no existe.</span><br /><br />Si solamente desea indexar su directorio personal con un conjunto de valores iniciales razonables, presione el botón <span style=" font-style:italic;">Iniciar indexación ahora</span>. Es posible ajustar los detalles más tarde.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si necesita más control, use los enlaces siguientes para ajustar la configuración de indexación y el horario.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Estas herramientas pueden ser accedidas luego desde el menú <span style=" font-style:italic;">Preferencias</span>.</p></body></html>ê

It appears that the index for this configuration does not exist.

If you just want to index your home directory with a set of reasonable defaults, press the Start indexing now button. You will be able to adjust the details later.

If you want more control, use the following links to adjust the indexing configuration and schedule.

These tools can be accessed later from the Preferences menu.

FirstIdxDialogBPrimera configuración de indexadoFirst indexing setupFirstIdxDialog6Configuración de indexaciónIndexing configurationFirstIdxDialog*Horario de indexaciónIndexing scheduleFirstIdxDialog0Iniciar indexación ahoraStart indexing nowFirstIdxDialogBEsto le permite ajustar los directorios que quiere indexar y otros parámetros, como rutas de ficheros o nombres excluidos, conjuntos de caracteres estándar, etc.This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.FirstIdxDialog"Esto le permite escoger entre indexación en tiempo real y por lotes, y configurar un horario automático para indexar por lotes (utilizando cron).€This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron).FirstIdxDialog D<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La indexación de <span style=" font-weight:600;">Recoll</span> puede ejecutarse permanentemente, indexando ficheros cuando cambian, o puede ejecutarse en intervalos discretos. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Leer el manual puede ayudarle a decidir entre estos dos métodos (presione F1).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esta herramienta puede ayudarle a configurar un horario para automatizar la ejecución de indexación por lotes, o iniciar la indexación en tiempo real cuando inicia la sesión (o ambos, lo cual rara vez tiene sentido).</p></body></html>¿

Recoll indexing can run permanently, indexing files as they change, or run at discrete intervals.

Reading the manual may help you to decide between these approaches (press F1).

This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense).

 IdxSchedWHorario de CronCron scheduling IdxSchedWÚDecida si la indexación en tiempo real será ejecutada cuando inicie la sesión (solo para el índice estándar).ZDecide if real time indexing will be started when you log in (only for the default index). IdxSchedWLConfiguración de horario de indexaciónIndex scheduling setup IdxSchedWLInicio de la indexación en tiempo realReal time indexing start up IdxSchedWàEsta herramienta le permite decidir a qué hora la indexación se ejecutará e instalará una entrada en el crontab._The tool will let you decide at what time indexing should run and will install a crontab entry. IdxSchedW$Ventana de diálogoDialog ListDialogCuadro de grupoGroupBox ListDialogªEl fichero de historial esta dañado o no se puede leer, por favor revíselo o bórrelo:K"history" file is damaged or un(read)writeable, please check or remove it: Main^Directorio de base de datos no está configurado No db directory in configurationMain&Siguiente&NextPreview&Previo &PreviousPreview&Buscar por: &Search for:Preview|No se puede convertir documento a representación interna para 0Can't turn doc into internal representation for PreviewCancelarCancelPreviewLNo se puede crear directorio temporal:#Cannot create temporary directory: PreviewLimpiarClearPreviewCerrar Pestaña Close TabPreview:Creando texto de vista previaCreating preview textPreview.Error al cargar ficheroError while loading filePreviewVCargando texto de vista previa en el editor Loading preview text into editorPreviewD&Coincidir mayúsculas y minúsculas Match &CasePreview6Programa ayudante faltante:Missing helper program: Preview CopiarCopyPreviewTextEditDoblar líneas Fold linesPreviewTextEdit*Preservar indentaciónPreserve indentationPreviewTextEditImprimirPrintPreviewTextEdit8Imprimir vista previa actualPrint Current PreviewPreviewTextEdit6Guardar documento a ficheroSave document to filePreviewTextEdit Seleccionar todo Select AllPreviewTextEditMostrar campos Show fieldsPreviewTextEditMostrar imagen Show imagePreviewTextEdit.Mostrar texto principalShow main textPreviewTextEdit@<b>Subdirectorios personalizadosCustomised subtreesQObjectÎ<i>Los parámetros siguientes se aplican a nivel superior, si una línea vacía<br>o ninguna es seleccionada en el listado arriba, o para cada directorio seleccionado.<br>Puede añadir o remover directorios presionando los botones +/-.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject(Historial web BeagleBeagle web historyQObjectFConjunto de caracteres por defecto Default character setQObject2Seguir enlaces simbólicosFollow symbolic linksQObjectÀSeguir enlaces simbólicos al indexar. El valor por defecto es no, para evitar indexar duplicadosTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject&Parámetros globalesGlobal parametersQObjectJIndexar todos los nombres de ficherosIndex all file namesQObjecthIndexar los nombres de los ficheros para los cuales los contenidos no pueden ser<br>identificados o procesados (tipo MIME inválido o inexistente). El valor por defecto es verdadero}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject$Parámetros localesLocal parametersQObject Nombres omitidos Skipped namesQObjectLa lista de subdirectorios en la jerarquía indexada<br>dónde algunos parámetros necesitan ser definidos. Valor por defecto: vacío.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObject¦Estos son patrones de nombres de ficheros o directorios que no deben ser indexados.LThese are patterns for file or directory names which should not be indexed.QObject”Este es el conjunto de caracteres usado para leer ficheros que no identifican internamente, por ejemplo, ficheros de texto puro.<br>El valor por defecto está vacío, y el valor del ambiente NLS es usado.ÒThis is the character set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObjectÒ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La indexación de <span style=" font-weight:600;">Recoll</span> puede configurarse para ejecutar como un demonio, actualizando el índice cuando los ficheros cambian, en tiempo real. Obtiene un índice actualizado siempre, pero recursos del sistema son utilizados permanentemente.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>.

Recoll indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.

RTIToolWdTambién iniciar demonio de indexación ahora mismo.%Also start indexing daemon right now.RTIToolW‚Fichero de autoinicio borrado. Detener el proceso actual también?2Autostart file deleted. Kill current process too ?RTIToolW$No se puede crear:Can't create: RTIToolW@No se puede ejecutar recollindexCould not execute recollindexRTIToolW Borrando fichero Deleting fileRTIToolWBorrando: Deleting: RTIToolWbInicio automático de la indexación en tiempo real"Real time indexing automatic startRTIToolW*Eliminando autoinicioRemoving autostartRTIToolW(Reemplazando ficheroReplacing fileRTIToolWReemplazando: Replacing: RTIToolWzIniciar el demonio de indexación con mi sesión de escritorio..Start indexing daemon with my desktop session.RTIToolWAdvertenciaWarningRTIToolW*(todos los lenguajes)(all languages)RclMain(sin raíces) (no stemming)RclMain Acerca de Recoll About RecollRclMainTodoAllRclMain¼Línea de comando incorrecta de visualizador para %1: [%2] Por favor revise el fichero mimeconfCBad viewer command line for %1: [%2] Please check the mimeconf fileRclMain>No se puede acceder al fichero:Can't access file: RclMainRNo se puede crear ventana de vista previaCan't create preview windowRclMainHNo se puede descomprimir el fichero:Can't uncompress file: RclMainpNo se puede actualizar el índice: indexador en ejecución#Can't update index: indexer runningRclMainrNo se puede extraer el documento o crear fichero temporal0Cannot extract document or create temporary fileRclMain†No se puede recuperar información del documento de la base de datos+Cannot retrieve document info from databaseRclMainCerrandoClosingRclMainpLos contenidos han sido indexados para estos tipos MIME:.Content has been indexed for these mime types:RclMain¾No se puede abrir índice externo. Base de datos no abierta. Revise listado de índices externos.HCould not open external index. Db not open. Check external indexes list.RclMainDFiltro de categorías de documentosDocument category filterRclMain.Historial de documentosDocument historyRclMain HechoDoneRclMainBorrando índice Erasing indexRclMain ErrorErrorRclMainEjecutando: [ Executing: [RclMain¾Aplicaciones/comandos externos necesarios y no encontrados para indexar sus tipos de fichero: SExternal applications/commands needed and not found for indexing your file types: RclMain$Datos de historial History dataRclMain,Índice no está abiertoIndex not openRclMainúÍndice no actualizado para este fichero. No mostrado para evitar utilizar la entrada errónea. Presione Ok para actualizar el índice para este fichero, luego ejecute la consulta de nuevo cuando la indexación termine. En caso contrario, presione Cancelar.´Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel.RclMain8Error de consulta del índiceIndex query errorRclMain(Tipos MIME indexadosIndexed MIME TypesRclMain Indexación fallóIndexing failedRclMain.Indexación en progreso:Indexing in progress: RclMain:Programas ayudantes faltantesMissing helper programsRclMainMonitorMonitorRclMain`No hay visualizador configurado para tipo MIME [-No external viewer configured for mime type [RclMainÿÿÿÿNo helpers found missingRclMain"No hay resultadosNo results foundRclMainNingunoNoneRclMainÿÿÿÿPurgeRclMain(Detalles de búsqueda Query detailsRclMainÜConsulta en progreso.<br>Debido a limitaciones en la librería de indexación,<br>cancelar terminará el programaeQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMain,Resultados de búsqueda Query resultsRclMainRRestaurar el índice e iniciar desde cero?(Reset the index and start from scratch ?RclMain6Conteo de resultados (est.)Result count (est.)RclMainGuardar fichero Save fileRclMain RaízdbStemdbRclMain&Detener &IndexaciónStop &IndexingRclMainüEl proceso de indexación actual no se inicio desde esta interfaz. Presione Ok para detenerlo, o Cancelar para dejarlo ejecutaryThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMainÿÿÿÿhThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMain8Esta búsqueda no está activa"This search is not active any moreRclMainDesconocidoUnknownRclMain$Actualizar &Índice Update &IndexRclMainActualizandoUpdatingRclMainAdvertenciaWarningRclMainPerror al recuperar lenguajes para raíces#error retrieving stemming languagesRclMainfiltradofilteredRclMain mediosmediaRclMainmensajemessageRclMainotrootherRclMainpresentación presentationRclMainordenadosortedRclMainhoja de cálculo spreadsheetRclMain textotextRclMain"&Acerca de Recoll &About Recoll RclMainBase$Búsqueda &Avanzada&Advanced Search RclMainBase>Borrar historial de &documentos&Erase document history RclMainBase:Borrar historial de &búsqueda&Erase search history RclMainBase&Fichero&File RclMainBase$Pantalla &Completa &Full Screen RclMainBase &Ayuda&Help RclMainBase8Configuración de &indexación&Indexing configuration RclMainBase,&Horario de indexación&Indexing schedule RclMainBase&Preferencias &Preferences RclMainBase4Configuración de &consulta&Query configuration RclMainBase&&Reconstruir índice&Rebuild index RclMainBase0&Mostrar tipos indexados&Show indexed types RclMainBase8&Mostrar ayudantes faltantes&Show missing helpers RclMainBase6Parámetros de &ordenamiento&Sort parameters RclMainBase&Herramientas&Tools RclMainBase$Manual de &Usuario &User manual RclMainBase4Búsqueda avanzada/complejaAdvanced/complex Search RclMainBaseTodoAll RclMainBase Ctrl+QCtrl+Q RclMainBase.Historial de DocumentosDocument History RclMainBase0Historial de &DocumentosDocument &History RclMainBase &SalirE&xit RclMainBaseD&Configuración de índices externosE&xternal index dialog RclMainBaseBConfiguración de índices externosExternal index dialog RclMainBaseF11F11 RclMainBasePrimera página First page RclMainBase"Pantalla Completa Full Screen RclMainBaseHIr a la primera página de resultadosGo to first page of results RclMainBase Siguiente página Next page RclMainBase<Página de resultados siguienteNext page of results RclMainBase AvPágPgDown RclMainBase RePágPgUp RclMainBasePágina anterior Previous page RclMainBase:Página de resultados anteriorPrevious page of results RclMainBase RecollRecoll RclMainBase&Lista de resultados Result list RclMainBase0Herramientas de búsqueda Search tools RclMainBase Mayúsculas+RePág Shift+PgUp RclMainBaseBMostrar resultados de la consultaShow Query Details RclMainBase8Mostrar resultados tabuladosShow results as table RclMainBaselOrdenar por fechas de la más reciente a la más antigua#Sort by dates from newest to oldest RclMainBaselOrdenar por fechas de la más antigua a la más reciente#Sort by dates from oldest to newest RclMainBase4Parámetros de ordenamientoSort parameters RclMainBase.&Explorador de términosTerm &explorer RclMainBaseLHerramienta de exploración de términosTerm explorer tool RclMainBase$Actualizar &índice Update &index RclMainBase$ordenarPorFechaAsc sortByDateAsc RclMainBase&ordenarPorFechaDescsortByDateDesc RclMainBaseResumenAbstract RecollModel AutorAuthor RecollModel FechaDate RecollModelFecha y hora Date and time RecollModel&Fecha del documento Document date RecollModel(Tamaño del documento Document size RecollModel"Fecha del fichero File date RecollModel"Nombre de fichero File name RecollModel$Tamaño del fichero File size RecollModel IpathIpath RecollModelPalabras claveKeywords RecollModelTipo MIME MIME type RecollModelFecha ModMtime RecollModel>Conjunto de caracteres originalOriginal character set RecollModel4Calificación de relevanciaRelevancy rating RecollModel TítuloTitle RecollModelURLURL RecollModel &Abrir&OpenResListL&Abrir documento/directorio ascendente&Open Parent document/folderResList&Vista Previa&PreviewResList&&Escribir a fichero&Write to FileResList$(mostrar consulta) (show query)ResList@<p><b>No hay resultados</b></br>

No results found
ResListf<p><i>Ortografía alterna (acentos suprimidos): </i>4

Alternate spellings (accents suppressed): ResList2Copiar nombre de &ficheroCopy &File NameResListCopiar &URL Copy &URLResList.Historial de documentosDocument historyResListDocumentos DocumentsResList8Buscar documentos &similaresFind &similar documentsResListSiguienteNextResList AbrirOpenResListVista previaPreviewResList`&Vista previa de documento/directorio ascendentePreview P&arent document/folderResListAnteriorPreviousResList&Lista de resultados Result listResList.Documento no disponibleUnavailable documentResListparaforResListde por lo menosout of at leastResList&Borrar columna&Delete columnResTable &Abrir&OpenResTableL&Abrir documento/directorio ascendente&Open Parent document/folderResTable&Vista previa&PreviewResTable.&Restaurar ordenamiento &Reset sortResTable"&Guardar como CSV &Save as CSVResTable&&Escribir a fichero&Write to FileResTable(Agregar columna "%1"Add "%1" columnResTable@No se puede abrir/crear fichero:Can't open/create file: ResTable2Copiar nombre de &ficheroCopy &File NameResTableCopiar &URL Copy &URLResTable8Buscar documentos &similaresFind &similar documentsResTable`&Vista previa de documento/directorio ascendentePreview P&arent document/folderResTable6Guardar tabla a fichero CSVSave table to CSV fileResTable &Abrir&OpenResTableDetailAreaL&Abrir documento/directorio ascendente&Open Parent document/folderResTableDetailArea&Vista previa&PreviewResTableDetailArea&&Escribir a fichero&Write to FileResTableDetailArea2Copiar nombre de &ficheroCopy &File NameResTableDetailAreaCopiar &URL Copy &URLResTableDetailArea8Buscar documentos &similaresFind &similar documentsResTableDetailArea`&Vista previa de documento/directorio ascendentePreview P&arent document/folderResTableDetailArea$Todos los términos All termsSSearch"Cualquier términoAny termSSearch"Consulta inválidaBad query stringSSearchFinalizaciones CompletionsSSearchhIngrese expresión de comodín para nombre de fichero.$Enter file name wildcard expression.SSearch€Ingrese expresión de lenguaje de consulta. Hoja de trucos:<br> <i>term1 term2</i> : 'term1' y 'term2' en cualquier campo.<br> <i>campo:term1</i> : 'term1' en campo 'campo'. <br> Nombres de campos estándar/sinónimos:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-campos: dir, mime/format, type/rclcat, date.<br> Dos ejemplos de intervalo de fechas: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> Los paréntesis no están permitidos en realidad.<br> <i>"term1 term2"</i> : frase (debe aparecer exactamente). Modificadores posibles:<br> <i>"term1 term2"p</i> : busca de proximidad sin orden con distancia estándar.<br> Use el enlace <b>Mostrar Consulta</b> en caso de duda sobre el resultado y vea el manual (&lt;F1>) para más detalles. éEnter query language expression. Cheat sheet:
term1 term2 : 'term1' and 'term2' in any field.
field:term1 : 'term1' in field 'field'.
Standard field names/synonyms:
title/subject/caption, author/from, recipient/to, filename, ext.
Pseudo-fields: dir, mime/format, type/rclcat, date.
Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
term1 term2 OR term3 : term1 AND (term2 OR term3).
No actual parentheses allowed.
"term1 term2" : phrase (must occur exactly). Possible modifiers:
"term1 term2"p : unordered proximity search with default distance.
Use Show Query link when in doubt about result and see manual (<F1>) for more detail. SSearch²Ingrese términos de búsqueda aquí. Presione ESC ESPACIO para completar el término actual.FEnter search terms here. Type ESC SPC for completions of current term.SSearch"Nombre de fichero File nameSSearchNo hay memoria Out of memorySSearch(Lenguaje de consultaQuery languageSSearch&Seleccione un ítem:Select an item:SSearch2Demasiadas finalizacionesToo many completionsSSearch.Elija tipo de búsqueda.Choose search type. SSearchBaseLimpiarClear SSearchBase Ctrl+SCtrl+S SSearchBaseªIngrese términos de búsqueda aquí. Presione ESC ESP para completar el término actual.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase4Borrar entrada de búsquedaErase search entry SSearchBaseSSearchBase SSearchBase SSearchBaseBúsquedaSearch SSearchBase Iniciar consulta Start query SSearchBaseTodoAll SearchClauseWCualquieraAny SearchClauseW"Nombre de fichero File name SearchClauseWNingún campoNo field SearchClauseWNingunoNone SearchClauseW˜Número de palabras adicionales que pueden ser intercaladas con las escogidasHNumber of additional words that may be interspersed with the chosen ones SearchClauseW FrasePhrase SearchClauseWProximidad Proximity SearchClauseWzElija el tipo de consulta que será realizada con las palabras>Select the type of query that will be performed with the words SearchClauseW&Cerrar&Close SpellBase&Expandir&Expand  SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBase2No hay información de bd. No db info. SpellBase,Explorador de términos Term Explorer SpellBase:Error de expansión de Aspell.Aspell expansion error. SpellWlInicialización de Aspell falló. Está instalado Aspell?)Aspell init failed. Aspell not installed?SpellWDoc./Tot. Doc. / Tot.SpellWbÍndice: %1 documentos, largo promedio %2 términos,Index: %1 documents, average length %2 termsSpellW.Expansión no encontradaNo expansion foundSpellW"Expresión regularRegexpSpellW&Ortografía/fonéticaSpelling/PhoneticSpellW&Expansión de raícesStem expansionSpellWTérminoTermSpellWComodines WildcardsSpellWPerror al recuperar lenguajes para raíces#error retrieving stemming languagesSpellW ElegirChoose UIPrefsDialog¢Seleccione el directorio para el índice Xapian (ej: /home/buddy/.recoll/xapiandb)@Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) UIPrefsDialogrEl directorio seleccionado no parece ser un índice Xapian;The selected directory does not appear to be a Xapian index UIPrefsDialogrEl directorio seleccionado ya está en la lista de índices3The selected directory is already in the index list UIPrefsDialogHEste es el índice local o principal!This is the main/local index! UIPrefsDialogPerror al recuperar lenguajes para raíces#error retrieving stemming languages UIPrefsDialogdCambiando acciones con valores actuales diferentes.Changing actions with different current values ViewActionComandoCommand ViewActionTipo MIME MIME type ViewActionCambiar Acción Change ActionViewActionBase CerrarCloseViewActionBase,Visualizadores NativosNative ViewersViewActionBaseìSeleccione uno o varios tipos de fichero, luego presione Cambiar Acción para modificar el programa usado para abrirlosbSelect one or several file types, then click Change Action to modify the program used to open themViewActionBaseÜSeleccione uno o varios tipos MIME y presione "Cambiar Acción"<br>Puede también cerrar esta ventana y marcar "Usar preferencias del escritorio"<br>en el panel principal para ignorar esta lista y usar los valores estándar de su escritorio.ÉSelect one or several mime types then click "Change Action"
You can also close this dialog and check "Use desktop preferences"
in the main panel to ignore this list and use your desktop defaults.ViewActionBaseRBeagle NO DEBE estar ejecutándose. Habilita procesar la cola para indexar el historial web de Firefox de Beagle.<br>(debe también instalar el plugin Beagle para Firefox)”Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.
(you should also install the Firefox Beagle plugin)confgui::ConfBeaglePanelW€Las entradas serán recicladas una vez que el tamaño es alcanzado1Entries will be recycled once the size is reachedconfgui::ConfBeaglePanelWLTamaño máximo para el almacén web (MB) Max. size for the web store (MB)confgui::ConfBeaglePanelW@Robar cola de indexado de BeagleSteal Beagle indexing queueconfgui::ConfBeaglePanelWTEl nombre del directorio dónde almacenar las copias de páginas web visitadas.<br>Una ruta de directorio no absoluta es utilizada, relativa al directorio de configuración.‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWdNombre del directorio del almacén para páginas webWeb page store directory nameconfgui::ConfBeaglePanelWZNo se puede escribir fichero de configuraciónCan't write configuration fileconfgui::ConfIndexW ElegirChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWàFiltros externos que se ejecuten por más tiempo del establecido serán abortados.<br>Esto ocurre en los raros casos (ej: postscript) cuando un documento hace que un filtro entre en un ciclo.<br>Establezca un valor de -1 para no tener límite.«External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. confgui::ConfSubPanelW GlobalGlobalconfgui::ConfSubPanelW°Si se utiliza este valor (diferente de -1), los ficheros de texto serán separados en partes de este tamaño para ser indexados. Esto ayuda con las búsquedas de ficheros de texto muy grandes (ej: ficheros de registro).¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWPTamaño máximo de fichero comprimido (KB)Max. compressed file size (KB)confgui::ConfSubPanelWRTiempo máximo de ejecución de filtros (S)Max. filter exec. time (S)confgui::ConfSubPanelWPTamaño máximo para fichero de texto (MB)Max. text file size (MB)confgui::ConfSubPanelWVTamaño de página para fichero de texto (KB)Text file page size (KB)confgui::ConfSubPanelWdEste valor establece un umbral mas allá del cual los archivos<br>comprimidos no serán procesados. Escriba 1 para no tener límite,<br>o el número 0 para nunca hacer descompresión.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelW¢Este valor establece un umbral más allá del cual los ficheros de texto no serán procesados.<br>Escriba 1 para no tener límites. Este valor es utilizado para excluir ficheros de registro gigantescos del índice.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelWLenguaje AspellAspell languageconfgui::ConfTopPanelWLNombre del directorio de base de datosDatabase directory nameconfgui::ConfTopPanelW@Deshabilita el uso de aspell para generar aproximaciones ortográficas en la herramienta explorador de términos.<br>Útil si aspell no se encuentra o no funciona.†Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelW\Intervalo en megabytes de escritura del índiceIndex flush megabytes intervalconfgui::ConfTopPanelW:Nombre de fichero de registro Log file nameconfgui::ConfTopPanelW@Nivel de verbosidad del registroLog verbosity levelconfgui::ConfTopPanelW>Utilización máxima de disco (%)Max disk occupation (%)confgui::ConfTopPanelW$No utilizar aspellNo aspell usageconfgui::ConfTopPanelW(Directorios omitidos Skipped pathsconfgui::ConfTopPanelW*Lenguajes para raícesStemming languagesconfgui::ConfTopPanelW®El fichero donde los mensajes serán escritos.<br>Use 'stderr' para salida a la terminalPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWEl lenguaje para el diccionario aspell. Esto debe ser algo como 'en' o 'fr'...<br>Si este valor no se especifica, el ambiente NLS será usado para averiguarlo, lo cual usualmente funciona. Para tener una idea de qué esta instalado en su sistema escriba 'aspell-config' y busque por ficheros .dat dentro del directorio 'data-dir'.2The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW¨Los lenguajes para los cuales los diccionarios de expansión de raíces serán creados.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelWÐLa lista de directorios donde el indexado recursivo comienza. Valor por defecto: su directorio personal.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWnNombre del directorio donde almacenar el índice.<br>Un valor no absoluto para la ruta de directorio es usado, relativo al directorio de configuración. El valor estándar es 'xapiandb'.–The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelW¬Estos son los nombres de directorios los cuales no se indexan.<br>Puede contener comodines. Debe corresponder a las rutas vistas por el indexador (ej: si los directorios primarios incluyen '/home/me' y '/home' es en realidad un enlace a '/usr/home', la entrada correcta para directorios omitidos sería '/home/me/tmp*', no '/usr/home/me/tmp*')#These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelWLEste es el porcentaje de utilización de disco donde el indexado fallará y se detendrá (para evitar llenarle el disco).<br>0 significa sin límites (valor por defecto).—This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).
0 means no limit (this is the default).confgui::ConfTopPanelW8Este valor ajusta la cantidad de datos indexados entre escrituras al disco.<br> Esto ayuda a controlar el uso de memoria del indexador. Valor estándar 10MB ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWäEste valor ajusta la cantidad de mensajes,<br>desde solamente errores hasta montones de información de depuración.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW*Directorios primariosTop directoriesconfgui::ConfTopPanelWLUtilizar el comando 'file' del sistemaUse system's 'file' commandconfgui::ConfTopPanelW°Utilizar el comando 'file' del sistema si la identificación interna de tipos MIME falla.NUse the system's 'file' command if internal
mime type identification fails.confgui::ConfTopPanelW&Cancelar&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBaseâUna búsqueda por [rolling stones] (2 términos) será cambiada por [rolling or stones or (rolling phrase 2 stones)]. Esto dará mayor precedencia a los resultados en los cuales los términos de búsqueda aparecen exactamente como fueron escritos.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBaseDSeparador de fragmentos de resumenAbstract snippet separatoruiPrefsDialogBaseActivar Todos Activate AlluiPrefsDialogBaseAñadir índice Add indexuiPrefsDialogBaseAplicar cambios Apply changesuiPrefsDialogBasetAuto iniciar búsqueda simple al entrar espacios en blanco.-Auto-start simple search on whitespace entry.uiPrefsDialogBasebAutomáticamente añadir frases a búsquedas simples+Automatically add phrase to simple searchesuiPrefsDialogBasexPorcentaje del umbral de frecuencia de términos de autofrase.Autophrase term frequency threshold percentageuiPrefsDialogBase ElegirChooseuiPrefsDialogBaseBEscoger aplicaciones para ediciónChoose editor applicationsuiPrefsDialogBaserPresione para añadir otro directorio de índice a la lista0Click to add another index directory to the listuiPrefsDialogBase<Formato de fecha (strftime(3))Date format (strftime(3))uiPrefsDialogBase Desactivar TodosDeactivate AlluiPrefsDialogBase"Descartar cambiosDiscard changesuiPrefsDialogBaseÔMostrar filtros de categorías como barra de herramientas en lugar de panel de botones (necesita reinicio).KDisplay category filter as toolbar instead of button panel (needs restart).uiPrefsDialogBasex¿Sintetizar un resumen aunque el documento parece tener uno?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseF¿Intentar construir resúmenes para elementos en la lista de resultados utilizando el contexto de los términos de búsqueda? Puede ser lento para documentos grandes.zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBaseBConstruir resúmenes dinámicamenteDynamically build abstractsuiPrefsDialogBasepEditar encabezado html insertado en página de resultados#Edit result page html header insertuiPrefsDialogBasejEditar texto de formato para el párrafo de resultados#Edit result paragraph format stringuiPrefsDialogBaseHabilitarEnableuiPrefsDialogBase Índices ExternosExternal IndexesuiPrefsDialogBasedUmbral de porcentaje de frecuencia sobre el cuál no utilizamos términos dentro de la autofrase. Los términos frequentes son un problema importante de desempeño con las frases. Términos omitidos aumenta la holgura de la frase, y reducen la eficiencia de la autofrase. El valor por defecto es 2 (por ciento).þFrequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). uiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBase>Esconder resultados duplicados.Hide duplicate results.uiPrefsDialogBaseXColor de resaltado para términos de búsquedaHighlight color for query termsuiPrefsDialogBaseØSi está marcado, los resultados con el mismo contenido bajo nombres diferentes serán mostrados solo una vez.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBase†Líneas en texto PRE no se parten. Al usar BR se pierde indentación.BLines in PRE text are not folded. Using BR loses some indentation.uiPrefsDialogBase|Tamaño máximo de texto resaltado para vista previa (megabytes)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBase\Número de elementos en la página de resultados"Number of entries in a result pageuiPrefsDialogBaseœAbre una ventana para seleccionar el tipo de letra para la lista de resultados-Opens a dialog to select the result list fontuiPrefsDialogBase~Abre una ventana de diálogo para seleccionar la hoja de estilos-Opens a dialog to select the style sheet fileuiPrefsDialogBase^Preferir HTML a texto simple para vista previa.&Prefer Html to plain text for preview.uiPrefsDialogBaseˆSufijos para nombres mágicos de ficheros en el lenguaje de consulta.(Query language magic file name suffixes.uiPrefsDialogBase\Recordar estado de activación de ordenamiento.Remember sort activation state.uiPrefsDialogBase‚Eliminar de la lista. Esto no tiene efecto en el índice en disco.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase$Eliminar selecciónRemove selecteduiPrefsDialogBaseLReemplazar resúmenes de los documentos Replace abstracts from documentsuiPrefsDialogBaseRestaurarResetuiPrefsDialogBaseªRestaurar el tipo de letra de la lista de resultados al valor por defecto del sistema1Resets the result list font to the system defaultuiPrefsDialogBasedRestablecer la hoja de estilo al valor por defecto!Resets the style sheet to defaultuiPrefsDialogBase&Lista de resultados Result ListuiPrefsDialogBaseLTipo de letra para lista de resultadosResult list fontuiPrefsDialogBase,Parámetros de búsquedaSearch parametersuiPrefsDialogBasehIniciar con la ventana de búsqueda avanzada abierta.'Start with advanced search dialog open.uiPrefsDialogBase$Lenguaje de raícesStemming languageuiPrefsDialogBaseHoja de estilo Style sheetuiPrefsDialogBaseXPalabras de contexto del resumen sintetizado Synthetic abstract context wordsuiPrefsDialogBaseVTamaño del resumen sintetizado (caracteres)$Synthetic abstract size (characters)uiPrefsDialogBase~Textos más allá de este tamaño no serán resaltados (muy lento).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBaseêLas palabras en la lista serán convertidas automáticamente a cláusulas ext:xxx en el ingreso de lenguaje de consulta.bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase"Cambiar selecciónToggle selecteduiPrefsDialogBaseÂUse etiquetas <PRE> en lugar de <BR> para desplegar texto corriente como html en la vista previa.GUse

 tags instead of 
to display plain text as html in preview.uiPrefsDialogBaseŽUsar preferencias del escritorio para seleccionar editor de documentos.2Use desktop preferences to choose document editor.uiPrefsDialogBase&Interfaz de usuarioUser interfaceuiPrefsDialogBase.Preferencias de usuarioUser preferencesuiPrefsDialogBaseˆrecoll-1.17.3/qtgui/i18n/recoll_fr.qm000644 001750 000000 00000253136 11757435371 017731 0ustar00dockeswheel000000 000000 <¸dÊÍ!¿`¡½ÝB+÷0-÷]¯&+;SH,ˆH,®©H,ÜÅHYÜòIA°ÈZl¼°mbÂÿ¦yk‡¨¥¹.¶E•ÐD ƒÙ] ·LôÁ VE|VEݬf¾Á8lÀ²¾¬äάô¨yEî?]$—Ëþ'HäÃ&*Ð%ªD*ì0ª½+Lôf~+f¾¼Ù+f¾Ã¾+f¾Èv1øÒ:Îd§G…Ô;wG߯ÊH6óà‹H6õà¸J+‚h¿J+‚ÚJ6• ƒJ6•ë^L™b•‘Ph¨ºþT°5»¢WTlsWÈÕ¤XÉÄ<|[ %¼e®i1gwîÌsºñ[sºñ§3v8“Ÿ}v®ÂÈv®Â§™zϳŠ€€£'°„jˆÿŒ!þX0œbÍ詪J /®½Þ,­¶Êðˆ¬º° ×ÃÞÅÐùƒ¦VÐùƒå-Ðùƒéã3¸5ãnÿtÕÄEµ¤ß&`ŽÙ0,…þ>.cuiDo2šXM¹5äX®©7`Þ^¾ h0ó³lÿtÝnnÚn¥wñ…»gwñ…êæ„3âê‘vã"D•ñ“uœW­ëýž€Þ—¢‰þF£cêŠÎxCo Þñƒw~ó L<þSIØÿµ çuÛ#¸Î,p#Cvå×v奺3w 5ºtw 5×Þw 5Ý'w€¢#ÌRŒU¦Ÿ.‹·£¹ÞôF©Ö³ä÷ª6•à#¯†”е»f3­áËÂî—Sͼu6½Ðgž§ÆÔÂõi¶Ø.^ítê•ÊØÖì;UÈï¡©8¸úUkúeî’ ¬G{!D=r ‹N(&Á,[.‡Nx 7Îý=úd>#?úd³½?údÂZG$߇íJUY”¦JUY¿ìY ôã‹[–um3_nâ®s¾~EFz Óéíº™A u.¶–Ê· ¯¡3¬›Ê—¥§hÎÅå7ðÔä^2®ÝôL'^ã¿á›ìxYùJg-þA¢·.B b<.‡]çÞÙ›õµëd¶*;[¾àå<ÄöÄþLƒë’e 2›ÜvhÕö€ã‡Ž÷…(PŒŒ¯b¸ü’"3Ò’ZÓ˜I¼gø™n• štµ¯Ÿf•åןf•öòŸf•%G«®Ô«Ú;¯ƒW9¯ƒWdsÄy%6Äy%.*΄ա®Ð: ¡Ú#.dãX|ú,åõW4ÑÌ”Y -ZhzÏáê-¼·Š)ÖT<ÁB9€ˆBìSßQk¶Þ²Œoˆ•Þàr?)½ôržŒñ|ôò“„kå½²„kåÅM„kåÉp‹¦,³‹‹ÜðãØŒÇ<®›ˆ˜Ü6¦AS'ªÃ¢¡·¨ ˼»œRáJ¿gu«YÇ¢•¿PÇ¢•ÆqÇ¢•ɽ×I^±5Ø~C÷èêÈ•>éã>c ðŒµ@ `³³5" Üp:ªòDUKô>xp h!õu9O„v2ãk»–T#mê—BhîšK˦ %M¦öõ;¨«‡¥ç¶7Â¥ÄÖ[œÊXÔ!ënDŠ ðw)ßþnC#Š#+ä@‡7I^ªyFW#ÝÚF¯N*£H:"½H:"ÃîH:"Ȱ_guLŽŒÍw½tŒÍwÄ[ŒÍwÉ'ŒÏ—Ádn¾.“’ž"­¦š´¨²ð ¿­²ð ÆÏ²ð Ê%´ù€ ®¾l¯ŸØÓt¨0Èà‹oɆtD·éŽ#´œ3dß áùæ :uî8·QçÇs¨oz÷Š}}s?€;EÈŽÄ^4¶”ò“@Øœ .zt¨0ÎóÄÛõÌí³f¯Í³Â$װކÝÜãäœc óä´¥‹æí:’pö¨åBú ÃGÙ ´H¨ö 9ZyÛ£ ;´3šx K¨ó²> ]#—œ¸ cÄIð k¨µnW lMˆd¨ ‰ŒîCG ŸÁòÁ§ ŸÁòLJ ŸÁòÊñ «ƒÔ¸Æ ­î„ ®œ¯)| ²9üú ü>: äîo‘ íåõ$M *Nl Üc ˜ ).~ªì *R7r +<” ‡ 6 ’; G.~L `P› `ç£ c·E°ñ d8ê° yj¸ ˜Iœ ¤žúi ±TúÍ; ²ëCÀ“ ²ëCÇ ²ëCÊo Áùš– ÄãÀ\ âæç°w åKÄG æõç¯ÿ ®¯ ®ù¯g Ô…‘ ye5Ë TH‹ ŽÚfè =!QQ CK€h( Kj×¼= T|c­ h¹°g( tÓ9ù éý© £Ü mš ¨Î£±v »ïµ‘š Öüõµ Û·å²ê ÛÓ% VdšÊ 'И®O /¥›{ 97Ã< 9Éž. L*Äš PÖ™Œ  RVŽ¥_ T#wÌ Vü° \iC;Ô ]æùó# `F¥ ¶ hôîÃm v—¥ Í {l9e €!Y j ‘–²”0 ©zó’ ¬æà‰Ï Ër&5 ÓÍ£s Ú÷äy Ýøì!« é—~3¶ ö†ÀàU zs÷ m£»- 'RçLò -èô»Ñ 8þ‚ FÁ— OE°Kš m†C3 uò0´^ y·çô y¹~ ‚±3 1 …È©&ç ‡uØ| ‰PŒj ‰P¦! 5d7= ’ãnë ¤š„& ¬Š©5 ½ý7`x ÕH û£ä! q©©Ç€2d%Ýn|þ/¸.Þ16“¸|<ÞB<95Qá~:®Y~s­ƒ[žs¶Ó\Н66g3±ûpû~`¿Õ Å!!C ‚´rÖ­c޵“ÃÙ1»m€Åì¿­c íÂ|“>îÎÁ'¡Zâ ó l¨£ü©Ü¹ü¶LûiH=$Toutes les clauses All clauses AdvSearchUne des clauses Any clause AdvSearch†Suffixe multiplicateur incorrect dans un filtre de taille (k/m/g/t)$Bad multiplier suffix in size filter AdvSearchmultimédiamedia AdvSearchmessagesmessages AdvSearch autresother AdvSearchprésentations presentations AdvSearch$feuilles de calcul spreadsheets AdvSearch textestexts AdvSearch<----- Tout <----- All AdvSearchBase<----- Sel <----- Sel AdvSearchBase$Ajouter une clause Add clause AdvSearchBase"Recherche avancéeAdvanced search AdvSearchBaseTout ----> All ----> AdvSearchBaseºTous les champs de droite non vides seront combinés par une conjonction ET (choix "Toutes les clauses") ou OU (choix "Une des clauses"). <br> Les champs de type "Un de ces mots", "Tous ces mots" et "Aucun de ces mots" acceptent un mélange de mots et de phrases contenues dans des apostrophes "une phrase".<br>Les champs non renseignés sont ignorés.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBaseParcourirBrowse AdvSearchBasePar catégories By categories AdvSearchBaseZCocher pour activer le filtrage sur les dates'Check this to enable filtering on dates AdvSearchBasenCocher pour permettre le filtrage des types de fichiers,Check this to enable filtering on file types AdvSearchBasebCocher pour activer le fitrage sur taille fichier'Check this to enable filtering on sizes AdvSearchBaseŽCocher pour utiliser les catégories de fichiers au lieu des types mimes;Check this to use file categories instead of raw mime types AdvSearchBase FermerClose AdvSearchBase$Enlever une clause Delete clause AdvSearchBaseXEntrer le répertoire où démarre la rechercheEnter top directory for search AdvSearchBaseFiltrerFilter AdvSearchBase*Filtrer sur les dates Filter dates AdvSearchBase&Filtrer les tailles Filter sizes AdvSearchBaseTrouverFind AdvSearchBaseÀ partir deFrom AdvSearchBase2Types de fichiers ignorésIgnored file types AdvSearchBaseInverserInvert AdvSearchBaseTaille Max. Max. Size AdvSearchBaseœTaille Maximum. Vous pouvez utiliser un suffixe multiplicateur: k/K, m/M, g/G.4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBaseTaille Min. Min. Size AdvSearchBaseœTaille minimum. Vous pouvez utiliser un suffixe multiplicateur: k/K, m/M, g/G.4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase<Restreindre le type de fichierRestrict file types AdvSearchBaserRestreindre les résultats aux fichiers de l'arborescence:%Restrict results to files in subtree: AdvSearchBase8Sauver comme valeur initialeSave as default AdvSearchBaseTRechercher les <br>documents<br>vérifiant:'Search for
documents
satisfying: AdvSearchBase6Types de fichier recherchésSearched file types AdvSearchBaseSel -----> Sel -----> AdvSearchBase&Lancer la recherche Start Search AdvSearchBaseJusqu'àTo AdvSearchBaser<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span>: planification de l'indexation périodique (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Chaque champ peut contenir un joker (*), une simple valeur numérique , des listes ponctuées par des virgules (1,3,5) et des intervalles (1-7). Plus généralement, les champs seront utilisés <span style=" font-style:italic;">tels quels</span> dans le fichier crontab, et la syntaxe générale crontab peut être utilisée, voir la page de manuel crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Par exemple, en entrant <span style=" font-family:'Courier New,courier';">*</span> dans <span style=" font-style:italic;">Jours, </span><span style=" font-family:'Courier New,courier';">12,19</span> dans <span style=" font-style:italic;">Heures</span> et <span style=" font-family:'Courier New,courier';">15</span> dans <span style=" font-style:italic;">Minutes</span>, recollindex démarrerait chaque hour à 12:15 et 19:15</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un planning avec des activations très fréquentes est probablement moins efficace que l'indexation au fil de l'eau.</p></body></html>Å

Recoll batch indexing schedule (cron)

Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used as is inside the crontab file, and the full crontab syntax can be used, see crontab(5).


For example, entering * in Days, 12,19 in Hours and 15 in Minutes would start recollindex every day at 12:15 AM and 7:15 PM

A schedule with very frequent activations is probably less efficient than real time indexing.

 CronToolWl<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cliquer <span style=" font-style:italic;">Désactiver</span> pour arrêter l'indexation automatique périodique, <span style=" font-style:italic;">Activer</span> pour la démarrer, <span style=" font-style:italic;">Annuler</span> pour ne rien changer.</p></body></html>š

Click Disable to stop automatic batch indexing, Enable to activate it, Cancel to change nothing.

 CronToolWDialogue Cron Cron Dialog CronToolWpJours de la semaine (* ou 0-7, 0 ou 7 signifie Dimanche))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolWDésactiverDisable CronToolWActiverEnable CronToolW˜Erreur durant l'installation de l'entrée cron. Mauvaise syntaxe des champs ?3Error installing cron entry. Bad syntax in fields ? CronToolW$Heures (* ou 0-23)Hours (* or 0-23) CronToolWØIl semble que des entrées créées manuellement existent pour recollindex. Impossible d´éditer le fichier CronPIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolWMinutes (0-59)Minutes (0-59) CronToolWDialogueDialog EditDialog X<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Il semble que l'index pour cette configuration n'existe pas encore.</span><br /><br />Si vous voulez simplement indexer votre répertoire avec un jeu raisonnable de valeurs par défaut, cliquer le bouton <span style=" font-style:italic;">Démarrer l'indexation maintenant</span>. Vous pourrez ajuster les détails plus tard. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si vous voulez plus de contrôle, utilisez les liens qui suivent pour ajuster la configuration et le planning d'indexation.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ces outils peuvent être accédés plus tard à partir du menu <span style=" font-style:italic;">Preferences</span>.</p></body></html>ê

It appears that the index for this configuration does not exist.

If you just want to index your home directory with a set of reasonable defaults, press the Start indexing now button. You will be able to adjust the details later.

If you want more control, use the following links to adjust the indexing configuration and schedule.

These tools can be accessed later from the Preferences menu.

FirstIdxDialogJParamétrage de la première indexationFirst indexing setupFirstIdxDialog:Configuration de l'indexationIndexing configurationFirstIdxDialog0Planning de l'indexationIndexing scheduleFirstIdxDialog@Démarrer l'indexation maintenantStart indexing nowFirstIdxDialogjVous pourrez ajuster les répertoires que vous voulez indexer, et d'autres paramètres comme les schémas de noms ou chemins de fichiers exclus, les jeux de caractères par défaut, etc.This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.FirstIdxDialog*Vous pourrez choisir entre l'indexation à intervalles fixes ou au fil de l'eau, et définir un planning pour la première (basé sur l'utilitaire cron).€This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron).FirstIdxDialog J<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">L'indexation <span style=" font-weight:600;">Recoll</span> peut fonctionner en permanence, traitant les fichiers dès qu'ils sont modifiés, ou être exécutée à des moments prédéterminés. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Une lecture du manuel peut vous aider à choisir entre ces approches (presser F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cet outil peut vous aider à planifier l'indexation périodique, ou configurer un démarrage automatique de l'indexation au fil de l'eau quand vous vous connectez (ou les deux, ce qui est rarement pertinent). </p></body></html>¿

Recoll indexing can run permanently, indexing files as they change, or run at discrete intervals.

Reading the manual may help you to decide between these approaches (press F1).

This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense).

 IdxSchedWPlanning CronCron scheduling IdxSchedWÎDéterminer si l'indexation au fil de l'eau démarre quand vous vous connectez (pour l'index par défaut).ZDecide if real time indexing will be started when you log in (only for the default index). IdxSchedWHParamétrage du planning d'indexationIndex scheduling setup IdxSchedWRDémarrage de l'indexation au fil de l'eauReal time indexing start up IdxSchedWêLe dialogue vous permettra de déterminer à quelle heure l'indexation devra démarrer et installera une entrée crontab._The tool will let you decide at what time indexing should run and will install a crontab entry. IdxSchedWDialogueDialog ListDialogGroupBoxGroupBox ListDialog€Le fichier d'historique est illisible, le verifier ou l'effacer:K"history" file is damaged or un(read)writeable, please check or remove it: Main‚Répertoire de la base de données non défini dans la configuration No db directory in configurationMain&Suivant&NextPreview&Précédent &PreviousPreview&Rechercher: &Search for:Preview„Impossible de traduire le document en représentation interne pour 0Can't turn doc into internal representation for PreviewAnnulerCancelPreviewXImpossible de créer un répertoire temporaire#Cannot create temporary directory: PreviewEffacerClearPreviewFermer l'onglet Close TabPreviewTCréation du texte pour la prévisualisationCreating preview textPreview>Erreur de chargement du fichierError while loading filePreviewTChargement du texte de la prévisualisation Loading preview text into editorPreview&Respecter la &casse Match &CasePreviewNProgrammes filtres externes manquants: Missing helper program: Preview CopierCopyPreviewTextEdit$Replier les lignes Fold linesPreviewTextEdit.Préserver l'indentationPreserve indentationPreviewTextEditImprimerPrintPreviewTextEditNImprimer la fenêtre de prévisualisationPrint Current PreviewPreviewTextEdit.Sauvegarder le documentSave document to filePreviewTextEdit"Tout sélectionner Select AllPreviewTextEdit>Afficher les valeurs des champs Show fieldsPreviewTextEdit Afficher l'image Show imagePreviewTextEdit4Afficher le corps du texteShow main textPreviewTextEditT<b>Répertoires avec paramètres spécifiquesCustomised subtreesQObject<i>Les paramètres qui suivent sont définis soit globalement, si la sélection dans la liste ci-dessus<br>est vide ou réduite à la ligne vide, soit pour le répertoire sélectionné.<br>Vous pouvez ajouter et enlever des répertoires en cliquant les boutons +/-.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObjectQueue BeagleBeagle web historyQObject8Jeu de caractères par défautDefault character setQObject8Suivre les liens symboliquesFollow symbolic linksQObjectIndexer les fichiers et répertoires pointés par les liens symboliques. Pas fait par défaut pour éviter les indexations multiplesTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject$Paramètres globauxGlobal parametersQObjectBIndexer tous les noms de fichiersIndex all file namesQObject Indexer les noms des fichiers dont le contenu n'est pas identifié ou traité (pas de type mime, ou type non supporté). Vrai par défaut}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject"Paramètres locauxLocal parametersQObjectNoms ignorés Skipped namesQObjectÐLa liste des sous-répertoires de la zone indexée<br>où certains paramètres sont redéfinis. Défaut: vide.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObject Canevas définissant les fichiers ou répertoires qui ne doivent pas etre indexés.LThese are patterns for file or directory names which should not be indexed.QObjectœJeu de caractères utilisé pour lire les fichiers qui ne l'identifient pas de manière interne, par exemple les purs fichiers texte. <br>La valeur par défaut est vide, et le programme utilise l'environnement.ÒThis is the character set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObject<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">L'indexation <span style=" font-weight:600;">Recoll</span> peut être configurer pour s'exécuter en arrière plan, mettant à jour l'index au fur et à mesure que des documents sont modifiés. Vous y gagnez un index toujours à jour, mais des ressources systême (mémoire et processeur) sont consommées en permanence.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>.

Recoll indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.

RTIToolWNÉgalement démarrer le démon maintenant.%Also start indexing daemon right now.RTIToolWpFichier autostart détruit. Arrêter le process en cours ?2Autostart file deleted. Kill current process too ?RTIToolW(Impossible de créer:Can't create: RTIToolWBImpossible d'exécuter recollindexCould not execute recollindexRTIToolW*Effacement du fichier Deleting fileRTIToolWEffacement: Deleting: RTIToolWjDémarrage automatique de l'indexation au fil de l'eau"Real time indexing automatic startRTIToolW2Enlèvement de l'autostartRemoving autostartRTIToolW.Remplacement du fichierReplacing fileRTIToolW Remplacement de: Replacing: RTIToolWhDémarrer le démon d'indexation quand je me connecte..Start indexing daemon with my desktop session.RTIToolWAttentionWarningRTIToolW&(tous les langages)(all languages)RclMain"(pas d'expansion) (no stemming)RclMain$À propos de Recoll About RecollRclMainToutAllRclMainxMauvaise commande pour %1: [%2] Vérifier le fichier mimeconfCBad viewer command line for %1: [%2] Please check the mimeconf fileRclMainBImpossible d'accéder au fichier: Can't access file: RclMain^Impossible de créer la fenêtre de visualisationCan't create preview windowRclMainLImpossible de décomprimer le fichier: Can't uncompress file: RclMain~Impossible de mettre à jour l'index: un indexeur est déjà actif#Can't update index: indexer runningRclMain†Impossible d'extraire le document ou de créer le fichier temporaire0Cannot extract document or create temporary fileRclMainZImpossible d'accéder au document dans la base+Cannot retrieve document info from databaseRclMainFermetureClosingRclMainXDu contenu a été indexé pour ces types MIME:.Content has been indexed for these mime types:RclMainºImpossible d'ouvrir un index externe. Base non ouverte. Verifier la liste des index externes.HCould not open external index. Db not open. Check external indexes list.RclMainBFiltre de catégories de documentsDocument category filterRclMainDHistorique des documents consultésDocument historyRclMainFiniDoneRclMain*Effacement de l'index Erasing indexRclMain ErreurErrorRclMainExécution de: [ Executing: [RclMainApplications externes non trouvees pour indexer vos types de fichiers: SExternal applications/commands needed and not found for indexing your file types: RclMain(Données d'historique History dataRclMain Index pas ouvertIndex not openRclMainšIndex pas à jour pour ce fichier. Risque d'afficher une entrée incorrecte. Cliquer Ok pour mettre à jour l'index pour ce fichier, puis redémarrer la requête quand l'indexation est terminée. Sinon, Annuler.´Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel.RclMainDErreur de la recherche sur l'indexIndex query errorRclMain$Types MIME indexésIndexed MIME TypesRclMain*L'indexation a échouéIndexing failedRclMain*Indexation en cours: Indexing in progress: RclMain.Applications manquantesMissing helper programsRclMainMoniteurMonitorRclMain`Pas de visualiseur configuré pour le type MIME [-No external viewer configured for mime type [RclMain:Pas d'applications manquantesNo helpers found missingRclMain*Aucun résultat trouvéNo results foundRclMainRienNoneRclMainNettoyagePurgeRclMain.Détails de la recherche Query detailsRclMainÎRequête en cours.<br>En raison de restrictions internes, <br>annuler terminera l'exécution du programmeeQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMain2Résultats de la recherche Query resultsRclMainNEffacer l'index et redémarrer de zéro ?(Reset the index and start from scratch ?RclMain4Nombre de résultats (est.)Result count (est.)RclMain,Sauvegarder le fichier Save fileRclMainBase radicauxStemdbRclMain*Arrèter l'&IndexationStop &IndexingRclMain0Le processus d'indexation en cours n'a pas été démarré depuis cette interface. Cliquer Ok pour le tuer quand même, ou Annuler pour le laisser tranquilleyThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMainèLe visualiseur spécifié dans mimeview pour %1: %2 est introuvable. Voulez vous démarrer le dialogue de préférences ?hThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMainBCette recherche n'est plus active"This search is not active any moreRclMainInconnueUnknownRclMain,Mettre à jour l'&Index Update &IndexRclMainMise à jourUpdatingRclMainAttentionWarningRclMainnimpossible de trouver la liste des langages d'expansion#error retrieving stemming languagesRclMain filtréfilteredRclMainmultimédiamediaRclMainmessagemessageRclMain autresotherRclMainprésentation presentationRclMaintriésortedRclMain"feuille de calcul spreadsheetRclMain textetextRclMain&&A propos de Recoll &About Recoll RclMainBase$Recherche &Avancée&Advanced Search RclMainBaseF&Effacer l'historique des documents&Erase document history RclMainBaseH&Effacer l'historique des recherches&Erase search history RclMainBase&Fichier&File RclMainBase&Plein écran &Full Screen RclMainBase &Aide&Help RclMainBase6Configuration d'&Indexation&Indexing configuration RclMainBase,&Planning d'indexation&Indexing schedule RclMainBase&Préférences &Preferences RclMainBase&Recherche&Query configuration RclMainBase*&Reconstruire l'index&Rebuild index RclMainBase6&Afficher les types indexés&Show indexed types RclMainBaseJAfficher les application&s manquantes&Show missing helpers RclMainBase.Paramètres pour le &tri&Sort parameters RclMainBase&Outils&Tools RclMainBase&Manuel &User manual RclMainBase"Recherche AvancéeAdvanced/complex Search RclMainBaseToutAll RclMainBase Ctrl+QCtrl+Q RclMainBase0Historique des documentsDocument History RclMainBase2&Historique des documentsDocument &History RclMainBase&QuitterE&xit RclMainBaseBConfiguration des index e&xternesE&xternal index dialog RclMainBaseIndex externesExternal index dialog RclMainBaseF11F11 RclMainBasePremiere page First page RclMainBasePlein écran Full Screen RclMainBaseJAller a la premiere page de resultatsGo to first page of results RclMainBasePage suivante Next page RclMainBasePage suivanteNext page of results RclMainBase PgDownPgDown RclMainBasePgUpPgUp RclMainBasePage précédente Previous page RclMainBasePage précédentePrevious page of results RclMainBase RecollRecoll RclMainBase$Liste de résultats Result list RclMainBase&Outils de recherche Search tools RclMainBaseShift+PgUp Shift+PgUp RclMainBase<Afficher la requête en détailsShow Query Details RclMainBaseBAfficher les résultats en tableauShow results as table RclMainBasefTrier par date des plus récentes aux plus anciennes#Sort by dates from newest to oldest RclMainBasefTrier par date des plus anciennes aux plus récentes#Sort by dates from oldest to newest RclMainBase,Paramètres pour le triSort parameters RclMainBase.&Exploration de l'indexTerm &explorer RclMainBase<Outil d'exploration de l'indexTerm explorer tool RclMainBase&Indexer Update &index RclMainBasesortByDateAsc sortByDateAsc RclMainBasesortByDateDescsortByDateDesc RclMainBaseExtraitAbstract RecollModel AuteurAuthor RecollModelDateDate RecollModelDate et heure Date and time RecollModelDate document Document date RecollModelTaille document Document size RecollModelDate fichier File date RecollModelNom de fichier File name RecollModelTaille fichier File size RecollModel IpathIpath RecollModelMots clefKeywords RecollModelType MIME MIME type RecollModel MtimeMtime RecollModel6Jeu de caractères d'origineOriginal character set RecollModelPertinenceRelevancy rating RecollModel TitreTitle RecollModelURLURL RecollModel&Ouvrir&OpenResList4&Ouvrir le document parent&Open Parent document/folderResList&Voir contenu&PreviewResList&Sauver sous&Write to FileResList(requête) (show query)ResList8<p><b>Aucun résultat</b><br>

No results found
ResList`<p><i>Orthographes proposés (sans accents): </i>4

Alternate spellings (accents suppressed): ResList2Copier le nom de &FichierCopy &File NameResListCopier l'&Url Copy &URLResListDHistorique des documents consultésDocument historyResListDocuments DocumentsResListDChercher des documents &similairesFind &similar documentsResListSuivantNextResList OuvrirOpenResList PrévisualisationPreviewResListBPrévisualiser le document p&arentPreview P&arent document/folderResListPrécédentPreviousResList$Liste de résultats Result listResList*Document inaccessibleUnavailable documentResListpourforResListparmi au moinsout of at leastResList&&Enlever la colonne&Delete columnResTable&Ouvrir&OpenResTable4&Ouvrir le document parent&Open Parent document/folderResTable&Voir contenu&PreviewResTable<&Revenir au tri par pertinence &Reset sortResTable&&Sauvegarder en CSV &Save as CSVResTable&Sauver sous&Write to FileResTable0Ajouter une colonne "%1"Add "%1" columnResTablePImpossible d'ouvrir ou créer le fichier:Can't open/create file: ResTable2Copier le nom de &FichierCopy &File NameResTableCopier l'&Url Copy &URLResTableDChercher des documents &similairesFind &similar documentsResTableBPrévisualiser le document p&arentPreview P&arent document/folderResTable>Sauvegarder dans un fichier CSVSave table to CSV fileResTable&Ouvrir&OpenResTableDetailArea4&Ouvrir le document parent&Open Parent document/folderResTableDetailArea&Voir contenu&PreviewResTableDetailArea&Sauver sous&Write to FileResTableDetailArea2Copier le nom de &FichierCopy &File NameResTableDetailAreaCopier l'&Url Copy &URLResTableDetailAreaDChercher des documents &similairesFind &similar documentsResTableDetailAreaBPrévisualiser le document p&arentPreview P&arent document/folderResTableDetailAreaTous les termes All termsSSearchCertains termesAny termSSearch(Requête non reconnueBad query stringSSearchComplétions CompletionsSSearchlEntrer un nom de fichier (caractères jokers possibles)$Enter file name wildcard expression.SSearchlEntrer une expression du langage de recherche. Antisèche:<br> <i>term1 term2</i> : 'term1' ET 'term2' champ non spécifié.<br> <i>field:term1</i> : 'term1' recherche dans le champ 'field'.<br> Noms de champs standards (utiliser les mots anglais)/alias:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-champs: dir, mime/format, type/rclcat, date.<br> Examples d'intervalles de dates: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> NE PAS mettre les parenthèses.<br> <i>"term1 term2"</i> : phrase exacte. Options::<br> <i>"term1 term2"p</i> : proximité (pas d'ordre).<br> Utiliser le lien <b>Afficher la requête en détail</b> en cas de doute sur les résultats et consulter le manuel (en anglais) (&lt;F1>) pour plus de détails. éEnter query language expression. Cheat sheet:
term1 term2 : 'term1' and 'term2' in any field.
field:term1 : 'term1' in field 'field'.
Standard field names/synonyms:
title/subject/caption, author/from, recipient/to, filename, ext.
Pseudo-fields: dir, mime/format, type/rclcat, date.
Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
term1 term2 OR term3 : term1 AND (term2 OR term3).
No actual parentheses allowed.
"term1 term2" : phrase (must occur exactly). Possible modifiers:
"term1 term2"p : unordered proximity search with default distance.
Use Show Query link when in doubt about result and see manual (<F1>) for more detail. SSearchÐEntrer les termes recherchés ici. Taper ESC SPC pour afficher les mots commençant par l'entrée en cours.FEnter search terms here. Type ESC SPC for completions of current term.SSearchNom de fichier File nameSSearch4Plus de mémoire disponible Out of memorySSearch0Language d'interrogationQuery languageSSearch0Sélectionner un élément:Select an item:SSearch:Trop de complétions possiblesToo many completionsSSearch:Choisir le type de recherche.Choose search type. SSearchBaseEffacerClear SSearchBase Ctrl+SCtrl+S SSearchBaseÐEntrer les termes recherchés ici. Taper ESC SPC pour afficher les mots commençant par l'entrée en cours.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase Effacer l'entréeErase search entry SSearchBaseSSearchBase SSearchBase SSearchBaseRechercherSearch SSearchBase*Démarrer la recherche Start query SSearchBaseToutAll SearchClauseWCertainsAny SearchClauseWNom de fichier File name SearchClauseWSans champNo field SearchClauseWRienNone SearchClauseWœNombre de mots additionnels qui peuvent se trouver entre les termes recherchésHNumber of additional words that may be interspersed with the chosen ones SearchClauseW PhrasePhrase SearchClauseWProximité Proximity SearchClauseWrSélectionner le type de requête à effectuer avec les mots>Select the type of query that will be performed with the words SearchClauseW&Fermer&Close SpellBase&Dérivés&Expand  SpellBase Alt+FAlt+C SpellBase Alt+DAlt+E SpellBase<Pas d'information sur la base. No db info. SpellBase&Explorateur d'index Term Explorer SpellBaseErreur aspell.Aspell expansion error. SpellW€Erreur d'initialisation aspell. Il n'est peut-être pas installé?)Aspell init failed. Aspell not installed?SpellWDoc. / Tot. Doc. / Tot.SpellWZIndex: %1 documents, taille moyenne %2 termes,Index: %1 documents, average length %2 termsSpellW Pas de résultatsNo expansion foundSpellW(Expression régulièreRegexpSpellW,Orthographe/PhonétiqueSpelling/PhoneticSpellW,Expansion grammaticaleStem expansionSpellW TermeTermSpellWWildcards WildcardsSpellWlImpossible de former la liste des langages d'expansion#error retrieving stemming languagesSpellWChoisirChoose UIPrefsDialog°Sélectionner un répertoire contenant un index Xapian (ex: /home/monAmi/.recoll/xapiandb)@Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) UIPrefsDialogxLe répertoire sélectionné ne semble pas être un index Xapian;The selected directory does not appear to be a Xapian index UIPrefsDialog`Le répertoire sélectionné est déjà dans la liste3The selected directory is already in the index list UIPrefsDialog2C'est l'index principal !This is the main/local index! UIPrefsDialogŽImpossible de former la liste des langues pour l'expansion grammaticale#error retrieving stemming languages UIPrefsDialogvChangement d'actions avec des valeurs actuelles differentes.Changing actions with different current values ViewActionCommandeCommand ViewActionType MIME MIME type ViewActionChanger Change ActionViewActionBase FermerCloseViewActionBase:Applications de visualisationNative ViewersViewActionBaseòSélectionner une ou plusieurs types de fichiers, puis cliquer Changer pour modifier le programme utiliser pour les ouvrirbSelect one or several file types, then click Change Action to modify the program used to open themViewActionBase²Sélectionner un ou plusieurs types MIME puis cliquer "Modifier l'Action"<br>Vous pouvez aussi fermer ce dialogue et choisir "Utiliser les préférences du bureau"<br> dans le dialogue principal pour ignorer cette liste.ÉSelect one or several mime types then click "Change Action"
You can also close this dialog and check "Use desktop preferences"
in the main panel to ignore this list and use your desktop defaults.ViewActionBasepBeagle NE DOIT PAS être actif. Permet de traiter la queue de Beagle pour indexer l'historique des pages visitées de Firefox.<br> (Il faut aussi installer le plugin Beagle pour Firefox)”Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.
(you should also install the Firefox Beagle plugin)confgui::ConfBeaglePanelW€Les pages seront écrasées quand la taille spécifiée est atteinte1Entries will be recycled once the size is reachedconfgui::ConfBeaglePanelWBTaill max. pour le cache Web (MB) Max. size for the web store (MB)confgui::ConfBeaglePanelWJVoler la queue d'indexation de BeagleSteal Beagle indexing queueconfgui::ConfBeaglePanelWþLe nom d'un répertoire où stocker les copies des pages visitées.<br>Un chemin relatif se réfère au répertoire de configuration.‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWÿÿÿÿWeb page store directory nameconfgui::ConfBeaglePanelW^Impossible d'ecrire le fichier de configurationCan't write configuration fileconfgui::ConfIndexWChoisirChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWÌUn filtre externe sera interrompu si l'attente dépasse ce temps. Utile dans le cas rare (programme postscript par exemple) où un document pourrait forcer un filtre à boucler indéfiniment. Positionner à -1 pour supprimer la limite.«External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. confgui::ConfSubPanelW GlobalGlobalconfgui::ConfSubPanelWÂSi cette valeur est spécifiée et positive, les fichiers texte seront découpés en tranches de cette taille pour l'indexation. Ceci diminue les ressources consommées par l'indexation et aide le chargement pour prévisualisation.¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWfTaill maximale pour les fichiers à décomprimer (Ko)Max. compressed file size (KB)confgui::ConfSubPanelWXTemps d'exécution maximum pour un filtre (S)Max. filter exec. time (S)confgui::ConfSubPanelWLTaille maximum d'un fichier texte (MB)Max. text file size (MB)confgui::ConfSubPanelW\Taille de découpe pour les fichiers texte (KB)Text file page size (KB)confgui::ConfSubPanelW^Cette valeur définit un seuil au delà duquel les fichiers comprimés ne seront pas traités. Utiliser -1 pour désactiver la limitation, 0 pour ne traiter aucun fichier comprimé.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelW\Cette valeur est un seuil au delà duquel les fichiers texte ne seront pas indexés. Spécifier -1 pour supprimer la limite. Utilisé pour éviter d'indexer des fichiers monstres.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelW$Langue pour aspellAspell languageconfgui::ConfTopPanelWBRépertoire de stockage de l'indexDatabase directory nameconfgui::ConfTopPanelW Désactiver l'utilisation d'aspell pour générer les approximations orthographiques.<br> Utile si aspell n'est pas installé ou ne fonctionne pas. †Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelW\Intervalle d'écriture de l'index en mégaoctetsIndex flush megabytes intervalconfgui::ConfTopPanelW,Nom du fichier journal Log file nameconfgui::ConfTopPanelW&Niveau de verbositéLog verbosity levelconfgui::ConfTopPanelW:Occupation disque maximum (%)Max disk occupation (%)confgui::ConfTopPanelW4Pas d'utilisation d'aspellNo aspell usageconfgui::ConfTopPanelWChemins ignorés Skipped pathsconfgui::ConfTopPanelWDLangue pour l'expansion des termesStemming languagesconfgui::ConfTopPanelW¬Le nom du fichier ou les messages seront ecrits.<br>Utiliser 'stderr' pour le terminalPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWÀLangue du dictionnaire aspell. Une valeur correcte ressemble à 'en' ou 'fr'... <br>Si cette valeur n'est pas positionnée, l'environnement est utilisé pour la calculer, ce qui marche bien, habituellement. Utiliser 'aspell config' et regarder les fichiers .dat dans le répertoire 'data-dir' pour connaitre les langues aspell installées sur votre système.2The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW´Les langages pour lesquels les dictionnaires d'expansion<br>des termes seront construits.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelWÂLa liste des répertoires où l'indexation récursive démarre. Défault: votre répertoire par défaut.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelW Le nom d'un répertoire où l'index sera stocké<br>Un chemin relatif démarrera au répertoire de configuration. Le défaut est 'xapiandb'.–The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelW¶Ce sont des noms de répertoires où l'indexation n'entrera pas.<br>Ils peuvent contenir des caractères jokers. Les chemins doivent correspondre à ceux vus par l'indexeur (par exemple: si un des répertoires de départ est '/home/me' et que '/home' est un lien sur '/usr/home', une entrée correcte ici serait '/home/me/tmp*' , pas '/usr/home/me/tmp*')#These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelWNiveau d'occupation du disque ou l'indexation s'arrete (pour eviter un remplissage excessif).<br>0 signifie pas de limite (defaut).—This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).
0 means no limit (this is the default).confgui::ConfTopPanelWòAjuste la quantité de données lues entre les écritures sur disque.<br>Contrôle l'utilisation de la mémoire. Défaut 10 Mo ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWðCette valeur ajuste la quantite de messages emis,<br>depuis uniquement les erreurs jusqu'a beaucoup de donnees de debug.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW*Répertoires de départTop directoriesconfgui::ConfTopPanelWLUtiliser la commande 'file' du systemeUse system's 'file' commandconfgui::ConfTopPanelWÄUtiliser la commande 'file' si la determination<br>interne du type mime n'obtient pas de resultat.NUse the system's 'file' command if internal
mime type identification fails.confgui::ConfTopPanelW&Annuler&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBaseÊUne recherche pour [vin rouge] (2 mots) sera complétée comme [vin OU rouge OU (vin PHRASE 2 rouge)].<br> Ceci devrait donner une meilleure pertinence aux résultats où les termes recherchés apparaissent exactement et dans l'ordre.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBase(Separateur d'extraitAbstract snippet separatoruiPrefsDialogBaseTout activer Activate AlluiPrefsDialogBase Ajouter un index Add indexuiPrefsDialogBase6Appliquer les modifications Apply changesuiPrefsDialogBaseŠDémarrer automatiquement une recherche simple sur entrée d'un espace.-Auto-start simple search on whitespace entry.uiPrefsDialogBaserAjouter automatiquement une phrase aux recherches simples+Automatically add phrase to simple searchesuiPrefsDialogBase¦Seuil de fréquence de terme (pourcentage) pour la génération automatique de phrases.Autophrase term frequency threshold percentageuiPrefsDialogBaseChoisirChooseuiPrefsDialogBasetChoisir les éditeurs pour les différents types de fichiersChoose editor applicationsuiPrefsDialogBase\Cliquer pour ajouter un autre index à la liste0Click to add another index directory to the listuiPrefsDialogBase8Format de date (strftime(3))Date format (strftime(3))uiPrefsDialogBaseTout désactiverDeactivate AlluiPrefsDialogBase8Abandonner les modificationsDiscard changesuiPrefsDialogBaseîAfficher le filtre de catégorie comme une barre d'outils plutot que comme un panneau de boutons (après le redémarrage).KDisplay category filter as toolbar instead of button panel (needs restart).uiPrefsDialogBase¼Est-ce qu'un résumé doit etre synthétisé meme dans le cas ou le document original en avait un?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseDécide si des résumés seront construits à partir du contexte des termes de recherche. Peut ralentir l'affichage si les documents sont gros.zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBaseHConstruire dynamiquement les résumésDynamically build abstractsuiPrefsDialogBase`Editer le fragment à insérer dans l'en-tête HTML#Edit result page html header insertuiPrefsDialogBaseTEditer le format du paragraphe de résultat#Edit result paragraph format stringuiPrefsDialogBaseActiverEnableuiPrefsDialogBaseIndex externesExternal IndexesuiPrefsDialogBaseŠSeuil de fréquence (pourcentage) au delà duquel les termes ne seront pas utilisés. Les phrases contenant des termes trop fréquents posent des problèmes de performance. Les termes ignorés augmentent la distance de phrase, et réduisent l'efficacité de la fonction de recherche de phrase automatique. La valeur par défaut est 2%þFrequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). uiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBase(Cacher les doublons.Hide duplicate results.uiPrefsDialogBase^Couleur de mise en relief des termes recherchésHighlight color for query termsuiPrefsDialogBase‚N'afficher qu'une entrée pour les résultats de contenu identique.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBaseÆLes lignes dans des sections PRE ne sont pas justifiées. Using BR perd une partie de l'indentation.BLines in PRE text are not folded. Using BR loses some indentation.uiPrefsDialogBase~Taille maximum des textes surlignés avant prévisualisation (MO)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBase8Nombre de résultats par page"Number of entries in a result pageuiPrefsDialogBase`Ouvre une fenêtre permettant de changer la fonte-Opens a dialog to select the result list fontuiPrefsDialogBasetOuvre un dialogue pour choisir un fichier feuille de style-Opens a dialog to select the style sheet fileuiPrefsDialogBasebUtiliser le format Html pour la previsualisation.&Prefer Html to plain text for preview.uiPrefsDialogBaselSuffixes automatiques pour le langage d'interrogation.(Query language magic file name suffixes.uiPrefsDialogBaseJMemoriser l'etat d'activation du tri.Remember sort activation state.uiPrefsDialogBaselOter de la liste. Sans effet sur les données stockées.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase(Effacer la sélectionRemove selecteduiPrefsDialogBasebRemplacer les résumés existant dans les documents Replace abstracts from documentsuiPrefsDialogBaseRéinitialiserResetuiPrefsDialogBaseZRéinitialiser la fonte à la valeur par défaut1Resets the result list font to the system defaultuiPrefsDialogBasejRestore la valeur par défaut pour la feuille de style!Resets the style sheet to defaultuiPrefsDialogBase$Liste de résultats Result ListuiPrefsDialogBase@Fonte pour la liste de résultatsResult list fontuiPrefsDialogBase8Paramètres pour la rechercheSearch parametersuiPrefsDialogBasebPanneau de recherche avancée ouvert au démarrage.'Start with advanced search dialog open.uiPrefsDialogBaseDLangue pour l'expansion des termesStemming languageuiPrefsDialogBase Feuille de style Style sheetuiPrefsDialogBase‚Nombre de mots de contexte par occurrence de terme dans le résumé Synthetic abstract context wordsuiPrefsDialogBaseRTaille du résumé synthétique (caractères)$Synthetic abstract size (characters)uiPrefsDialogBase¢Les texte plus gros ne seront pas surlignés dans la prévisualisation (trop lent).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBaseèLes mots de la liste seront automatiquement changés en clauses ext:xxx dans les requêtes en langage d'interrogation.bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBaseZChanger l'état pour les entrées sélectionnéesToggle selecteduiPrefsDialogBaseØUtiliser des tags <PRE> au lieu de <BR> pour affichier du texte non formaté en html dans la prévisualisationGUse

 tags instead of 
to display plain text as html in preview.uiPrefsDialogBase˜Utiliser les réglages du bureau pour choisir l'application de visualisation.2Use desktop preferences to choose document editor.uiPrefsDialogBase*Interface utilisateurUser interfaceuiPrefsDialogBase.Préférences utilisateurUser preferencesuiPrefsDialogBaseˆrecoll-1.17.3/qtgui/i18n/recoll_it.qm000644 001750 000000 00000101114 11757435371 017722 0ustar00dockeswheel000000 000000 <¸dÊÍ!¿`¡½ÝBX+JÙ-K+;emb2逸.ÙLô1Ú¬BEîu‡$—6R'Hä3*Ð%%î*ì0&+Lô 31ø RG…ÔrÓGß)ÓH6ó>êH6õ?J+‚ ÛJ+‚9¾J6•]J6•HWÈÕ!´XÉÄs¾e® Esºñ‘sºñ$\v8“",v®Âv®Â$•zϳ¾€€£j¨0œMwÍE¨Ðùƒ#»ÐùƒB„ÐùƒF#Eµ"Ë&`Žcž0,…M>.cßXM¹nÿ‘vãhm•ñ“œW­H¤£cê*ÎxC/Þñƒó LðþSI8NÿµKÌ çO#¸ÎVÕp#‰vå!ãw 5/w 58w 5€»f3'Áͼuoæê•Ê8ùì;U¨úU ¯úeî  ¬z#&ÁmÚ.‡N›7Î]?úd,¨?úd2FJUY \JUY0æY ô@Æz ÓFöº™w?ÝôLjRã¿?ŸìxLNþA¢-ÊLƒH5€ã‡˜I¼ «™n•SštµDŸf•J©«(É«9óÚ#ncãX|K3 -Z<zÏ@-¼.)ÖTsýBìS=žr?)/xržŸ‹¦,,v‹ÜðA#ŒÇ<'û›ˆ˜;ð¦AS»ªÃ¢"ƒ·¨ 6»œR?DÇ¢•0PÇ¢•3˜Ç¢•4ÕØ~CÝðŒµv2`³," < UKôtªp hh —B šKTœ¦ %G¦öõo¶72“ÊXÔÕþauCi—FW#<¤F¯NküŒÍw/@ŒÍw3_ŒÍw4’n/Ú“’žh²ð 0©²ð 3ò²ð 59´ù€P§Ɇtxê áùC2QçÇL}}í”ò“vŸœ .D¨0ÎU®Ä;¯Ìí³ jͳ2ÝÜbºäœcqö¨åN}ú Ãz{ ´H% 9Zy;M K¨ó+{ ®œ¯jÿ ü>qY äîŸ ÜcŒ ).~&N +<”O˜ 6  ) `P!N `ç£ c·E*q y N ˜IœdÇ ²ëC1y ²ëC40 ²ëC5 Äã1B âæç* åKÄc ®(û ®ù)x THÁ ŽÚ ¥ h¹° Û tÓ9XÜ ¨Î£*³ »ïµj Û·å+Í 'И(E 97Ãt PÖ™R RVŽ#K T#Z VüN× \iCs. `F¥ ©zóÌ Ú÷A¾ ÝøìgÐ ö†À>² zs/ 8þe3 FÁ! y·Dû ‚±3Ò ‡u8— ‰P ‰P#„ 5dpj ’ãnG· ÕHã û£Al€nµ/¸.<ÞwË=Â&ÁG7Ò ¼J› ¸XPÎyEbÙ%mpún'zc5í‚3.6ó‚3.:%“ÝèD(›P¾ ЦÀè.Œ¶éMíɾ Ë“O1;JQá~rY~s'e[žs-Eg3+4Õ _~ ‚´†µ“Ã9LÂ|“u âî£,ñó l$Àü©Üëü¶L/izÓTutti i termini All clauses AdvSearch"Qualsiasi termine Any clause AdvSearchmultimedialimedia AdvSearchmessaggimessages AdvSearch altriother AdvSearchpresentazioni presentations AdvSearch fogli di calcolo spreadsheets AdvSearch testitexts AdvSearch<----- Tutti <----- All AdvSearchBase<----- Sel <----- Sel AdvSearchBase&Aggiungi condizione Add clause AdvSearchBase Ricerca avanzataAdvanced search AdvSearchBaseTutti ----> All ----> AdvSearchBaseEsploraBrowse AdvSearchBasePer categorie By categories AdvSearchBaselContrassegna per abilitare la ricerca sul tipo di file,Check this to enable filtering on file types AdvSearchBasetContrassegna per usare le categorie al posto dei tipi mime;Check this to use file categories instead of raw mime types AdvSearchBase ChiudiClose AdvSearchBase$Elimina condizione Delete clause AdvSearchBaseNScrivi la directory base per la ricercaEnter top directory for search AdvSearchBase8Ignora i file di questo tipoIgnored file types AdvSearchBase*Limita i tipi di fileRestrict file types AdvSearchBaseRLimita i risultati alla sotto-directory: %Restrict results to files in subtree: AdvSearchBase$Salva come defaultSave as default AdvSearchBaseHCerca i documenti<br>che contengono:'Search for
documents
satisfying: AdvSearchBase"Ricerca tipo fileSearched file types AdvSearchBaseSel -----> Sel -----> AdvSearchBase Cerca Start Search AdvSearchBasepNessuna directory per il DB di base nella configurazione No db directory in configurationMain&Successivo&NextPreview&Precedente &PreviousPreview&Cerca: &Search for:Preview„Impossibile tradurre il documento per la rappresentazione interna 0Can't turn doc into internal representation for PreviewAnnullaCancelPreviewCancellaClearPreviewChiudi Tab Close TabPreviewFCreazione del testo per l'anteprimaCreating preview textPreviewVCaricamento anteprima del testo nell'editor Loading preview text into editorPreview:Rispetta &Maiuscole/minuscole Match &CasePreviewLManca il programma di filtro esterno: Missing helper program: Preview><b>Ramificazioni personalizzateCustomised subtreesQObjectè<i>I parametri che seguono sono postii al livello superiore, se niente <br> o una linea vuota è selezionata nella casella sovrastante, oppure al livello della cartella selezionata.<br> Puoi aggiungere/rimuovere cartelle cliccando i bottoni +/-.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject6Set di caratteri di defaultDefault character setQObject.Segue il link simbolicoFollow symbolic linksQObjectÔSegue il link simbolico durante l'indicizzazione. Di default è no, per evitare la duplicazione dell'indiceTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject"Parametri globaliGlobal parametersQObject@Indicizza tutti i nomi dei filesIndex all file namesQObject&Indicizza il nome di quei files il cui contenuto non può essere identificato o processato (tipo mime non supportato). Di default è impostato a vero}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject Parametri localiLocal parametersQObjectNomi saltati Skipped namesQObjectöLista delle sottocartelle nella gerarchia indicizzata<br>ove alcuni parametri devono essere ridefiniti. Predefinita: vuota.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObject¼Questi sono modelli per i nomi delle cartelle e/o dei files che non devono vebire indicizzati.LThese are patterns for file or directory names which should not be indexed.QObjectèQuesta è la codifica caratteri usata per leggere i file che non contengono indicazioni interne sulla codifica usata, ad esempio file di testo semplice.<br>Il valore predefinito è vuoto, in modo che venga usata l'impostazione locale del sistema.ÒThis is the character set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObjectAttenzioneWarningRTIToolW"(tutte le lingue)(all languages)RclMain((nessuna espansione) (no stemming)RclMain,Informazioni su Recoll About RecollRclMain|Errata linea di comando per %1: [%2] Verifica il file mimeconfCBad viewer command line for %1: [%2] Please check the mimeconf fileRclMainRNon posso creare la finestra di anteprimaCan't create preview windowRclMainvNon posso estrarre il documento o creare il file temporaneo0Cannot extract document or create temporary fileRclMainxImpossibile caricare informazioni del documento dal database+Cannot retrieve document info from databaseRclMainChiusuraClosingRclMain0Cronologia dei documentiDocument historyRclMain Esecuzione di: [ Executing: [RclMain&Cronologia dei dati History dataRclMain4Indicizzazione in corso: Indexing in progress: RclMainPuliscoPurgeRclMain Dettagli ricerca Query detailsRclMain.Risultati della ricerca Query resultsRclMain&Database espansioniStemdbRclMainBQuesta ricerca non e' piu' attiva"This search is not active any moreRclMainSconosciutoUnknownRclMainAttenzioneWarningRclMainberrore nel recupero delle lingue per l'espansione#error retrieving stemming languagesRclMainmultimedialimediaRclMain altriotherRclMain.&Informazioni su Recoll &About Recoll RclMainBase"Ricerca &Avanzata&Advanced Search RclMainBaseJ&Cancella la cronologia dei documenti&Erase document history RclMainBase &File&File RclMainBase &Aiuto&Help RclMainBase<Conf&igurazione indicizzazione&Indexing configuration RclMainBase&Preferenze &Preferences RclMainBase.&Configurazione ricerca&Query configuration RclMainBase,&Parametri ordinamento&Sort parameters RclMainBase&Strumenti&Tools RclMainBase&Manuale utente &User manual RclMainBaseLMostra la finestra di Ricerca avanzataAdvanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBaseLVisualizza la cronologia dei documentiDocument History RclMainBase*C&ronologia documentiDocument &History RclMainBase &EsciE&xit RclMainBase:Configurazione indici esterniExternal index dialog RclMainBasePrima pagina First page RclMainBaseFVai alla prima pagina dei risultatiGo to first page of results RclMainBasePagina seguente Next page RclMainBasePagina seguenteNext page of results RclMainBase"Pagina precedente Previous page RclMainBase"Pagina precedentePrevious page of results RclMainBase RecollRecoll RclMainBaseLista risultati Result list RclMainBase(Strumenti di ricerca Search tools RclMainBaseVConfigurazione dei parametri di ordinamentoSort parameters RclMainBase"&Esplora l'indiceTerm &explorer RclMainBase@Strumento di esplorazione indiceTerm explorer tool RclMainBase Aggiorna &indice Update &index RclMainBaseDataDate RecollModelNome file File name RecollModel&Anteprima&PreviewResList: (mostra dettagli di ricerca) (show query)ResList<<p><b>Nessun risultato</b><br>

No results found
ResList.Copia il nome del &FileCopy &File NameResListCopia l'&Url Copy &URLResList0Cronologia dei documentiDocument historyResListRisultati DocumentsResList.Trova documenti &similiFind &similar documentsResListSuccessivoNextResListPrecedentePreviousResList&Lista dei risultati Result listResList,Documento inaccessibleUnavailable documentResListperforResList totale di almenoout of at leastResList&Anteprima&PreviewResTable.Copia il nome del &FileCopy &File NameResTableCopia l'&Url Copy &URLResTable.Trova documenti &similiFind &similar documentsResTable&Anteprima&PreviewResTableDetailArea.Copia il nome del &FileCopy &File NameResTableDetailAreaCopia l'&Url Copy &URLResTableDetailArea.Trova documenti &similiFind &similar documentsResTableDetailArea Tutti All termsSSearchQualsiasiAny termSSearch:Stringa di ricerca malformataBad query stringSSearchEspansione CompletionsSSearchÂInserisci qui i termini di ricerca. Premi ESC Spazio per il completamento automatico dei termini.FEnter search terms here. Type ESC SPC for completions of current term.SSearchNome file File nameSSearch Memoria esaurita Out of memorySSearch8Linguaggio di interrogazioneQuery languageSSearch(Seleziona una voce: Select an item:SSearchBTroppe possibilita' di espansioneToo many completionsSSearchCancellaClear SSearchBase Ctrl+SCtrl+S SSearchBaseÂInserisci qui i termini di ricerca. Premi ESC Spazio per il completamento automatico dei termini.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase0Cancella voce di ricercaErase search entry SSearchBaseSSearchBase SSearchBase SSearchBase CercaSearch SSearchBaseInizia ricerca Start query SSearchBaseNome file File name SearchClauseWNumero di parole che possono frapporsi tra i termini di ricerca indicatiHNumber of additional words that may be interspersed with the chosen ones SearchClauseW‚Seleziona il tipo di ricerca da effettuare con i termini indicati>Select the type of query that will be performed with the words SearchClauseW&Chiudi&Close SpellBase&Espandi &Expand  SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBase0Esplorazione dei termini Term Explorer SpellBase@Errore di espansione di Aspell. Aspell expansion error. SpellWpErrore di inizializzazione aspell. Aspell e' installato?)Aspell init failed. Aspell not installed?SpellW0Nessun epansione trovataNo expansion foundSpellW(Espressione regolareRegexpSpellW&Ortografia/FoneticaSpelling/PhoneticSpellW.Espansione grammaticaleStem expansionSpellWTermineTermSpellWCaratteri jolly WildcardsSpellWpImpossibile formare la lista di espansione per la lingua#error retrieving stemming languagesSpellW”Seleziona la directory indice Xapian (es.: /home/ciccio/.recoll/xapiandb)@Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) UIPrefsDialogvLa directory selezionata non sembra essera un indice Xapian;The selected directory does not appear to be a Xapian index UIPrefsDialogXLa directory selezionata e' gia' nella lista3The selected directory is already in the index list UIPrefsDialog<Questo e' l'indice principale!This is the main/local index! UIPrefsDialogŽImpossibile formare la lista delle lingue per l'espansione grammaticale#error retrieving stemming languages UIPrefsDialogtModifica di azioni con valori differenti da quelli attuali.Changing actions with different current values ViewActionCambia Azione Change ActionViewActionBase ChiudiCloseViewActionBase>Applicazione di visualizzazioneNative ViewersViewActionBaseÞSeleziona uno o piu' tipi di file e poi clicca su 'Cambia Azione' per modificare il programma usato per aprirlibSelect one or several file types, then click Change Action to modify the program used to open themViewActionBase\Impossibile scrivere il file di configurazioneCan't write configuration fileconfgui::ConfIndexWÿÿÿÿChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWGlobaleGlobalconfgui::ConfSubPanelW Lingua di aspellAspell languageconfgui::ConfTopPanelW@Nome della cartella del databaseDatabase directory nameconfgui::ConfTopPanelW€Intervallo in megabite per il salvataggio intermedio dell'indiceIndex flush megabytes intervalconfgui::ConfTopPanelW(Nome del file di log Log file nameconfgui::ConfTopPanelW8Livello di verbosità del logLog verbosity levelconfgui::ConfTopPanelWNMassima occupazione del disco fisso (%)Max disk occupation (%)confgui::ConfTopPanelW Non usare aspellNo aspell usageconfgui::ConfTopPanelW"Indirizzi saltati Skipped pathsconfgui::ConfTopPanelW*Lingue per la radice Stemming languagesconfgui::ConfTopPanelW”Il file dove verranno scritti i messaggi.<br>Usa 'stderr' per il terminalePThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelW˜Lingua per il dizionario aspell. Dovrebbe essere simile a 'en' o 'it' ...<br>Se questo valore non è impostato verrà usato l'ambiente NLS per calcolarlo, cosa che generalmente funziona. Per avere un'idea di cosa sia installato sul tuo sistema, dai il comando 'aspell config' e guarda il nome dei files .dat nella cartella 'data-dir'.2The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelWžLingue per le quali verrà costruito<br>il dizionario delle espansioni radicali.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW°Lista delle cartelle in cui inizia lìindicizzazione recorsiva. Di default è la tua home.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWFNome della cartella in cui salvare l'indice<br>Un indirizzo non assoluto viene interpretato come relativo alla cartella di congigurazione. Di default è 'xapiandb'.–The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelWôQuesti sono i nomi delle cartelle in cui l'indicizzazione non entra<br>Possono contenere caratteri speciali. Devono corrispondere agli indirizzi visti dal motore di indicizzazione (ad esempio, se la cartella superiore include '/home/io' e '/home' è in realtà un link a '/usr/home', l'indirizzo corretto che si vuole sltare dovrebbe essere '/home/me/tmp*' e non ì/home/usr/tmp*')#These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelWžQuesta è la percentuale fi occupazione del disco fisso oltre la quale l'indicizzazione si ferma con un errore (per evitare di riempire il disco).<br>0 significa nessun limite (questo è il valore di default).—This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).
0 means no limit (this is the default).confgui::ConfTopPanelW@Questo valore regola il volume di dati da indicizzare tra un salvataggio e l'altro.<br>Aiuta a controllare l'uso della memoria. Di default è post uguale a 10MbŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWÀQuesto valore regola il numero dei messaggi,>br>dai soli errori a mole indicazioni per il debug.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW$Cartella superioreTop directoriesconfgui::ConfTopPanelW@Usa il comando di sistema 'file'Use system's 'file' commandconfgui::ConfTopPanelW°Usa il comando di sistema 'file' se fallisce<br>l'identificazione interna del tipo mime.NUse the system's 'file' command if internal
mime type identification fails.confgui::ConfTopPanelW&Annulla&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase¦Una ricerca per [vino rosso] (2 parole) sara' completata come [vino O rosso O (vino FRASE 2 rosso)]. Questo dovrebbe dare la precedenza ai risultati che contengono i termini esattamente come sono stati scritti.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBaseSeleziona tutti Activate AlluiPrefsDialogBaseAggiungi indice Add indexuiPrefsDialogBase"Applica modifiche Apply changesuiPrefsDialogBase‚Inizia automaticamente una ricerca semplice digitando uno spazio.-Auto-start simple search on whitespace entry.uiPrefsDialogBasejAggiungi automaticamente frase alle ricerche semplici+Automatically add phrase to simple searchesuiPrefsDialogBase"Deseleziona tuttiDeactivate AlluiPrefsDialogBase"Annulla modificheDiscard changesuiPrefsDialogBase’Devo sintetizzare un riassunto anche se il documento sembra ne abbia uno?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBase>Devo cercare di costruire i riassunti per le voci nell'elenco dei risultati usando il contesto dei termini di ricerca? Puo' essere lento per grossi documenti..zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBaseHCostruisci dinamicamente i riassuntiDynamically build abstractsuiPrefsDialogBaseIndici esterniExternal IndexesuiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBaseŒDimensione massima del testo da evidenziare nell'anteprima (megabytes)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBase<Numero di risultati per pagina"Number of entries in a result pageuiPrefsDialogBaseœApre una finestra di dialogo per selezionare i fonts della lista dei risultati-Opens a dialog to select the result list fontuiPrefsDialogBasedRicorda lo stato dell'impostazione di ordinamento.Remember sort activation state.uiPrefsDialogBasetRimuovi dalla lista. Non ha effetto sull'indice del disco.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase&Rimuovi selezionatiRemove selecteduiPrefsDialogBaseJSostituisci i riassunti dei documenti Replace abstracts from documentsuiPrefsDialogBaseRipristinaResetuiPrefsDialogBaseVRipristina i font della lista dei risultati1Resets the result list font to the system defaultuiPrefsDialogBase@Fonts per la lista dei risultatiResult list fontuiPrefsDialogBase0Parametri per la ricercaSearch parametersuiPrefsDialogBase^Inizia aprendo la finestra di ricerca avanzata.'Start with advanced search dialog open.uiPrefsDialogBase6Linguaggio per l'espansioneStemming languageuiPrefsDialogBaseZNumero di parole di contesto per il riassunto Synthetic abstract context wordsuiPrefsDialogBaseBNumero caratteri per il riassunto$Synthetic abstract size (characters)uiPrefsDialogBase¶Testi di lunghezza superiore a questa non vengono evidenziati nella preview (troppo lento).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase&Commuta selezionatiToggle selecteduiPrefsDialogBase†Usa le preferenze del desktop per scegliere l'editor dei documenti.2Use desktop preferences to choose document editor.uiPrefsDialogBase$Interfaccia utenteUser interfaceuiPrefsDialogBase"Preferenze utenteUser preferencesuiPrefsDialogBaseˆrecoll-1.17.3/qtgui/i18n/recoll_lt.qm000644 001750 000000 00000124170 11757435371 017734 0ustar00dockeswheel000000 000000 <¸dÊÍ!¿`¡½ÝB +_ê-`+;…áH, H,2H,Kµ¨¥8QLô<Ìf¾<ö¬Q*¬ô-ÄEîš$—E‹'Hä>Ý*Ð%.ú*ì0/)+Lô 51ø \:Îd,JG…Ô—=Gß3H6óNKH6õNxJ+‚µJ+‚IJ6•eJ6•VèWTÝWÈÕ'÷XÉĘ0e®-sºñ‰sºñ,‚v8“(sv®Âêv®Â,äzϳœ€€£‹ã0œoÍTÛÐùƒ+ÅÐùƒQ›ÐùƒURãngZEµ*˜&`Ž„Ÿ0,…n¸>.cXM¹“!`Þ^:œh0^•nÚÞ‘v㉕ñ“¯œW­W‰¢‰fT£cê 2ÎxC@Þñƒµó LßþSIGsÿµk¼ çh#¸ÎxXp#vå((w 58}w 5G6w 5K•#EïŒUkj©Ö³Qeª6•MÝ»f312ͼu“òÐgž- Ø.^Xòê•ÊHì;U!¾úUoúeî  ¬žy ‹NŒB&Á¸.‡NP7Î}ù?úd6.?úd>6JUY#èJUY;ÜY ôPz ÓUݺ™›…Ê—¥,­Ôä^×ÝôL‹ã¿OìxnþA¢7"çÞH·LƒW €ã‡!C˜I¼ƒ™n•Wštµ DŸf•RŸf•_¬Ÿf•ŠÓ«2?«ISÚ#3ãX|b -Z >zÏOk-¼7ˆ)ÖT˜B9€l@BìSMr?)9Úržœ„kå9’„kå?ì„kåBÅ‹¦,5ü‹ÜðPlŒÇ<1j›ˆ˜K6¦AS Ūâ(Ä·¨ E7»œRN¥Ç¢•;DÇ¢•@5Ç¢•CØ~C ãðŒµš `³5Š" Kj:ª]äUKô™Dp hˆÇ–T#•—BæšKv9¦ %C¦öõO¶7>ÄÖ[&ˆÊXÔ ÏþüCŠ8FW#L%F¯NŽH:"8¾H:"?H:"AÛŒÍw9\ŒÍw?µŒÍwB„ŒÏ—=(n:$“’ž‰q¦š´-O²ð ;›²ð @²ð Cz´ù€rÞÓt-…Ɇt: áùRU:uî•QçÇ]oz`D}}ú”ò“šóœ .…¨0Îw#ÄJõÌí³ hͳ=þÝ܃_äœc ‡ö¨åpú ÃžÏ ´H.7 9ZyJ• K¨ó4à ]#—'e cÄI[Ê ŸÁò=[ ŸÁòA7 ŸÁòD8 ­îiX ®œ¯; ²9e4 ü>•¿ äî ÜcŠ ).~/^ +<”q« 6 #I `P%Ó `ç£ c·E3³ y" ˜Iœ…¢ ¤žbÑ ²ëC All ----> AdvSearchBaseüVisi kairje esantys netuati laukai bus sujungiami AND (visi) arba OR (bet kuris) pagalba. <br> "Bet kuris" "Visi" ir "Nei vienas" lauks tipai gali priimti paprasts ~od~is miain/ ir frazes pa~ymtas dvigubomis kabutmis. <br> Tuati laukeliai ignoruojami.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBaseNaraytiBrowse AdvSearchBase"Pagal kategorijas By categories AdvSearchBase^Pa~ymti, jei norite filtruoti pagal byls tipus,Check this to enable filtering on file types AdvSearchBase~Pa~ymti, jei norite naudoti byls kategorijas vietoje mime tips;Check this to use file categories instead of raw mime types AdvSearchBaseU~darytiClose AdvSearchBaseIatrinti slyg Delete clause AdvSearchBase^.raaykite virautinio lygio direktorij paieakaiEnter top directory for search AdvSearchBase(Ignoruoti byls tipaiIgnored file types AdvSearchBase&Apriboti byls tipusRestrict file types AdvSearchBaseJPateikti rezultatus byloms submedyje:%Restrict results to files in subtree: AdvSearchBase2Iasaugoti kaip numatytj/Save as default AdvSearchBaseJIeakoti <br>dokuments<br>tenkinan is:'Search for
documents
satisfying: AdvSearchBase"Ieakota byls tipsSearched file types AdvSearchBasePas -----> Sel -----> AdvSearchBasePradti paieak Start Search AdvSearchBaseTNustatymuose nerandama duomens bazs bylos No db directory in configurationMain&Sekantis&NextPreview&Ankstesnis &PreviousPreview&Ieakoti: &Search for:PreviewZNepavyksta pervesti dokumento / vidin busen0Can't turn doc into internal representation for PreviewAtaauktiCancelPreviewIavalytiClearPreview"U~darykite ausel Close TabPreview6Kuriamas per~valgos tekstasCreating preview textPreviewR.keliamas / redaktoris per~valgos tekstas Loading preview text into editorPreview&Atitaikyti &Atvej/  Match &CasePreview:Trkksta pagalbins programos:Missing helper program: PreviewSpausdintiPrintPreviewTextEditBSpausdinti kaip matoma per~ikrojePrint Current PreviewPreviewTextEditRodyti laukus Show fieldsPreviewTextEdit0Rodyti pagrindin/ tekstShow main textPreviewTextEditP<b>Pritaikyti direktorijs<br> submed~iaiCustomised subtreesQObject~<i>Nurodyti parametrai taikomi arba visoms direktorijoms, arba subdirektorijoms,<br> jei kuri js priea tai pa~ymimos. Pridti ir iatrinti direktorijs vardus galite<br> spausdami +/- mygtukus.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject,Beagle tinklo istorijaBeagle web historyQObject0Numatytoji simbolis aibDefault character setQObject2Sekti simbolines nuorodasFollow symbolic linksQObjectâIndeksavimo metu sekti simbolines nuorodas. Numatytasis elgesys yra nesekti, bandant iavengti dvigubo indeksavimoTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject&Globalks parametraiGlobal parametersQObject6Indeksuoti viss byls vardusIndex all file namesQObject´Indeksuoti byls, kuris turinio nepavyksta perskaityti, vardus. Numatytoji reikam: teisyb}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject$Lokalks parametraiLocal parametersQObject"Ne/traukti vardai Skipped namesQObjectÀSubdirektorijs, kuriose dal/ parametrs reikia pakeisti, sraaas.<br> Numatytoji reikam: tua ia.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObject~Byls arba direktorijs, kuris nedera indeksuoti, vards aablonai.LThese are patterns for file or directory names which should not be indexed.QObject¬Pasirinkta simbolis aib bus naudojama skaityti byls, kuris simbolis aibs nepavyksta nustatyti, turiniui.<br>Numatytoji vert yra nepasirinkti konkre ios simbolis aibs - tokiu atveju naudojama NLS aplinkos vert.ÒThis is the character set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObject.spjimasWarningRTIToolW(visos kalbos)(all languages)RclMain(no stemming) (no stemming)RclMainApie Recoll About RecollRclMainVisiAllRclMain Netinkamos per~ikros komandin eilut %1: [%2] Praaome patikrinti mimeconf bylCBad viewer command line for %1: [%2] Please check the mimeconf fileRclMainDNepavyksta sukurti per~ikros langoCan't create preview windowRclMainxNepavyksta perskaityti dokumento arba sukurti laikinos bylos0Cannot extract document or create temporary fileRclMain€Nepavyksta iagauti ia duomens bazs informacijos apie dokument +Cannot retrieve document info from databaseRclMainU~daromaClosingRclMain8Dokuments kategorijs filtrasDocument category filterRclMain$Dokuments istorijaDocument historyRclMainVykdoma: [ Executing: [RclMain¤Reikalingos pilnam indeksavimui, ta iau nerandamos iaorins programos/komandos: SExternal applications/commands needed and not found for indexing your file types: RclMain$Istorijos duomenys History dataRclMainIndeksuojama:Indexing in progress: RclMain6Trkksta pagalbinis programsMissing helper programsRclMain”Nustatymuose nenumatyta jokia iaorin per~ikros programa aiam mime tipui [-No external viewer configured for mime type [RclMain^Randamos visos reikalingos pagalbins programosNo helpers found missingRclMainIavalytiPurgeRclMain"U~klausos detals Query detailsRclMain(U~klausos rezultatai Query resultsRclMain StemdbStemdbRclMain.Sustabdyti &IndeksavimStop &IndexingRclMainÊNurodyta per~ikros programa aiam mime tipui %1: %2 nerandama. Ar nortumete iaaaukti nustatyms lang?hThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMain8`i paieaka daugiau nevykdoma"This search is not active any moreRclMainNe~inomaUnknownRclMain&Atnaujinti &Indeks Update &IndexRclMain.spjimasWarningRclMainFerror retrieving stemming languages#error retrieving stemming languagesRclMainfiltruotasfilteredRclMain mediamediaRclMainpraneaimasmessageRclMainkitaotherRclMainprezentacijos presentationRclMainsurkaiuotasortedRclMainskai iuokls spreadsheetRclMaintekstastextRclMain&Apie Recoll &About Recoll RclMainBase$&Iasamesn Paieaka&Advanced Search RclMainBase8&Iatrinti dokuments istorij&Erase document history RclMainBase &Byla&File RclMainBase&Pagalba&Help RclMainBase.&Indeksavimo nustatymai&Indexing configuration RclMainBase&Nustatymai &Preferences RclMainBase(&U~klauss nustatymai&Query configuration RclMainBase@&Trkkstamos pagalbins programos&Show missing helpers RclMainBase,&Surkaiuoti parametrai&Sort parameters RclMainBase&.rankiai&Tools RclMainBase$&Vartotojo vadovas &User manual RclMainBase"Iasamesn PaieakaAdvanced/complex Search RclMainBaseVisiAll RclMainBase Ctrl+QCtrl+Q RclMainBase$Dokuments IstorijaDocument History RclMainBase&Dokuments &IstorijaDocument &History RclMainBaseI&aeitiE&xit RclMainBase.Iaorinis indekss langasExternal index dialog RclMainBasePirmas puslapis First page RclMainBaseBPereiti / pirm rezultats puslap/Go to first page of results RclMainBase"Sekantis puslapis Next page RclMainBase6Sekantis rezultats puslapisNext page of results RclMainBase0Priea tai buvs puslapis Previous page RclMainBase:Ankstesnis rezultats puslapisPrevious page of results RclMainBase RecollRecoll RclMainBase"Rezultats sraaas Result list RclMainBase"Paieakos /rankiai Search tools RclMainBase*Surkaiuoti parametrusSort parameters RclMainBase8Raktinis ~od~is &tyrintojasTerm &explorer RclMainBaseDRaktinis ~od~is tyrinjimo /rankisTerm explorer tool RclMainBase&Atnaujinti &Indeks Update &index RclMainBaseDataDate RecollModelBylos vardas File name RecollModelfAtidaryti &Aukatesnio lygio dokumentus/direktorijas&Open Parent document/folderResList&Per~ikra&PreviewResList&.raayti / byl&Write to FileResList"(rodyti u~klaus) (show query)ResList><p><b>Nerasta rezultats</b><br>

No results found
ResListX<p><i>Kiti galimi tarimai (be akcents): </i>4

Alternate spellings (accents suppressed): ResList,Kopijuoti &Bylos vardCopy &File NameResListKopijuoti &URL Copy &URLResList$Dokuments istorijaDocument historyResListDokumentai DocumentsResList4Rasti &panaaius dokumentusFind &similar documentsResList KitasNextResListAtidarytiOpenResListPer~ikraPreviewResListhPer~ikrti &Aukatesnio lygio dokumentus/direktorijasPreview P&arent document/folderResListAnkstesnisPreviousResList"Rezultats sraaas Result listResList.Neprieinamas dokumentasUnavailable documentResListia bentout of at leastResListfAtidaryti &Aukatesnio lygio dokumentus/direktorijas&Open Parent document/folderResTable&Per~ikra&PreviewResTable&.raayti / byl&Write to FileResTable,Kopijuoti &Bylos vardCopy &File NameResTableKopijuoti &URL Copy &URLResTable4Rasti &panaaius dokumentusFind &similar documentsResTablehPer~ikrti &Aukatesnio lygio dokumentus/direktorijasPreview P&arent document/folderResTablefAtidaryti &Aukatesnio lygio dokumentus/direktorijas&Open Parent document/folderResTableDetailArea&Per~ikra&PreviewResTableDetailArea&.raayti / byl&Write to FileResTableDetailArea,Kopijuoti &Bylos vardCopy &File NameResTableDetailAreaKopijuoti &URL Copy &URLResTableDetailArea4Rasti &panaaius dokumentusFind &similar documentsResTableDetailAreahPer~ikrti &Aukatesnio lygio dokumentus/direktorijasPreview P&arent document/folderResTableDetailArea,Visi raktiniai ~od~iai All termsSSearch0Bet kuris raktinis ~odisAny termSSearch8Netinkamai pateikta u~klausaBad query stringSSearchU~baigimai CompletionsSSearchª ia /veskite paieakos raktinius ~od~ius. .raaykite ESC SPC raaomo termino u~baigimui.FEnter search terms here. Type ESC SPC for completions of current term.SSearchBylos vardas File nameSSearch&Nepakanka atminties Out of memorySSearchU~klauss kalbaQuery languageSSearch"Pasirinkti /raa:Select an item:SSearch2Per daug galims u~baigimsToo many completionsSSearch4Pasirinkite paieakos tip.Choose search type. SSearchBaseIavalytiClear SSearchBase Ctrl+SCtrl+S SSearchBaseª ia /veskite paieakos raktinius ~od~ius. .raaykite ESC SPC raaomo termino u~baigimui.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase.Iatrinti paieakos /raaErase search entry SSearchBaseSSearchBase SSearchBase SSearchBaseIeakotiSearch SSearchBase Pradti u~klaus Start query SSearchBaseVisiAll SearchClauseWBylos vardas File name SearchClauseWŽPapildoms ~od~is skai ius kurie gali interspersed with the chosen onesHNumber of additional words that may be interspersed with the chosen ones SearchClauseW`Pasirinkite u~klausos tip atliekam su ~od~iais>Select the type of query that will be performed with the words SearchClauseW&U~daryti&Close SpellBase&Iaplsti&Expand  SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBase6Raktinis ~od~is tyrinjimas Term Explorer SpellBase2Aspell prapltims klaida.Aspell expansion error. SpellWlAspell iaaaukimas nepavyko. Aspell programa ne/diegta?)Aspell init failed. Aspell not installed?SpellW$Nerasta prapltimsNo expansion foundSpellW RegexpRegexpSpellW Tarimas/FonetikaSpelling/PhoneticSpellWStem expansionStem expansionSpellWRaktinis ~odisTermSpellWWildcards WildcardsSpellWFerror retrieving stemming languages#error retrieving stemming languagesSpellWNaraytiChoose UIPrefsDialog”Pasirinkite Xapian indekso direktorij (pav: /home/buddy/.recoll/xapiandb)@Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) UIPrefsDialog„Atrodo, jog pasirinkta direktorija nra Xapian indekso direktorija;The selected directory does not appear to be a Xapian index UIPrefsDialogZPasirinkta direktorija jau yra indekso sraae3The selected directory is already in the index list UIPrefsDialog8Pagrindinis/localus indekas!This is the main/local index! UIPrefsDialogFerror retrieving stemming languages#error retrieving stemming languages UIPrefsDialognPakeisti veiksmus su skirtingomis dabartinmis vertmis.Changing actions with different current values ViewAction Pakeisti veiksm Change ActionViewActionBaseU~darytiCloseViewActionBase8Sistemos per~ikros programosNative ViewersViewActionBaseäPasirinkite vien ar kelis byls tipus, tada paspauskite Keisti Veiksmus nordami keisti kaip programa juos atidarobSelect one or several file types, then click Change Action to modify the program used to open themViewActionBaseìPasirinkite vien ar kelis mime tipus tada spauskite "Keisti Veiksmus"<br>Taip pat galite u~daryti a/ lang ir patikrinti "Naudoti darbalaukio nustatymus"<br>pagrindinje panelje? nordami ignoruoti a/ sraa ir naudoti numatytasias darbalaukio.ÉSelect one or several mime types then click "Change Action"
You can also close this dialog and check "Use desktop preferences"
in the main panel to ignore this list and use your desktop defaults.ViewActionBaseXBEAGLE programa TURI neveikti. .galina per~ikrti beagle paruoat med~iag bandant indeksuoti Firefox naraymo<br> istorij (papildomai reikia /diegti Firefox Beagle pried)”Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.
(you should also install the Firefox Beagle plugin)confgui::ConfBeaglePanelWR.raaai bus trinami pasiekus nurodyt dyd/1Entries will be recycled once the size is reachedconfgui::ConfBeaglePanelWD.traukti Beagle paruoatus duomenisSteal Beagle indexing queueconfgui::ConfBeaglePanelWDNepavyksta /raayti nustatyms bylosCan't write configuration fileconfgui::ConfIndexWNaraytiChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWvIaorinis filtrs, dirban is ilgiau nei numatyta, darbas bus nutraukiamas. Taikoma retiems atvejas (pav. postscript) kada dokumentas galts priversti filtr kartoti veiksmus be galo ilgai. «External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. confgui::ConfSubPanelWGlobalusGlobalconfgui::ConfSubPanelW”Jei vert nurodyta (nelgyi -1) tekstins bylos bus suskaidytos / nurodyto dyd~io bylas, kurios bus atskirai indeksuojamos. Naudinga atliekant paieak labai dideliose tekstinse bylose (pav. log bylose).¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWJDid~iausias suspausts byls dydis (KB)Max. compressed file size (KB)confgui::ConfSubPanelWHIlgiausias filtrs veikimo laikas (S)Max. filter exec. time (S)confgui::ConfSubPanelWLDid~iausias tekstins bylos dydis (MB)Max. text file size (MB)confgui::ConfSubPanelW4Tekstins bylos dydis (KB)Text file page size (KB)confgui::ConfSubPanelWLViraijus pasirinkt suspausts byls dyd/, jie nebus indeksuojami. Pasirinkite -1 jei nenorite nurodyti ribos, 0, jei nenorite, jog suspaustos bylos bkts indeksuojamos.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelWLViraijus pasirinkt tekstinis byls dyd/, jie nebus indeksuojami. Pasirinkite -1 jei nenorite nurodyti ribos, 0, jei nenorite, jog suspaustos bylos bkts indeksuojamos.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelWAspell kalbaAspell languageconfgui::ConfTopPanelWBDuomens bazs direktorijos vardasDatabase directory nameconfgui::ConfTopPanelW*Nurodo nenaudoti aspell programos kuriant tarimo aproksimacijas raktinis ~od~is tyrinjimo /rankyje.<br>Naudinga, jei aspell neveikia arba ne/diegta.†Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelWTIndekso dalis, /raaoms / disk, dydis (MB)Index flush megabytes intervalconfgui::ConfTopPanelW Log bylos vardas Log file nameconfgui::ConfTopPanelW&Log iasamumo lygmuoLog verbosity levelconfgui::ConfTopPanelW\Did~iausia disko atminties naudojimo dalis (%)Max disk occupation (%)confgui::ConfTopPanelW,Aspell nebus naudojamaNo aspell usageconfgui::ConfTopPanelWpDirektorijs, kuris turinys nein-<br>deksuojamas, sraaas Skipped pathsconfgui::ConfTopPanelWNKalbos naudojamos stemming<br> procesuiStemming languagesconfgui::ConfTopPanelW¸Byla, kurioje bus /raaomos ~inuts.<br>Naudokite 'stderr' nordami iavesti / terminalo langPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWþAspell ~odyno kalba ('en', 'fr' ar kita).<br>Jei vert nenurodyta NLS aplinka pabandys nustatyti tinkam kalb (paprastai teisingai). Nordami su~inoti kas /raayta Jkss sistemoje /raaykite 'aspell-config' ir ~ikrkite / dat bylas 'data-dir' direktorijoje.2The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelWvKalbos, kurioms bus sukurti stemming <br>expansion ~odynai.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW¾Direktorijs, kuriose pradedamas rekursinis indeksavimas, sraaas. Numatytoji: nams direktorija.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWJDirektorijos, kurioje bus saugomas indeksas, vardas<br>Laikoma, jog santykinio keliio iki direktorijos prad~ia yra nustatyms direktorija. Numatytoji yra 'xapiandb'. –The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelWHDirektorijs, kuris turinys nebus indeksuojamas, vardai.<br> Vardo dalis gali bkti wildcards. Turi atitikti programos matomus kelius iki direktorijs (pav. jei indeksuoti pradedama nuo '/home/me', o '/home' yra nuoroda / '/usr/home', teisinga vert bus '/home/me/tmp*', o ne '/usr/home/me/tm*')#These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelWVViraijus (procentine iaraiaka) disko atminties panaudojim indeksavimas bus sustabdytas (vengiant pilnai u~pildyti disk).<br>0 reiakia, jog ribos nra (numatytoji vert).—This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).
0 means no limit (this is the default).confgui::ConfTopPanelW4Vert nustato duomens, kurie indeksuojami tarp /raaymo / disk, apimt/.<br>Padeda valdyti indeksavimo dalies atminties naudojim. Numatyta vert yra 10 MBŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWÞVert nustato ~iniu is apimt/, nuo vien tik <br>klaids fiksavimo iki didels apimties duomens skirts debugging.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW‚Auka iausio lygmens direktorijos<br>kuriose vykdomas indeksavimasTop directoriesconfgui::ConfTopPanelW>Naudoti sistemos 'file' komandUse system's 'file' commandconfgui::ConfTopPanelWŠJei nepavyks atpa~inti mime tipo<br>naudoti sistemos 'file' komand. NUse the system's 'file' command if internal
mime type identification fails.confgui::ConfTopPanelW&Ataaukti&CanceluiPrefsDialogBase &Gerai&OKuiPrefsDialogBasejPaieaka bus pakeista (pav. rolling stones -> rolling or stones or (rolling phrase 2 stones)). Teikiama aiaki pirmenyb rezultatams kuriuose rasti raktiniai ~od~iai atitinka /vestus.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBaseVisus aktyvuoti Activate AlluiPrefsDialogBasePridti indeks Add indexuiPrefsDialogBase*Pritaikyti pakeitimus Apply changesuiPrefsDialogBasetPradti paprastj paieak /vedus tua io tarpelio simobl/.-Auto-start simple search on whitespace entry.uiPrefsDialogBaseJPridti prie paprastos paieakos fraz+Automatically add phrase to simple searchesuiPrefsDialogBaseNaraytiChooseuiPrefsDialogBase@Pasirinkite redaktoris programasChoose editor applicationsuiPrefsDialogBase"Visus deaktyvuotiDeactivate AlluiPrefsDialogBase*Panaikinti pakeitimusDiscard changesuiPrefsDialogBaseˆKategorijs filtr rodyti kaip /ranks juost (reikalauja perkrovimo).KDisplay category filter as toolbar instead of button panel (needs restart).uiPrefsDialogBasevAr sukuriame dirbtin santrauk, jei dokumente jau ji yra? EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseüAr pabandome sukurti santraukas remdamiesi u~klauss raktinis ~od~is kontekstu? Didels apimties dokumentams gali ltai veikti.zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBase:Dinamiakai sukurti santraukasDynamically build abstractsuiPrefsDialogBase$Iaoriniai indeksaiExternal IndexesuiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBaseFSlpti pasikartojan ius rezultatus.Hide duplicate results.uiPrefsDialogBaseRU~klauss raktinis ~od~is ~ymjimo spalvosHighlight color for query termsuiPrefsDialogBase²Pa~ymjus, bus rodoma tik viena ia byls su tuo pa iu turiniu, ta iau skirtingais vardais.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBasevDid~iausia teksto, pa~ymto per~ikrai, apimtis (megabaitai)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseD.raas skai ius rezultats puslapyje"Number of entries in a result pageuiPrefsDialogBaseFPasirinkite rezultats sraao arift-Opens a dialog to select the result list fontuiPrefsDialogBase\Pirmenyb teikti Html formatui per~ikros metu.&Prefer Html to plain text for preview.uiPrefsDialogBaseh.siminti rkaiavimo pasirinkimus (nedings perkrovus).Remember sort activation state.uiPrefsDialogBasetPaaalinti ia sraao. Neturi jokio poveikio indeksui diske.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase&Pa~ymtus paaalintiRemove selecteduiPrefsDialogBaseRPakeisti dokumentuose randamas santraukas Replace abstracts from documentsuiPrefsDialogBase2Gra~inti numatytj formResetuiPrefsDialogBase`Gra~ina numatytj rezultats sraao srifto vert1Resets the result list font to the system defaultuiPrefsDialogBase0Rezultats sraao ariftasResult list fontuiPrefsDialogBase&Paieakos parametraiSearch parametersuiPrefsDialogBaseLPradti nuo iasamesns paieakos lango.'Start with advanced search dialog open.uiPrefsDialogBaseStemming kalbaStemming languageuiPrefsDialogBaseLDirbtins santraukos konteksto ~od~iai Synthetic abstract context wordsuiPrefsDialogBase\Dirbtins santraukos dydis (simbolis skai ius)$Synthetic abstract size (characters)uiPrefsDialogBase¦Tekstai viraijantys a/ dyd/ nebus nuspalvinami per~ikros metu (per didel apkrova).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase6.jungti/Iajungti pasirinktToggle selecteduiPrefsDialogBase|Naudoti darbalaukio nustatymus parenkant dokuments redaktoris.2Use desktop preferences to choose document editor.uiPrefsDialogBase"Vartotoja aplinkaUser interfaceuiPrefsDialogBase(Vartotojo nustatymaiUser preferencesuiPrefsDialogBaseˆ ý) ÿý, recoll-1.17.3/qtgui/i18n/recoll_ru.qm000644 001750 000000 00000241404 11757435371 017743 0ustar00dockeswheel000000 000000 <¸dÊÍ!¿`¡½ÝB è+ê-ê>¯â+;lH,„ÌH,£H,ОHYÐÉIA¥ŽZl±Gmb·¾¦ydᨥ®¶E‹ÎÐD =Ù] mLôµ³VE“–VEÑwf¾µålÀ§°¬Øq¬ôƒEî-^$—À½'Hä·á*Ð%Ÿ*ì0Ÿ‰+Lô`J+f¾±p+f¾¸k+f¾½'1øœ:Îdœ G…Ô)êGߤ”H6óÔHH6õÔuJ+‚boJ+‚ÎJ6• cJ6•ÝßL™bŒ=Ph¨¯ÄT°5°9WTeÇWÈÕ“ÌXÉÄ*á[ %±e®bãgwîÁRsºñsºñœKv8“•{v®Â€v®Âœ«zϳ$€€£¯„j€­Œ!þ 0œú+ÍÛªJ ᮽÞ({¶Êð€`º° ‹ÃÞºWÐùƒ›’ÐùƒØÌÐùƒÜ'ã3­ ãnò¥Õ ,Eµš9&`Ž 0,…ùÛ>.cm—Do2sXM¹$X®©2µ`Þ^³[h0æ:lÿtÑ5nÚgÉ„3Ö™‘vã5•ñ“mLœW­Þ`ž€ÞŽQ¢‰ñ£cê€ÎxCh)ÞñƒoÌó L„ŽþSIÌŽÿµ÷+ çn#¸Îçp#ávå“ýv奯 w 5¯Hw 5ÌWw 5Ðøw€¢#ÁŒUöÛŸ.ƒ£¹Þæß©Ö³Øšª6•ÓÚ¯†”‚K»f3¢¹ËÂîŽͼu%jÐgžœÔÔÂõcHØ.^ßÏê•ÊÍì;U‡Òï¡©4úUd_úeî^ ¬4\!D+Ñ ‹N&Áè.‡Npg7Î$=úd,L?úd¨Í?úd·G$ß©JUY‹~JUY´ÇY ô×J[–ufy_nÖ[s¾~2=z Óܨº™/u!–Ê·‡3¯¡3¡qÊ—¥œvÎÅå&»Ôä^!¥ÝôLaã¿ÕBìxùZùJgöþA¢«øB \•<.çÞͼõªƒëd«;[¾Ô¢<Äö¹½LƒÞe 2‘èvhÕ誀㇆E…(P†ÆŒ¯b­Ô’"3 ^’ZÓ m˜I¼a¸™n•©štµ„ñŸf•ÙFŸf•éÑŸf•Š«£¶«ÎJ¯ƒW4`¯ƒW^MÄy%1ÂÄy%‘΄՗xÐ: WÚ#ÍãX|íyåõW0«Ì” ã -Z¨zÏÕ«-¼¬L)ÖT+B9€÷“BìSÓ k¶Þ§~oˆ•Òr?)²§rž„G|ôòu„kå²[„kåº „kå¾3‹¦,¨›‹ÜðןŒÇ<¢÷›ˆ˜Ð¦ASªÃ¢–æ·¨ Àƒ»œRÔó¿gu +Ç¢•´-Ç¢•»"Ç¢•¾Š×I^¥ÿØ~CGèêÈ‹úéã>]ðŒµ.`³¨%" ÐM:ªä¹UKô,¡p hèu9IÔv2ãe–T#g*—Bb šK̦ %9¦öõÓ¨«‡›)¶7·hÄÖ[’ÊXÔ!ënDžðw)ÒÏþ C1#+ä.X7I^ŸAFW#Ñ£F¯N(H:"±¡H:"¸H:"½c_guG^ŒÍw²%ŒÍw¹"ŒÍw½òŒÏ—¶n²ñ“’žŽ¦š´²ð ´„²ð »z²ð ¾ì´ù€ýC¾l¯•ÆÓtNÈà‚ßɆt1ÜéŽ#©ª3^µ áùÙ~:uî'RQçÇl$ozêk}}kµ€;E¼¼ŽÄ^#¥”ò“.¡œ .rÀ¨0ÎÄÄÏÚÌí³`yͳ¶å×°…ìÝÜ *äœc —ä´¥‚œæí:‰^ö¨åûú Ã4¢ ´Hò 9ZyÏ‚ K¨ó§ ]#—’º cÄI⥠k¨µgs lMˆ^~ ‰Œî0À ŸÁò¶N ŸÁò¼$ ŸÁò¿ª «ƒÔ­œ ­îô] ®œ¯W ²9ðs ü>(¨ äîh‘ íåõâ *Nem Ücº ).~ŸÂ *R3 +<”ü2 6 ‰+ G.~Fï `P‘ `ç£ c·E¥· d8Ý[ yd ˜Iœ1 ¤ží´ ±TúÁÆ ²ëCµN ²ëC»¾ ²ëC¿: ÁùšŒ¨ Äãµ âæç¥+ åKÄ Š æõç¤Å ®£è ®ù¤= Ô…  ye1‹ TH ŽÚ`´ =!K¥ CK€aæ Kj×°È T|c¡Ü h¹°`ì tÓ9Ž éðþ £Ü fä ¨Î£¦D »ïµˆŠ Öüõª Û·å§Ü ÛÓÄ Vd¼ 'И£; /¥‘k 97Ãì 9É”L L*¹Y PÖ™„ RVŽš© T#p Vüû \iC*C ]æùå  `F¥ ˜ hôî¸ v—¥–¥ {l'ò €!Y–J ‘–²‹ ©zóH ¬æàg Ër$ ÓÍ™ Ú÷Ø( Ýøìž é—~" ö†ÀÔ zs« m£¯õ 'RçGÄ -èô°n 8þ› FÁà OE°Fx m†C" uò0©l y·Û) y¹~¡ ‚±3­ …È©î ‡uÌÝ ‰PƒÐ ‰P›] 5d& ’ãnÝ ¤š„“: ¬Š©0ê ½ý7Zt ÕH Ý ûÂ£×Ø q©ž­€![%Ýnu6/¸.d16“­R<Þ/¥cxÀ\pún ÑzcÀL‚3.ËU‚3.Î|“ÝèÚv›P¾_Õ¦À謾¶éúÆÀèšàɾqÐË6Yò×ôX¡æšÞH)íÚu®0ü|ÙkË“ûËo”i;éA=>4‘Qá~)+Y~s¢_[žs«¡\Н1ög3¦Épû~Z¿Õ  ! ‚´kX­c*µ“ÃÍ\»m€º­¿­c1Â|“-ÎÁ'—âó l­ü©ÜSü¶L“i4ðA5 ?>;O All clauses AdvSearchN1>5 ?>;5 Any clause AdvSearchX525@=K9 ACDD8:A <=>68B5;O 2 D8;LB@5 @07<5@0$Bad multiplier suffix in size filter AdvSearch<C;LB8<5480media AdvSearchA>>1I5=8Omessages AdvSearch8=>5other AdvSearch?@575=B0F88 presentations AdvSearchB01;8FK spreadsheets AdvSearch B5:ABKtexts AdvSearch<----- A5 <----- All AdvSearchBase<----- -B8 <----- Sel AdvSearchBase>1028BL ?>;5 Add clause AdvSearchBase!;>6=K9 ?>8A:Advanced search AdvSearchBaseA5 ----> All ----> AdvSearchBaseÖA5 =5?CABK5 ?>;O A?@020 1C4CB >1J548=5=K ;>38G5A:8<  ("2A5 A;>20") 8;8  (";N1>5 A;>2>"). <br>>;O B8?0 ";N1K5", "2A5" 8;8 "157 MB8E" ?@8=8<0NB =01>@ ?@>ABKE A;>2 8 D@07K, 70:;NGQ==K5 2 42>9=K5 :02KG:8.<br>CABK5 ?>;O 83=>@8@CNBAO.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBase@>A<>B@Browse AdvSearchBase> :0B53>@8O< By categories AdvSearchBase::;NG8BL D8;LB@>20=85 ?> 40B5'Check this to enable filtering on dates AdvSearchBase6$8;LB@>20BL ?> B8?0< D09;>2,Check this to enable filtering on file types AdvSearchBase@:;NG8BL D8;LB@>20=85 ?> @07<5@C'Check this to enable filtering on sizes AdvSearchBaseLA?>;L7>20BL :0B53>@88, 0 =5 B8?K MIME;Check this to use file categories instead of raw mime types AdvSearchBase0:@KBLClose AdvSearchBase#1@0BL ?>;5 Delete clause AdvSearchBase:2548B5 :0B0;>3 =0G0;0 ?>8A:0Enter top directory for search AdvSearchBase $8;LB@Filter AdvSearchBase($8;LB@>20=85 ?> 40B5 Filter dates AdvSearchBase.$8;LB@>20=85 ?> @07<5@C Filter sizes AdvSearchBase 09B8Find AdvSearchBaseBFrom AdvSearchBase3=>@8@C5<K5Ignored file types AdvSearchBase1@0B8BLInvert AdvSearchBase0:A. @07<5@ Max. Size AdvSearchBasex0:A. @07<5@. >6=> 8A?>;L7>20BL k/K, m/M, g/G :0: <=>68B5;84Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase8=. @07<5@ Min. Size AdvSearchBase„8=8<0;L=K9 @07<5@. >6=> 8A?>;L7>20BL k/K, m/M, g/G :0: <=>68B5;84Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase,3@0=8G8BL B8?K D09;>2Restrict file types AdvSearchBase2A:0BL B>;L:> 2 :0B0;>35:%Restrict results to files in subtree: AdvSearchBase.!>E@0=8BL :0: C<>;G0=85Save as default AdvSearchBaseRA:0BL <br>4>:C<5=BK,<br>C4>2;5B2>@ONI85:'Search for
documents
satisfying: AdvSearchBaseA:><K5Searched file types AdvSearchBase-B8 ----> Sel -----> AdvSearchBase0G0BL ?>8A: Start Search AdvSearchBase>To AdvSearchBaseŽ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0A?8A0=85 ?0:5B=>3> 8=45:A8@>20=8O <span style=" font-weight:600;">Recoll</span> (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">064>5 ?>;5 <>65B A>45@60BL H01;>= (*), >4=> G8A;5==>5 7=0G5=85, A?8A>: G5@57 70?OBCN (1,3,5) 8;8 480?07>= (1-7). -B8 ?>;O 1C4CB 8A?>;L7>20=K <span style=" font-style:italic;">:0: 5ABL</span> 2 D09;5 crontab, 4;O >7=0:><;5=8O A ?>;=K< A8=B0:A8A>< :>B>@>3> A<. crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />0?@8<5@, 22>4 <span style=" font-family:'Courier New,courier';">*</span> 4;O <span style=" font-style:italic;">=8</span>, <span style=" font-family:'Courier New,courier';">12,19</span> 4;O <span style=" font-style:italic;">'0AK</span> 8 <span style=" font-family:'Courier New,courier';">15</span> 4;O <span style=" font-style:italic;">8=CBK</span> 70?CAB8B recollindex 5654=52=> 2 12:15 8 19:15.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0A?8A0=85 A >G5=L G0ABK<8 70?CA:0<8 <>65B >:070BLAO <5=55 MDD5:B82=K<, G5< 8=45:A8@>20=85 2 @50;L=>< 2@5<5=8.</p></body></html>Å

Recoll batch indexing schedule (cron)

Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used as is inside the crontab file, and the full crontab syntax can be used, see crontab(5).


For example, entering * in Days, 12,19 in Hours and 15 in Minutes would start recollindex every day at 12:15 AM and 7:15 PM

A schedule with very frequent activations is probably less efficient than real time indexing.

 CronToolWx<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">06<8B5 <span style=" font-style:italic;">K:;NG8BL</span> 4;O ?@5:@0I5=8O 02B><0B8G5A:>9 D>=>2>9 8=45:A0F88, <span style=" font-style:italic;">:;NG8BL</span> 4;O 5Q 70?CA:0, <span style=" font-style:italic;">B<5=0</span>, GB>1K >AB028BL 2AQ :0: 5ABL.</p></body></html>š

Click Disable to stop automatic batch indexing, Enable to activate it, Cancel to change nothing.

 CronToolW80;>3 Cron Cron Dialog CronToolWZ=8 =545;8 (* 8;8 0-7, 0 8;8 7 - 2>A:@5A5=L5))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolWK:;NG8BLDisable CronToolW:;NG8BLEnable CronToolWnH81:0 CAB0=>2:8 70?8A8 cron. 525@=K9 A8=B0:A8A ?>;59?3Error installing cron entry. Bad syntax in fields ? CronToolW"'0AK (* 8;8 0-23)Hours (* or 0-23) CronToolW¦>E>65, GB> 4;O recollindex 5ABL 2@CG=CN ?@02;5=K5 70?8A8, =5 1C45< B@>30BL crontabPIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolW8=CBK (0-59)Minutes (0-59) CronToolW 80;>3Dialog EditDialog Ú<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">>E>65, GB> 8=45:A 4;O MB>9 :>=D83C@0F88 =5 ACI5AB2C5B.</span><br /><br />A;8 =04> ?@>8=45:A8@>20BL 4><0H=89 :0B0;>3 A =01>@>< @07C<=KE C<>;G0=89, =06<8B5 :=>?:C <span style=" font-style:italic;">0?CAB8BL 8=45:A8@>20=85</span>. >4@>1=>AB8 <>6=> 1C45B CB>G=8BL ?>765. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A;8 B@51C5BAO 1>;LH5 :>=B@>;O, 2>A?>;L7C9B5AL AAK;:0<8 4;O CB>G=5=8O :>=D83C@0F88 8 @0A?8A0=8O 8=45:A8@>20=8O.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">-B>B 8=AB@C<5=B0@89 4>ABC?5= 2 ;N1>5 2@5<O ?>A@54AB2>< <5=N <span style=" font-style:italic;">0AB@>9:8</span>.</p></body></html>ê

It appears that the index for this configuration does not exist.

If you just want to index your home directory with a set of reasonable defaults, press the Start indexing now button. You will be able to adjust the details later.

If you want more control, use the following links to adjust the indexing configuration and schedule.

These tools can be accessed later from the Preferences menu.

FirstIdxDialog@0AB@>9:0 ?5@2>3> 8=45:A8@>20=8OFirst indexing setupFirstIdxDialog6>=D83C@0F8O 8=45:A8@>20=8OIndexing configurationFirstIdxDialog2 0A?8A0=85 8=45:A8@>20=8OIndexing scheduleFirstIdxDialog00?CAB8BL 8=45:A8@>20=85Start indexing nowFirstIdxDialogø45AL <>6=> CB>G=8BL, :0:85 :0B0;>38 B@51C5BAO 8=45:A8@>20BL, :0:85 ?CB8 8;8 8<5=0 =5 B@51C5BAO, A :0:8<8 :>48@>2:0<8 8 B.?.This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.FirstIdxDialog.45AL <>6=> 2K1@0BL @568< 8=45:A8@>20=85O: ?0:5B=K9 8;8 @50;L=>3> 2@5<5=8, 0 B0:65 =0AB@>8BL @0A?8A0=85 02B><0B8G5A:>3> 8=45:A8@>20=8O ?@8 ?><>I8 cron.€This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron).FirstIdxDialog ò<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">=45:A8@>20=85 <span style=" font-weight:600;">Recoll</span> <>65B @01>B0BL ?>AB>O==>, 8=45:A8@CO 87<5=ONI85AO D09;K, 8;8 70?CA:0BLAO G5@57 ?@><56CB:8 2@5<5=8. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">@>G8B09B5 ?>4A:07:C, GB>1K @5H8BL, :0:>9 ?>4E>4 1C45B C4>1=59 (=06<8B5 F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">45AL <>6=> =0AB@>8BL @0A?8A0=85 02B><0B8G5A:8E 70?CA:>2 ?0:5B=>3> 8=45:A8@>20=8O 8;8 65 AB0@B0 8=45:A8@>20=8O 2 @50;L=>< 2@5<5=8 ?@8 2E>45 2 A8AB5<C (8;8 2AQ 8 A@07C, GB> @54:> 8<55B A<KA;). </p></body></html>¿

Recoll indexing can run permanently, indexing files as they change, or run at discrete intervals.

Reading the manual may help you to decide between these approaches (press F1).

This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense).

 IdxSchedW 0A?8A0=85 cronCron scheduling IdxSchedWä 5H8B5, =C6=> ;8 =0G8=0BL 8=45:A8@>20=85 2 @50;L=>< 2@5<5=8 ?@8 2E>45 2 A8AB5<C (B>;L:> 4;O 8=45:A0 ?> C<>;G0=8N).ZDecide if real time indexing will be started when you log in (only for the default index). IdxSchedWF0AB@>9:0 @0A?8A0=8O 8=45:A8@>20=8OIndex scheduling setup IdxSchedWP0?CA: 8=45:A8@>20=8O 2 @50;L=>< 2@5<5=8Real time indexing start up IdxSchedW²45AL <>6=> 2K1@0BL, 2 :0:>5 2@5<O 70?CA:0BL 8=45:A8@>20=85, 8 CAB0=>28BL 70?8AL crontab._The tool will let you decide at what time indexing should run and will install a crontab entry. IdxSchedW 80;>3Dialog ListDialogGroupBoxGroupBox ListDialog¼$09; 8AB>@88 ("history") ?>2@564Q= 8;8 =5 G8B05BAO/=5 70?8AK205BAO, ?@>25@LB5 8;8 C40;8B5 53>:K"history" file is damaged or un(read)writeable, please check or remove it: Main<5B :0B0;>30  2 :>=D83C@0F88 No db directory in configurationMain&0;LH5&NextPreview&@54K4CI55 &PreviousPreview&A:0BL: &Search for:Preview€52>7<>6=> A:>=25@B8@>20BL 4>:C<5=B 2> 2=CB@5==55 ?@54AB02;5=85 0Can't turn doc into internal representation for Preview B<5=0CancelPreviewJ52>7<>6=> A>740BL 2@5<5==K9 :0B0;>3:#Cannot create temporary directory: PreviewG8AB8BLClearPreview0:@KBL 2:;04:C Close TabPreview4!>740N B5:AB 4;O ?@>A<>B@0Creating preview textPreview*H81:0 703@C7:8 D09;0Error while loading filePreview203@C60N B5:AB 2 @540:B>@ Loading preview text into editorPreview$&!>1;N40BL @538AB@ Match &CasePreviewNBACBAB2C5B 2A?><>30B5;L=0O ?@>3@0<<0: Missing helper program: Preview>?8@>20BLCopyPreviewTextEdit"5@5=>A8BL AB@>:8 Fold linesPreviewTextEdit"!>E@0=OBL >BABC?KPreserve indentationPreviewTextEdit 5G0BLPrintPreviewTextEditD5G0BL B5:CI53> >:=0 ?@54?@>A<>B@0Print Current PreviewPreviewTextEdit2!>E@0=8BL 4>:C<5=B 2 D09;Save document to filePreviewTextEditK45;8BL 2AQ Select AllPreviewTextEdit>:070BL ?>;O Show fieldsPreviewTextEdit(>:070BL 87>1@065=85 Show imagePreviewTextEdit.>:070BL >A=>2=>9 B5:ABShow main textPreviewTextEdit6<b>0B0;>38 A >A>15==>ABO<8Customised subtreesQObjectv<i>!;54CNI85 ?0@0<5B@K CAB0=02;820NBAO =0 25@E=5< C@>2=5, 5A;8 2K1@0BL<br>=8G53> 8;8 ?CABCN AB@>:C, 8;8 4;O 2K1@0==>3> ?>4:0B0;>30.<br>K <>65B5 4>102;OBL 8 C40;OBL :0B0;>38 :=>?:0<8 +/-.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject$Web-8AB>@8O BeagleBeagle web historyQObject,>48@>2:0 ?> C<>;G0=8NDefault character setQObject> 0A:@K20BL A8<2>;8G5A:85 AAK;:8Follow symbolic linksQObject¸%>48BL ?> A8<2>;8G5A:8< AAK;:0< ?@8 8=45:A8@>20=88. 1KG=> =5 45;05BAO 4;O 871560=8O 4C1;59TFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject1I85 ?0@0<5B@KGlobal parametersQObject<=45:A8@>20BL 2A5 8<5=0 D09;>2Index all file namesQObject0=45:A8@>20BL 8 B5 8<5=0 D09;>2, 4;O :>B>@KE =5 ?>;CG05BAO >?@545;8BL 8;8 >1@01>B0BL A>45@68<>5 (=58725AB=K9 8;8 =5?>445@68205<K9 B8? MIME). 1KG=> B0:}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject"'0AB=K5 ?0@0<5B@KLocal parametersQObject$@>?CA:05<K5 8<5=0 Skipped namesQObjectÚ!?8A>: ?>4:0B0;>3>2 2 8=45:A8@C5<>9 85@0@E88,<br>345 =5:>B>@K5 ?0@0<5B@K =C640NBAO 2 :>@@5:F88. 1KG=> ?CAB.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObjectˆ(01;>=K 8<Q= D09;>2 8;8 :0B0;>3>2, :>B>@K5 =5 A;54C5B 8=45:A8@>20BL.LThese are patterns for file or directory names which should not be indexed.QObjectˆ-B0 :>48@>2:0 1C45B 8A?>;L7>20=0 ?@8 GB5=88 D09;>2, 2 :>B>@KE B0:>20O =5 C:07K205BAO O2=> (=0?@8<5@, G8AB> B5:AB>2KE D09;>2).<br>1KG=> 7=0G5=85 ?CAB>, B>340 >=> 872;5:05BAO 87 >:@C65=8O (;>:0;8).ÒThis is the character set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObject€<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">=45:A8@>20=85 <span style=" font-weight:600;">Recoll</span> <>65B 1KBL =0AB@>5=> :0: A5@28A, >1=>2;ONI89 8=45:A ?@8 87<5=5=88 D09;>2 2 @50;L=>< 2@5<5=8. @8 MB>< 8=45:A 2A5340 A25689, => F5=>9 ?>AB>O==> 8A?>;L7C5<KE A8AB5<=KE @5AC@A>2.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>.

Recoll indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.

RTIToolWf"0:65 70?CAB8BL A;C61C 8=45:A8@>20=8O ?@O<> A59G0A.%Also start indexing daemon right now.RTIToolWh$09; 02B>70?CA:0 C40;Q=. AB0=>28BL B5:CI89 ?@>F5AA?2Autostart file deleted. Kill current process too ?RTIToolW"5 <>3C A>740BL: Can't create: RTIToolW@52>7<>6=> 70?CAB8BL recollindexCould not execute recollindexRTIToolW#40;ON D09; Deleting fileRTIToolW#40;ON:  Deleting: RTIToolWn2B><0B8G5A:89 70?CA: 8=45:A8@>20=8O 2 @50;L=>< 2@5<5=8"Real time indexing automatic startRTIToolW"#18@0N 02B>70?CA:Removing autostartRTIToolW0<5=ON D09;Replacing fileRTIToolW0<5=ON:  Replacing: RTIToolWl0?CA:0BL A;C61C 8=45:A8@>20=8O 2<5AB5 A <>59 A5AA859..Start indexing daemon with my desktop session.RTIToolWAB>@>6=>WarningRTIToolW(2A5 O7K:8)(all languages)RclMain(157 A;>2>D>@<) (no stemming)RclMain ?@>3@0<<5 About RecollRclMain2A5AllRclMainœ525@=0O :><0=4=0O AB@>:0 ?@>3@0<<K ?@>A<>B@0 %1: [%2] @>25@LB5 D09; mimeconfCBad viewer command line for %1: [%2] Please check the mimeconf fileRclMain*5B 4>ABC?0 : D09;C: Can't access file: RclMainJ52>7<>6=> A>740BL >:=> ?@54?@>A<>B@0Can't create preview windowRclMain:52>7<>6=> @0A?0:>20BL D09;: Can't uncompress file: RclMain`5 <>3C >1=>28BL 8=45:A: 8=45:A0B>@ C65 B@C48BAO#Can't update index: indexer runningRclMainl52>7<>6=> 872;5GL 4>:C<5=B 8;8 A>740BL 2@5<5==K9 D09;0Cannot extract document or create temporary fileRclMainZ52>7<>6=> 872;5GL 8=D>@<0F8N 4>:C<5=B0 87 +Cannot retrieve document info from databaseRclMain0:@K20NClosingRclMainb@>8=45:A8@>20=> A>45@60=85 A;54CNI8E MIME-B8?>2:.Content has been indexed for these mime types:RclMain¨5 C40;>AL >B:@KBL 2=5H=89 8=45:A.  =5 >B:@KB0. @>25@LB5 A?8A>: 2=5H=8E 8=45:A>2.HCould not open external index. Db not open. Check external indexes list.RclMain4$8;LB@ :0B53>@88 4>:C<5=B0Document category filterRclMain$AB>@8O 4>:C<5=B>2Document historyRclMain >B>2>DoneRclMain!B8@0N 8=45:A Erasing indexRclMain H81:0ErrorRclMainK?>;=ON: [ Executing: [RclMain¬BACBAB2CNI85 2=5H=85 ?@8;>65=8O/:><0=4K, B@51C5<K5 4;O 8=45:A8@>20=8O 20H8E D09;>2: SExternal applications/commands needed and not found for indexing your file types: RclMain0==K5 8AB>@88 History dataRclMain =45:A =5 >B:@KBIndex not openRclMainR=45:A 4;O MB>3> D09;0 CAB0@5;. 5 1C4C @8A:>20BL ?>:07K20BL =5 B>B D@03<5=B. 06<8B5 OK 4;O >1=>2;5=8O 8=45:A0 4;O MB>3> D09;0, 70B5< ?>2B>@8B5 70?@>A. ;8 65 B<5=8BL.´Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel.RclMainH81:0 70?@>A0Index query errorRclMain2=45:A8@>20=85 =5 C40;>ALIndexing failedRclMain =45:A8@>20=85: Indexing in progress: RclMainJ54>AB0NI85 2A?><>30B5;L=K5 ?@>3@0<<KMissing helper programsRclMain>=8B>@MonitorRclMainX5 C:070=0 2=5H=OO ?@>3@0<<0 ?@>A<>B@0 4;O [-No external viewer configured for mime type [RclMainLA5 2A?><>30B5;L=K5 ?@>3@0<<K 4>ABC?=KNo helpers found missingRclMain0>8A: =5 40; @57C;LB0B>2No results foundRclMainBACBAB2C5BNoneRclMainG8AB8BLPurgeRclMain&>4@>1=>AB8 70?@>A0 Query detailsRclMain®0?@>A >1@010BK205BAO.<br>7-70 >3@0=8G5=89 181;8>B5:8<br>>AB0=>2 ?@5@2QB 2AN ?@>3@0<<CeQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMain" 57C;LB0BK ?>8A:0 Query resultsRclMain@1=C;8BL 8=45:A 8 =0G0BL 70=>2>?(Reset the index and start from scratch ?RclMain, 57C;LB0B>2 (?@8<5@=>)Result count (est.)RclMain!>E@0=8BL D09; Save fileRclMain070 :>@=59StemdbRclMain0&@5@20BL 8=45:A8@>20=85Stop &IndexingRclMainô"5:CI89 ?@>F5AA 8=45:A8@>20=8O =5 1K; 70?CI5= 87 MB>3> 8=B5@D59A0. 06<8B5 OK 4;O >AB0=>20 8;8 B<5=8BL, GB>1 @01>B0; A515yThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMain´@>3@0<<0 ?@>A<>B@0, C:070==0O 2 mimeview 4;O %1: %2, =5 =0945=0. B:@KBL 480;>3 =0AB@>5:?hThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMain2-B>B ?>8A: C65 =5 0:B825="This search is not active any moreRclMain58725AB=>UnknownRclMain 1=>28BL &8=45:A Update &IndexRclMain1=>2;ONUpdatingRclMainAB>@>6=>WarningRclMain<>H81:0 ?>;CG5=8O A?8A:0 O7K:>2#error retrieving stemming languagesRclMainD8;LB@>20==>5filteredRclMain <5480mediaRclMainA>>1I5=8OmessageRclMain8=>5otherRclMain?@575=B0F88 presentationRclMainA>@B8@>20==>5sortedRclMainB01;8FK spreadsheetRclMain B5:ABtextRclMain& ?@>3@0<<5 &About Recoll RclMainBase&!;>6=K9 ?>8A:&Advanced Search RclMainBase8&G8AB8BL 8AB>@8N 4>:C<5=B>2&Erase document history RclMainBase0G8AB8BL 8AB>@8N &?>8A:0&Erase search history RclMainBase &$09;&File RclMainBase> 25AL &M:@0= &Full Screen RclMainBase&>4A:07:0&Help RclMainBase20AB@>9:8 8=&45:A8@>20=8O&Indexing configuration RclMainBase4& 0A?8A0=85 8=45:A8@>20=8O&Indexing schedule RclMainBase&0AB@>9:8 &Preferences RclMainBase&>=D83C@0F8O&Query configuration RclMainBase$5@5&8=45:A8@>20BL&Rebuild index RclMainBase8>:070BL 8=45:A8@C5<K5 &B8?K&Show indexed types RclMainBaseN&>:070BL =54>AB0NI85 2=5H=85 ?@>3@0<<K&Show missing helpers RclMainBase*&0@0<5B@K A>@B8@>2:8&Sort parameters RclMainBase&=AB@C<5=BK&Tools RclMainBase& C:>2>4AB2> &User manual RclMainBase!;>6=K9 ?>8A:Advanced/complex Search RclMainBase2A5All RclMainBase Ctrl+QCtrl+Q RclMainBase$AB>@8O 4>:C<5=B>2Document History RclMainBase&&AB>@8O 4>:C<5=B>2Document &History RclMainBase &KE>4E&xit RclMainBase080;>3 &2=5H=53> 8=45:A0E&xternal index dialog RclMainBase.80;>3 2=5H=53> 8=45:A0External index dialog RclMainBaseF11F11 RclMainBase5@20O AB@0=8F0 First page RclMainBase> 25AL M:@0= Full Screen RclMainBaseJ5@59B8 : ?5@2>9 AB@0=8F5 @57C;LB0B>2Go to first page of results RclMainBase!;54. AB@0=8F0 Next page RclMainBase<!;54CNI0O AB@0=8F0 @57C;LB0B>2Next page of results RclMainBase PgDownPgDown RclMainBasePgUpPgUp RclMainBase@54. AB@0=8F0 Previous page RclMainBase>@54K4CI0O AB@0=8F0 @57C;LB0B>2Previous page of results RclMainBase RecollRecoll RclMainBase$!?8A>: @57C;LB0B>2 Result list RclMainBase$=AB@C<5=BK ?>8A:0 Search tools RclMainBaseShift-PgUp Shift+PgUp RclMainBase.>:070BL 45B0;8 70?@>A0Show Query Details RclMainBaseD>:070BL @57C;LB0BK 2 2845 B01;8FKShow results as table RclMainBaseL!>@B8@>20BL ?> 40B0< >B =>2KE : AB0@K<#Sort by dates from newest to oldest RclMainBaseL!>@B8@>20BL ?> 40B0< >B AB0@KE : =>2K<#Sort by dates from oldest to newest RclMainBase(0@0<5B@K A>@B8@>2:8Sort parameters RclMainBase&02830B>@ &B5@<8=>2Term &explorer RclMainBase@=AB@C<5=B 8AA;54>20=8O B5@<8=>2Term explorer tool RclMainBase 1=>28BL &8=45:A Update &index RclMainBasesortByDateAsc sortByDateAsc RclMainBasesortByDateDescsortByDateDesc RclMainBaseK45@6:0Abstract RecollModel 2B>@Author RecollModel0B0Date RecollModel0B0 8 2@5<O Date and time RecollModel0B0 4>:C<5=B0 Document date RecollModel  07<5@ 4>:C<5=B0 Document size RecollModel0B0 D09;0 File date RecollModel<O D09;0 File name RecollModel 07<5@ D09;0 File size RecollModel I-?CBLIpath RecollModel;NG52K5 A;>20Keywords RecollModel7<5=5=>Mtime RecollModel$AE>4=0O :>48@>2:0Original character set RecollModel 5;520=B=>ABLRelevancy rating RecollModel0720=85Title RecollModelURLURL RecollModel&B:@KBL&OpenResListL&B:@KBL @>48B5;LA:89 4>:C<5=B/:0B0;>3&Open Parent document/folderResList&@>A<>B@&PreviewResList"&!>E@0=8BL 2 D09;&Write to FileResList"(?>:070BL 70?@>A) (show query)ResList0<p><b>5 =0945=></b><br>

No results found
ResList‚<p><i>;LB5@=0B82=0O >@D>3@0D8O (157 480:@8B8G5A:8E 7=0:>2): </i>4

Alternate spellings (accents suppressed): ResList,!:>?8@>20BL &8<O D09;0Copy &File NameResList>?8@>20BL &URL Copy &URLResList$AB>@8O 4>:C<5=B>2Document historyResList>:C<5=BK DocumentsResList209B8 &?>4>1=K5 4>:C<5=BKFind &similar documentsResList!;54CNI0ONextResListB:@KBLOpenResList@54?@>A<>B@PreviewResList\&@54?@>A<>B@ @>48B5;LA:>3> 4>:C<5=B0/:0B0;>30Preview P&arent document/folderResList@54K4CI0OPreviousResList$!?8A>: @57C;LB0B>2 Result listResList&>:C<5=B =54>ABC?5=Unavailable documentResList?>forResList87 <8=8<C<out of at leastResList &#40;8BL AB>;15F&Delete columnResTable&B:@KBL&OpenResTableL&B:@KBL @>48B5;LA:89 4>:C<5=B/:0B0;>3&Open Parent document/folderResTable&@>A<>B@&PreviewResTable<&!1@>A8BL ?0@0<5B@K A>@B8@>2:8 &Reset sortResTable$&!>E@0=8BL :0: CSV &Save as CSVResTable"&!>E@0=8BL 2 D09;&Write to FileResTable*>1028BL :>;>=:C "%1"Add "%1" columnResTable@5 C40;>AL >B:@KBL/A>740BL D09;:Can't open/create file: ResTable,!:>?8@>20BL &8<O D09;0Copy &File NameResTable>?8@>20BL &URL Copy &URLResTable209B8 &?>4>1=K5 4>:C<5=BKFind &similar documentsResTable\&@54?@>A<>B@ @>48B5;LA:>3> 4>:C<5=B0/:0B0;>30Preview P&arent document/folderResTable8!>E@0=8BL B01;8FC 2 CSV-D09;Save table to CSV fileResTable&B:@KBL&OpenResTableDetailAreaL&B:@KBL @>48B5;LA:89 4>:C<5=B/:0B0;>3&Open Parent document/folderResTableDetailArea&@>A<>B@&PreviewResTableDetailArea"&!>E@0=8BL 2 D09;&Write to FileResTableDetailArea,!:>?8@>20BL &8<O D09;0Copy &File NameResTableDetailArea>?8@>20BL &URL Copy &URLResTableDetailArea209B8 &?>4>1=K5 4>:C<5=BKFind &similar documentsResTableDetailArea\&@54?@>A<>B@ @>48B5;LA:>3> 4>:C<5=B0/:0B0;>30Preview P&arent document/folderResTableDetailAreaA5 A;>20 All termsSSearchN1>5 A;>2>Any termSSearch.525@=0O AB@>:0 70?@>A0Bad query stringSSearch>?>;=5=8O CompletionsSSearch42548B5 <0A:C 8<5=8 D09;0.$Enter file name wildcard expression.SSearchŠ2548B5 2K@065=85 =0 O7K:5 70?@>A>2. (?0@30;:0:<br> <i>A;>2>1 A;>2>2</i> : 'A;>2>1' 8 'A;>2>2' 2 ;N1>< ?>;5.<br> <i>?>;5:A;>2>1</i> : 'A;>2>1' 2 ?>;5 '?>;5'.<br> !B0=40@B=K5 ?>;O/A8=>=8<K:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> A524>-?>;O: dir, mime/format, type/rclcat, date.<br> @8<5@K 8=B5@20;>2 <564C 42C<O 40B0<8: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>A;>2>1 A;>2>2 OR A;>2>3</i> : A;>2>1  (A;>2>2  A;>2>3).<br>  459AB28B5;L=>AB8, A:>1:8 =5 @07@5H5=K.<br> <i>"A;>2>1 A;>2>2"</i> : D@070 (4>;6=0 2AB@5G0BLAO 8<5==> 2 B0:>< 2845). >48D8:0B>@K:<br> <i>"A;>2>1 A;>2>2"p</i> : =5C?>@O4>G5==K9 ?>8A: A @0AAB>O=85< (<i><b>p</b>roximity</i>) ?> C<>;G0=8N.<br> A?>;L7C9B5 AAK;:C <b>?>:070BL 70?@>A</b>, :>340 A><=5205B5AL 2 @57C;LB0B5, 8 A<>B@8B5 ?>4@>1=>AB8 2 @C:>2>4AB25 (&lt;F1>). éEnter query language expression. Cheat sheet:
term1 term2 : 'term1' and 'term2' in any field.
field:term1 : 'term1' in field 'field'.
Standard field names/synonyms:
title/subject/caption, author/from, recipient/to, filename, ext.
Pseudo-fields: dir, mime/format, type/rclcat, date.
Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
term1 term2 OR term3 : term1 AND (term2 OR term3).
No actual parentheses allowed.
"term1 term2" : phrase (must occur exactly). Possible modifiers:
"term1 term2"p : unordered proximity search with default distance.
Use Show Query link when in doubt about result and see manual (<F1>) for more detail. SSearch 2548B5 ?>8A:>2K5 A;>20. >6=> =060BL Esc-?@>15; 4;O 4>?>;=5=8O B5:CI53> A;>20.FEnter search terms here. Type ESC SPC for completions of current term.SSearch<O D09;0 File nameSSearch&54>AB0B>G=> ?0<OB8 Out of memorySSearch/7K: 70?@>A0Query languageSSearchK15@8B5:Select an item:SSearch0!;8H:>< <=>3> 4>?>;=5=89Too many completionsSSearch&K15@8B5 B8? ?>8A:0Choose search type. SSearchBaseG8AB8BLClear SSearchBase Ctrl+SCtrl+S SSearchBase 2548B5 ?>8A:>2K5 A;>20. >6=> =060BL Esc-?@>15; 4;O 4>?>;=5=8O B5:CI53> A;>20.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase&G8AB8BL ?>;5 22>40Erase search entry SSearchBaseSSearchBase SSearchBase SSearchBase A:0BLSearch SSearchBase&@8ABC?8BL : ?>8A:C Start query SSearchBase2A5All SearchClauseW ;N1>5Any SearchClauseW8<O D09;0 File name SearchClauseW5 8A?. ?>;ONo field SearchClauseW157None SearchClauseW>;8G5AB2> 4>?>;=8B5;L=KE A;>2, :>B>@K5 <>3CB >:070BLAO <564C 2K1@0==K<8HNumber of additional words that may be interspersed with the chosen ones SearchClauseW D@070Phrase SearchClauseW1;87>ABL Proximity SearchClauseWpK15@8B5 B8? 70?@>A0, :>B>@K9 1C45B ?@>87254Q= ?> A;>20<>Select the type of query that will be performed with the words SearchClauseW&0:@KBL&Close SpellBase& 0A:@KBL &Expand  SpellBase Alt+CAlt+C SpellBase Alt-EAlt+E SpellBase(5B 8=D>@<0F88 > . No db info. SpellBase$02830B>@ B5@<8=>2 Term Explorer SpellBase6H81:0 @0A:@K20=8O aspell. Aspell expansion error. SpellWl5 ?>;CG8;>AL 8=8F80;878@>20BL Aspell. = CAB0=>2;5=?)Aspell init failed. Aspell not installed?SpellW>:. / A53> Doc. / Tot.SpellWj=45:A: %1 4>:C<5=B(>2), A@54=OO 4;8=0 %2 M;5<5=B(>2),Index: %1 documents, average length %2 termsSpellW( 0A:@KB85 =5 =0945=>No expansion foundSpellW 532K@065=85RegexpSpellW$0?8A0=85/D>=5B8:0Spelling/PhoneticSpellW  0A:@KB85 >A=>2KStem expansionSpellW !;>2>TermSpellW(01;>=K WildcardsSpellW<>H81:0 ?>;CG5=8O A?8A:0 O7K:>2#error retrieving stemming languagesSpellWK15@8B5Choose UIPrefsDialog–K15@8B5 :0B0;>3 8=45:A0 Xapian (=0?@8<5@, /home/?@8OB5;L/.recoll/xapiandb)@Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) UIPrefsDialogVK1@0==K9 :0B0;>3 =5 ?>E>6 =0 8=45:A Xapian;The selected directory does not appear to be a Xapian index UIPrefsDialogD-B>B :0B0;>3 C65 2 A?8A:5 8=45:A>23The selected directory is already in the index list UIPrefsDialog&-B> 3;02=K9 8=45:A!This is the main/local index! UIPrefsDialog<>H81:0 ?>;CG5=8O A?8A:0 O7K:>2#error retrieving stemming languages UIPrefsDialogf7<5=5=85 459AB289 A @07;8G=K<8 B5:CI8<8 7=0G5=8O<8.Changing actions with different current values ViewAction><0=40Command ViewAction !<5=8BL 459AB285 Change ActionViewActionBase0:@KBLCloseViewActionBase >4=K5 2LN5@KNative ViewersViewActionBaseêK15@8B5 >48= 8;8 =5A:>;L:> B8?>2 D09;>2, 70B5< =06<8B5 "!<5=8BL 459AB285" 4;O 87<5=5=8O ?@>3@0<<K, @01>B0NI59 A =8<8bSelect one or several file types, then click Change Action to modify the program used to open themViewActionBaseêK15@8B5 >48= 8;8 =5A:>;L:> MIME-B8?>2 8 =06<8B5"!<5=8BL 459AB285"<br>"0:65 K <>65B5 70:@KBL MB>B 480;>3 8 CAB0=>28BL D;03 "A?>;L7>20BL 45A:B>?=K5 =0AB@>9:8"<br> 2 >A=>2=>9 ?0=5;8, GB>1K 8A?>;L7>20BL 45A:B>?=K5 =0AB@>9:8 2<5AB> 40==>3> A?8A:0.ÉSelect one or several mime types then click "Change Action"
You can also close this dialog and check "Use desktop preferences"
in the main panel to ignore this list and use your desktop defaults.ViewActionBaseRBeagle  4>;65= 2K?>;=OBLAO. :;NG8BL >1@01>B:C >G5@548 Beagle 4;O 8=45:A8@>20=8O Web-8AB>@88 Firefox.<br>(4;O MB>3> A;54C5B B0:65 CAB0=>28BL ?;038= Beagle 4;O Firefox)”Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.
(you should also install the Firefox Beagle plugin)confgui::ConfBeaglePanelWˆ@8 4>AB865=88 C:070==>3> @07<5@0 :MH0 AB0@K5 70?8A8 1C4CB C40;OBLAO1Entries will be recycled once the size is reachedconfgui::ConfBeaglePanelWL0:A8<0;L=K9 @07<5@ web-E@0=8;8I0 () Max. size for the web store (MB)confgui::ConfBeaglePanelW\>A?>;L7>20BLAO >G5@54LN 8=45:A8@>20=8O BeagleSteal Beagle indexing queueconfgui::ConfBeaglePanelW <O :0B0;>30 4;O E@0=5=8O :>?89 ?>A5IQ==KE web-AB@0=8F.<br>CBL, =5 O2;ONI89AO 01A>;NB=K<, 15@QBAO >B=>A8B5;L=> :0B0;>30 :>=D83C@0F88.‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWL<O :0B0;>30 4;O E@0=8;8I0 web-AB@0=8FWeb page store directory nameconfgui::ConfBeaglePanelWJ52>7<>6=> 70?8A0BL D09; :>=D83C@0F88Can't write configuration fileconfgui::ConfIndexW@>A<>B@Chooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLW8=5H=85 D8;LB@K, 2K?>;=ONI85AO 4>;LH5 C:070==>3> ?@545;L=>3> 2@5<5=8 @01>BK, ?@8=C48B5;L=> 7025@H0NBAO. -B> <>65B ?><>GL 2 B5E @54:8E A;CG0OE, :>340 D8;LB@ (=0?@8<5@, postscript) 70F8:;8205BAO ?@8 >1@01>B:5 =5:>B>@>3> 4>:C<5=B0. =0G5=85, @02=>5 -1, 2K:;NG05B ?@>25@:C 2@5<5=8 @01>BK.«External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. confgui::ConfSubPanelW 1I55Globalconfgui::ConfSubPanelWðA;8 MB> 7=0G5=85 CAB0=>2;5=> (B.5. =5 @02=> -1), B> ?@8 8=45:A8@>20=88 B5:AB>2K5 D09;K @071820NBAO =0 D@03<5=BK A>>B25BAB2CNI53> @07<5@0. 0==0O >?F8O <>65B ?><>GL ?@8 2K?>;=5=88 ?>8A:0 2 >G5=L 1>;LH8E B5:AB>2KE D09;0E (=0?@8<5@, D09;0E 6C@=0;>2).¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWB@545; @07<5@0 A60B>3> D09;0 (KB)Max. compressed file size (KB)confgui::ConfSubPanelWJ@545;L=>5 2@5<O @01>BK D8;LB@0 (A5:)Max. filter exec. time (S)confgui::ConfSubPanelWH@545; @07<5@0 B5:AB>2>3> D09;0 (MB)Max. text file size (MB)confgui::ConfSubPanelWJ 07<5@ AB@0=8FK B5:AB>2>3> D09;0 (KB)Text file page size (KB)confgui::ConfSubPanelW-B> 7=0G5=85 CAB0=02;8205B ?>@>3 @07<5@0 A60BKE D09;>2, :>B>@K5 1C4CB >1@010BK20BLAO. -1 >B:;NG05B ?>@>3, 0 >B:;NG05B 45:><?@5AA8N.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelW¸-B> 7=0G5=85 CAB0=02;8205B ?>@>3 @07<5@0 B5:AB>2KE D09;>2, :>B>@K5 1C4CB >1@010BK20BLAO. -1 >B:;NG05B ?>@>3. 0==0O =0AB@>9:0 <>65B 1KBL ?>;57=0 4;O ?@54>B2@0I5=8O 8=45:A8@>20=8O 1>;LH8E D09;>2: 6C@=0;>2 A>>1I5=89 8 B.?.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelW/7K: aspellAspell languageconfgui::ConfTopPanelW&0B0;>3 107K 40==KEDatabase directory nameconfgui::ConfTopPanelWB:;NG05B 8A?>;L7>20=85 aspell 4;O 35=5@0F88 ?@81;865=89 =0?8A0=8O 2 =02830B>@5 B5@<8=>2.<br> >;57=>, 5A;8 aspell >BACBAB2C5B 8;8 A;><0=. †Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelW8=B5@20; 70?8A8 8=45:A0 (1)Index flush megabytes intervalconfgui::ConfTopPanelW$09; 6C@=0;0 Log file nameconfgui::ConfTopPanelW&>4@>1=>ABL 6C@=0;0Log verbosity levelconfgui::ConfTopPanelWH0:A8<0;L=>5 8A?>;L7>20=85 48A:0 (%)Max disk occupation (%)confgui::ConfTopPanelW,5 8A?>;L7>20BL aspellNo aspell usageconfgui::ConfTopPanelW@>?CA:0BL Skipped pathsconfgui::ConfTopPanelW*/7K:8 A> A;>2>D>@<0<8Stemming languagesconfgui::ConfTopPanelW–$09;, :C40 1C4CB 70?8AK20BLAO A>>1I5=8O.<br>'stderr' 4;O 2K2>40 =0 B5@<8=0;PThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelW,/7K: A;>20@O aspell. 1KG=> 2@>45 'en' 8;8 'ru'...<br>A;8 7=0G5=85 =5 C:070=>, 1C45B 8A?>;L7>20=> >:@C65=85 (;>:0;L), GB> >1KG=> @01>B05B. 'B>1K ?>A<>B@5BL, :0:85 20@80=BK 4>ABC?=K 2 A8AB5<5, =015@8B5 'aspell config' 8 ?@>25@LB5, :0:85 .dat-D09;K 5ABL 2 :0B0;>35 'data-dir'. 2The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW„/7K:8, 4;O :>B>@KE 1C4CB ?>AB@>5=K<br>A;>20@8 @0A:@KB8O A;>2>D>@<.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW¬!?8A>: :0B0;>3>2, 345 =0G8=05BAO @5:C@A82=>5 8=45:A8@>20=85. 1KG=> 4><0H=89 :0B0;>3.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWæ<O :0B0;>30, 2 :>B>@>< E@0=8BAO 8=45:A<br>B=>A8B5;L=K9 ?CBL 15@QBAO >B :0B0;>30 :>=D83C@0F88. 1KG=> 'xapiandb'.–The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelWH<5=0 :0B0;>3>2, :>B>@K5 8=45:A8@>20=85 >1>94QB.<br>>65B A>45@60BL H01;>=K. 1O70=> ?>4E>48BL : ?CBO<, :>B>@K5 2848B 8=45:A0B>@ (=0?@8<5@, 5A;8 topdirs 2:;NG05B '/home/me' 8 '/home' O2;O5BAO AAK;:>9 =0 '/usr/home', B> ?@028;L=0O 70?8AL 4>;6=0 1KBL '/home/me/tmp*', 0 =5 '/usr/home/me/tmp*')#These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelW"@>F5=B 70=OB>AB8 48A:0, ?@8 :>B>@>< 8=45:A8@>20=85 1C45B ?@5@20=> (2> 871560=85 70?>;=5=8O 4>ABC?=>3> <5AB0).<br>1KG=>: 0 (>B:;NG05B ?@>25@:C).—This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).
0 means no limit (this is the default).confgui::ConfTopPanelWD-B> 7=0G5=85 >?@545;O5B :>;8G5AB2> ?@>8=45:A8@>20==KE 40==KE <564C A1@>A0<8 =0 48A:.<br>><>305B :>=B@>;8@>20BL 8A?>;L7>20=85 ?0<OB8 ?@8 8=45:A0F88. 1KG=> 10Mb ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelW¢-B> 7=0G5=85 >?@545;O5B ?>4@>1=>ABL A>>1I5=89,<br>>B >H81>: 4> >B;04>G=KE 40==KE.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW&=45:A8@C5<K5 ?0?:8Top directoriesconfgui::ConfTopPanelW:A?>;L7>20BL A8AB5<=CN 'file'Use system's 'file' commandconfgui::ConfTopPanelW®A?>;L7>20BL A8AB5<=CN :><0=4C 'file' <br>?@8 A1>5 2=CB@5==53> >?@545;8B5;O B8?>2 MIME.NUse the system's 'file' command if internal
mime type identification fails.confgui::ConfTopPanelW&B<5=0&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase„>8A: [rolling stones] (420 A;>20) 1C45B 87<5=Q= =0 [rolling 8;8 stones 8;8 (rolling phrase 2 stones)]. -B> <>65B ?>4=OBL @57C;LB0BK, 4;O :>B>@KE A;>20 A;54CNB 8<5==> 2 B>< ?>@O4:5, :0: 22545=K.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBaseH 0745;8B5;L D@03<5=B>2 2 @57C;LB0B0EAbstract snippet separatoruiPrefsDialogBase:;NG8BL 2A5 Activate AlluiPrefsDialogBase>1028BL 8=45:A Add indexuiPrefsDialogBase&@8<5=8BL 87<5=5=8O Apply changesuiPrefsDialogBaseP0G8=0BL ?@>AB>9 ?>8A: ?> 22>4C ?@>15;0.-Auto-start simple search on whitespace entry.uiPrefsDialogBase`2B><0B8G5A:8 4>102;OBL D@07C ?@8 ?@>AB>< ?>8A:5+Automatically add phrase to simple searchesuiPrefsDialogBaseT>@>3 G0AB>BK B5@<>2 02B>D@07K 2 ?@>F5=B0E.Autophrase term frequency threshold percentageuiPrefsDialogBaseK1@0BLChooseuiPrefsDialogBase K1>@ @540:B>@>2Choose editor applicationsuiPrefsDialogBaset06<8B5, GB>1K 4>1028BL 5IQ >4=C ?0?:C A 8=45:A>< 2 A?8A>:0Click to add another index directory to the listuiPrefsDialogBase4$>@<0B 40BK ?> strftime(3)Date format (strftime(3))uiPrefsDialogBaseK:;NG8BL 2A5Deactivate AlluiPrefsDialogBase$B<5=8BL 87<5=5=8ODiscard changesuiPrefsDialogBaseÞ>:07K20BL D8;LB@ :0B53>@88 4>:C<5=B0 2 2845 2K?040NI53> A?8A:0, 0 =5 ?0=5;8 A :=>?:0<8 (B@51C5BAO ?5@570?CA:).KDisplay category filter as toolbar instead of button panel (needs restart).uiPrefsDialogBasef!>74020BL ;8 :>=A?5:B, 5A;8 4>:C<5=B C65 8<55B 53>?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBase !;54C5B ;8 ?KB0BLAO ?>AB@>8BL :>=A?5:B 87 =0945==KE 4>:C<5=B>2, >?8@0OAL =0 :>=B5:AB :;NG52KE A;>2? >65B 1KBL <54;5==K< 4;O 1>;LH8E 4>:C<5=B>2.zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBase@8=0<8G5A:>5 2K45;5=85 :>=A?5:B0Dynamically build abstractsuiPrefsDialogBaseD@028BL HTML-703>;>2>: @57C;LB0B>2#Edit result page html header insertuiPrefsDialogBaseR@028BL AB@>:C D>@<0B8@>20=8O @57C;LB0B>2#Edit result paragraph format stringuiPrefsDialogBase:;NG8BLEnableuiPrefsDialogBase=5H=85 8=45:AKExternal IndexesuiPrefsDialogBase>@>3 G0AB>BK 2 ?@>F5=B0E, ?>A;5 :>B>@>3> <K =5 8A?>;L7C5< B5@<K 2 02B>D@075. '0ABK5 B5@<K O2;ONBAO ACI5AB25==>9 ?@>1;5<>9 ?@>872>48B5;L=>AB8 =0 D@070E. @>?CI5==K5 B5@<K 4>?>;=ONB ?@>A04:C D@07K 8 C<5=LH0NB MDD5:B82=>ABL $. =0G5=85 ?> C<>;G0=8N - 2 (?@>F5=B0). þFrequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). uiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBase"@OB0BL 4C1;8:0BKHide duplicate results.uiPrefsDialogBase8&25B 2K45;5=8O :;NG52KE A;>2Highlight color for query termsuiPrefsDialogBase¦>:07K20BL @57C;LB0BK A B5< 65 A>45@60=85< ?>4 @07=K<8 8<5=0<8 =5 1>;55 >4=>3> @070XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBase!B@>:8 B5:AB0 PRE =5 ?5@5=>AOBAO. A?>;L7>20=85 BR B5@O5B G0BL >BABC?>2.BLines in PRE text are not folded. Using BR loses some indentation.uiPrefsDialogBaser0:A8<0;L=K9 >1JQ< B5:AB0 A 2K45;5=85< ?@8 ?@>A<>B@5 (1)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseT>;8G5AB2> 70?8A59 =0 AB@0=8FC @57C;LB0B>2"Number of entries in a result pageuiPrefsDialogBasebB:@K205B 480;>3 2K1>@0 H@8DB0 A?8A:0 @57C;LB0B>2-Opens a dialog to select the result list fontuiPrefsDialogBaseDB:@KBL 480;>3 2K1>@0 D09;0 AB8;59-Opens a dialog to select the style sheet fileuiPrefsDialogBaseT@54?>G8B0BL HTML B5:ABC 4;O ?@54?@>A<>B@0&Prefer Html to plain text for preview.uiPrefsDialogBaseh038G5A:85 @0AH8@5=8O 8<5=8 D09;0 4;O O7K:0 70?@>A>2(Query language magic file name suffixes.uiPrefsDialogBase>0?><=8BL A>AB>O=85 A>@B8@>2:8.Remember sort activation state.uiPrefsDialogBaseb#40;8BL 87 A?8A:0. =45:A =0 48A:5 157 87<5=5=89.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase$#40;8BL 2K45;5==K5Remove selecteduiPrefsDialogBaseX0<5I0BL :>=A?5:B, A>45@60I89AO 2 4>:C<5=B0E Replace abstracts from documentsuiPrefsDialogBase5@=CBLResetuiPrefsDialogBase`#AB0=02;8205B H@8DB A?8A:0 @57C;LB0B>2 2 >1KG=K91Resets the result list font to the system defaultuiPrefsDialogBase45@=CBL AB8;8 ?> C<>;G0=8N!Resets the style sheet to defaultuiPrefsDialogBase$!?8A>: @57C;LB0B>2 Result ListuiPrefsDialogBase0(@8DB A?8A:0 @57C;LB0B>2Result list fontuiPrefsDialogBase 0@0<5B@K ?>8A:0Search parametersuiPrefsDialogBaseZB:@K20BL 480;>3 A;>6=>3> ?>8A:0 ?@8 70?CA:5.'Start with advanced search dialog open.uiPrefsDialogBase/7K: A;>2>D>@<Stemming languageuiPrefsDialogBase01>@ AB8;59 Style sheetuiPrefsDialogBase >=B5:AB=KE A;>2 Synthetic abstract context wordsuiPrefsDialogBaseT 07<5@ A>740205<>3> :>=A?5:B0 (2 A8<2>;0E)$Synthetic abstract size (characters)uiPrefsDialogBase²"5:ABK 1>;LH53> @07<5@0 =5 1C4CB ?>4A25G820BLAO ?@8 ?@5420@8B5;L=>< ?@>A<>B@5 (<54;5==>).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase”!;>20 2 A?8A:5 1C4CB 02B><0B8G5A:8 ?@5>1@07>20=K : 284C ext:xxx 2 70?@>A5.bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase,5@5:;NG8BL 2K45;5==K5Toggle selecteduiPrefsDialogBaseÖA?>;L7>20BL B538 <PRE> 2<5AB> <BR> 4;O >B>1@065=8O >1KG=>3> B5:AB0 :0: HTML ?@8 ?@5420@8B5;L=>< ?@>A<>B@5.GUse

 tags instead of 
to display plain text as html in preview.uiPrefsDialogBase„A?>;L7>20BL 45A:B>?=K5 =0AB@>9:8 4;O 2K1>@0 @540:B>@0 4>:C<5=B>2.2Use desktop preferences to choose document editor.uiPrefsDialogBase=B5@D59AUser interfaceuiPrefsDialogBase@54?>GB5=8OUser preferencesuiPrefsDialogBaseˆ ý) ÿý, recoll-1.17.3/qtgui/i18n/recoll_tr.qm000644 001750 000000 00000075053 11757435371 017747 0ustar00dockeswheel000000 000000 <¸dÊÍ!¿`¡½ÝBX+FM-Fz+;^b¨¥,+Lô.½¬=ÃEîn $—2ê*Ð%$*ì0$5+Lô _1ø ‚G…Ôk“Gß'‰H6ó:ÄH6õ:ñJ+‚ ±J+‚5êJ6••J6•CWÈÕ XÉÄl\e® sºñ™sºñ"¦v8“ ‚v®Âv®Â"×zϳ²€€£dh0œHÍA~Ðùƒ!ïÐùƒ>0ÐùƒAíEµ!&`Ž]0,…H>.cyXM¹hU‘vãaý•ñ“(œW­D$£cêhÎxC ¹ÞñƒLó L¤þSI4ÈÿµG2 çã#¸ÎQmp#evå ;w 5,Yw 54‘w 58w€¢#3BŒUFâ©Ö³=ìª6•:Z»f3%Éͼuiê•Ê5Mì;UTúU Uúeî B ¬r&Ág<.‡Nã7ÎW$?úd*T?úd/JJUYÒJUY.Y ô<‚z ÓBªº™omÝôLdã¿;gìxG¤þA¢+4LƒCÏ€ã‡Ù˜I¼ …™n•3štµêŸf•>æŸf•FŸf•cÚ«&½«6Ú#g»ãX|F§ -ZVzÏ;â-¼+‚)ÖTl•BìS9 r?),ÆržI‹¦,*"‹Üð<ߌÇ<%ÿ›ˆ˜8¦ASåªÃ¢ É·¨ 2”»œR;Ç¢•-„Ç¢•0Ç¢•1AØ~CëðŒµn `³)¸" 80UKômNp ha¸—B àšKOL¦ %A¦öõg¶7/‹ÊXÔ þZýCc1FW#8´F¯Ne¦ŒÍw,”ŒÍw/ÛŒÍw1ŒÏ—.ën-“’žbZ²ð -ײð 0b²ð 1Ÿ´ù€K¹Ɇtpê áù?QçÇÐ}}k”ò“nýœ .n¨0ÎPPÄ7ÃÌí³ Í³/ÝÜ\,äœc‡ö¨åIsú Ãr[ ´H#O 9Zy7c K¨ó) ®œ¯dÁ ü>j_ äî' Üc† ).~$h +<”J² 6 ™ `P¨ `ç£ c·E( y  ˜Iœ^) ²ëC.` ²ëC0¦ ²ëC1í âæç'¶ åKÄ\~ ®&ï ®ù'< TH§ ŽÚ à h¹° õ tÓ9S: ¨Î£(U »ïµ Û·å)s 'И&S 97Ãj PÖ™ RVŽ!‹ T#œ VüIÕ \iCkà `F¥Æ ©zóÌ Ú÷=f Ýøìab ö†À:Š zs/ 8þ^— FÁb y·@× ‚±3¶ ‡u5 ‰PØ ‰P! 5di¢ ’ãnCI ÕH û£=€h /¸.ô<Þoý=Â$ÕG7Ò ˆJ›XPÎq3bÙ#pún%zc2U‚3.3‚3.6O“Ýè@›P¾ ̦Àè+ܶéHùɾ„Ë“J);EQá~jÞY~s%s[žs*ág3(ÈÕ Y( ‚´ µ“Ã5”Â|“m°âî£*™ó l#ü©Üåü¶L'ir¹Tüm ifadeler All clauses AdvSearch00fadelerin herhangi biri Any clause AdvSearchortamlarmedia AdvSearchiletilermessages AdvSearch dierother AdvSearchsunumlar presentations AdvSearchhesap tablolar1 spreadsheets AdvSearchmetinlertexts AdvSearch<----- Tümü <----- All AdvSearchBase<----- Seç <----- Sel AdvSearchBase0fade ekle Add clause AdvSearchBaseGeli_mi_ aramaAdvanced search AdvSearchBaseTümü ----> All ----> AdvSearchBase GözatBrowse AdvSearchBase"Kategorilere göre By categories AdvSearchBase‚Dosya tipleri üzerinde filtreleme kullanmak için bunu i_aretleyin,Check this to enable filtering on file types AdvSearchBase²Dosya tipleri yerine ham mime tipleri üzerinde filtreleme kullanmak için bunu i_aretleyin;Check this to use file categories instead of raw mime types AdvSearchBase KapatClose AdvSearchBase0fadeyi sil Delete clause AdvSearchBase<Arama için en üst dizini girinEnter top directory for search AdvSearchBase0Yoksay1lan dosya tipleriIgnored file types AdvSearchBase6Dosya tiplerini s1n1rland1rRestrict file types AdvSearchBaselArama sonuçlar1n1 bu dizin ve a_a1s1 ile s1n1rland1r:%Restrict results to files in subtree: AdvSearchBase.öntan1ml1 olarak kaydetSave as default AdvSearchBase4Uyan <br>belgeleri<br>ara:'Search for
documents
satisfying: AdvSearchBase(Aranan dosya tipleriSearched file types AdvSearchBaseSeç -----> Sel -----> AdvSearchBaseAramay1 Ba_lat Start Search AdvSearchBaseZYap1land1rma içerisinde veritaban1 dizini yok No db directory in configurationMain&Sonraki&NextPreview&Önceki &PreviousPreview A&ra: &Search for:PreviewD^unun için iç gösterim yap1lam1yor0Can't turn doc into internal representation for Preview 0ptalCancelPreviewTemizleClearPreviewSekmeyi Kapat Close TabPreview8Önizleme metni olu_turuluyorCreating preview textPreviewNÖnizleme metni düzenleyiciye yükleniyor Loading preview text into editorPreviewE_le_me ^a&rt1 Match &CasePreview0Yard1mc1 program kay1p: Missing helper program: Preview<<b>Özelle_tirilmi_ alt aaçlarCustomised subtreesQObjectæ<i>A_a1daki parametreler, ya seçili alt dizin için uygulan1r ya da üst düzeyde veya üstteki metin kutusunda hiçbir _ey seçilmediinde yada bo_ bir sat1r seçildiinde uygulan1r.<br>+/- dümelerine t1klayarak dizinleri ekleyip ç1karabilirsiniz.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject.Öntan1ml1 karakter setiDefault character setQObject4Sembolik balant1lar1 izleFollow symbolic linksQObjectè0ndekslerken sembolik balant1lar1 izle. Ayn1 ögelerin yeniden indekslenmesinden kaç1nmak için öntan1ml1 deer hay1rTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject$Genel parametrelerGlobal parametersQObject:Tüm dosya isimlerini indeksleIndex all file namesQObjectÐ0çerii tan1nmayan ya da i_lenemeyen (ya da desteklenmeyen mime tipi) dosyalar1 indeksle. Öntan1ml1 evet}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject$Yerel parametrelerLocal parametersQObjectAtlanan isimler Skipped namesQObject0ndekslenmi_ s1ralama içerisindeki alt dizinlerin listesi <br>ki burada baz1 parametrelerin yeniden tan1mlanmas1 gerekir. Öntan1ml1: bo_.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObject‚Bu nitelikler insekslenmemesi gereken dosya ve dizinler içindir.LThese are patterns for file or directory names which should not be indexed.QObject|Bu karakter seti, karakter kodlamas1 uygulama taraf1ndan belirlenemeyen dosyalar için kulan1l1r, Örnein salt metin dosyalar1.<br>Öntan1ml1 deer bo_tur ve NLS çevresel dei_keni kullan1l1r.ÒThis is the character set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObject Uyar1WarningRTIToolW(tüm diller)(all languages)RclMain2(kök ayr1_t1rma kullanma) (no stemming)RclMainRecoll Hakk1nda About RecollRclMain%1 için uygun olmayan komut: [%2] Lütfen mimeconf dosyas1n1 kontrol edinCBad viewer command line for %1: [%2] Please check the mimeconf fileRclMainDÖnizleme penceresi olu_turulam1yorCan't create preview windowRclMainbBelge aç1lamad1 ya da geçici dosya olu_turulamad10Cannot extract document or create temporary fileRclMainPVeritaban1ndan belge bilgileri al1namad1+Cannot retrieve document info from databaseRclMainKapat1l1yorClosingRclMainBelge geçmi_iDocument historyRclMain"Çal1_t1r1l1yor: [ Executing: [RclMainGeçmi_ verileri History dataRclMain20ndeksleme devam ediyor: Indexing in progress: RclMainTemizlePurgeRclMainSorgu detaylar1 Query detailsRclMainArama Sonuçlar1 Query resultsRclMain.KökAyr1_t1rmaVeritaban1StemdbRclMain4Bu arama atr1k etkin deil"This search is not active any moreRclMainBilinmeyenUnknownRclMain Uyar1WarningRclMainxsözcük kökleri ayr1_t1r1labilir diller al1n1rken hata olu_tu#error retrieving stemming languagesRclMainortamlarmediaRclMain dierotherRclMain &Recoll Hakk1nda &About Recoll RclMainBase&Geli_mi_ arama&Advanced Search RclMainBase0&Belge geçmi_ini temizle&Erase document history RclMainBase &Dosya&File RclMainBase&Yard1m&Help RclMainBase60&ndeksleme yap1land1rmas1 &Indexing configuration RclMainBase&Tercihler &Preferences RclMainBase*&Sorgu yap1land1rmas1&Query configuration RclMainBase&&S1ralama Ölçütleri&Sort parameters RclMainBase&Araçlar&Tools RclMainBase(&Kullan1c1 El Kitab1 &User manual RclMainBase2Geli_mi_/karma_1k AramaAdvanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBaseBelge Geçmi_iDocument History RclMainBaseBelge &Geçmi_iDocument &History RclMainBase&Ç1kE&xit RclMainBase.D1_ indeksler penceresiExternal index dialog RclMainBase0lk sayfa First page RclMainBase8Sonuçlar1n ilk sayfas1na gitGo to first page of results RclMainBaseSonraki sayfa Next page RclMainBase4Sonuçlar1n sonraki sayfas1Next page of results RclMainBaseÖnceki sayfa Previous page RclMainBase2Sonuçlar1n önceki sayfas1Previous page of results RclMainBase RecollRecoll RclMainBaseSonuç listesi Result list RclMainBaseArama araçlar1 Search tools RclMainBase$S1ralama ölçütleriSort parameters RclMainBase 0fade g&östericiTerm &explorer RclMainBase(0fade gösterme arac1Term explorer tool RclMainBase"0ndeksi g&üncelle Update &index RclMainBase TarihDate RecollModelDosya ad1 File name RecollModel&Önizle&PreviewResList (sorguyu göster) (show query)ResList<<p><b>Sonuç bulunamad1</b><br>

No results found
ResList(&Dosya Ad1n1 KopyalaCopy &File NameResList&Adresi Kopyala Copy &URLResListBelge geçmi_iDocument historyResList*Benzer belgeleri &bulFind &similar documentsResListSonrakiNextResList ÖnizlePreviewResList ÖncekiPreviousResListSonuç listesi Result listResList Eri_ilemez belgeUnavailable documentResList&Önizle&PreviewResTable(&Dosya Ad1n1 KopyalaCopy &File NameResTable&Adresi Kopyala Copy &URLResTable*Benzer belgeleri &bulFind &similar documentsResTable&Önizle&PreviewResTableDetailArea(&Dosya Ad1n1 KopyalaCopy &File NameResTableDetailArea&Adresi Kopyala Copy &URLResTableDetailArea*Benzer belgeleri &bulFind &similar documentsResTableDetailAreaTüm sözcükler All termsSSearch2Sözcüklerin herhangi biriAny termSSearch,Uygunsuz arama ifadesiBad query stringSSearchTamamlamalar CompletionsSSearch®Aranacak ifadeleri buraya girin. Geçerli sözcüün tamamlanmas1 için ESC SPACE kullan1n.FEnter search terms here. Type ESC SPC for completions of current term.SSearchDosya ad1 File nameSSearchYetersiz bellek Out of memorySSearchArama diliQuery languageSSearchBir öge seçin:Select an item:SSearch&Çok fazla tamamlamaToo many completionsSSearchTemizleClear SSearchBase Ctrl+SCtrl+S SSearchBase®Aranacak ifadeleri buraya girin. Geçerli sözcüün tamamlanmas1 için ESC SPACE kullan1n.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase.Arama girdisini temizleErase search entry SSearchBaseSSearchBase SSearchBase SSearchBaseAraSearch SSearchBaseSorguyu ba_lat Start query SSearchBaseDosya ad1 File name SearchClauseW‚Seçilen sözcüklerin aras1nda yer alabilecek ek sözcüklerin say1s1HNumber of additional words that may be interspersed with the chosen ones SearchClauseWZSözcükler ile kullan1lacak sorgu biçimini seç>Select the type of query that will be performed with the words SearchClauseW &Kapat&Close SpellBase&Geni_let &Expand  SpellBase Alt+KAlt+C SpellBase Alt+GAlt+E SpellBase0fade Gösterici Term Explorer SpellBaseHAspell heceleme geni_lemesi hatas1. Aspell expansion error. SpellW\Aspell ba_lat1lamad1. Yüklenmemi_ olabilir mi?)Aspell init failed. Aspell not installed?SpellW0Hiç geni_leme bulunamad1No expansion foundSpellWDüzenli ifadeRegexpSpellW Heceleme/FonetikSpelling/PhoneticSpellW4Kök ayr1_t1rma geni_lemesiStem expansionSpellW 0fadeTermSpellW Özel karakterler WildcardsSpellWxsözcük kökleri ayr1_t1r1labilir diller al1n1rken hata olu_tu#error retrieving stemming languagesSpellW GözatChoose UIPrefsDialog”Xapian indeks dizinini seç (/home/kullan1c1_ad1n1z/.recoll/xapiandb gibi.)@Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) UIPrefsDialoglSeçilen dizin bir Xapian indeks dizini gibi görünmüyor;The selected directory does not appear to be a Xapian index UIPrefsDialogRSeçilen dizin zaten indeks listesinde var3The selected directory is already in the index list UIPrefsDialog0Bu ana/yerel veritaban1!This is the main/local index! UIPrefsDialogxsözcük kökleri ayr1_t1r1labilir diller al1n1rken hata olu_tu#error retrieving stemming languages UIPrefsDialogRFarkl1 deerlerle eylemler dei_tiriliyor.Changing actions with different current values ViewAction$Davran1_1 Dei_tir Change ActionViewActionBase KapatCloseViewActionBase$Doal GöstericilerNative ViewersViewActionBaseæBir ya da birkaç dosya tipi seçin ve Eylemi Dei_tir dümesine t1klayarak hangi uygulama ile aç1laca1n1 dei_tirinbSelect one or several file types, then click Change Action to modify the program used to open themViewActionBase>Yap1land1rma dosyas1 yaz1lamad1Can't write configuration fileconfgui::ConfIndexW GözatChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLW GenelGlobalconfgui::ConfSubPanelWAspell diliAspell languageconfgui::ConfTopPanelW0Veritaban1 dizininin ad1Database directory nameconfgui::ConfTopPanelW20ndex düzeltme MB aral11Index flush megabytes intervalconfgui::ConfTopPanelW*Günlük dosyas1n1n ad1 Log file nameconfgui::ConfTopPanelW:Günlük dosyas1 ayr1nt1 düzeyiLog verbosity levelconfgui::ConfTopPanelW8En yüksek disk kullan1m1 (%)Max disk occupation (%)confgui::ConfTopPanelW(Aspell kullan1m1 yokNo aspell usageconfgui::ConfTopPanelWAtlanan yollar Skipped pathsconfgui::ConfTopPanelWLSözcük kökleri ayr1_t1r1labilir dillerStemming languagesconfgui::ConfTopPanelWŒ0letilerin yaz1laca1 dosya.<br>Uçbirim ç1kt1s1 için 'stderr' kullan1nPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelW6Aspell sözlükleri için dil. Bu 'en' ya da 'fr' gibi olmal1d1r ...<br>Eer bu deer ayarlanmazsa _imdi kulland1n1z NLS çevresel dei_keni kullan1lacakt1r. Sisteminizde neyin yüklü olduu hakk1nda bilgi almak için 'aspell config' yaz1p 'data-dir' içerisindeki .dat dosyalar1na bak1n. 2The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelWKök ayr1_t1rma geni_lemesi için sözlükleri<br>in_a edilecek olan diller.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW¦Özyinelemeli indesklemenin ba_layaca1 dizinlerin listesi. Öntan1ml1: ev dizininiz.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelW 0ndeksin duraca1 dizinin ad1<br>Eer tam yol verilmezse yol yap1land1rma dizinine göre belirlenecek. Öntan1ml1 dizin ad1 'xapiandb'.–The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelWœBunlar indekslemenin girmeyecei dizinlerin adlar1d1r.<br> * gibi özel karakterler içerebilir. 0ndeksleyici taraf1ndan görülen yollar ile e_le_melidir (örnein: eer en üst dizinler '/home/ben' ve '/home' içeriyorsa ve home '/usr/home' dizinine balant1l1 ise atlanacak dizin yolu '/home/me/tmp*' olmal1d1r, '/usr/home/me/tmp*' deil)#These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelWBBu disk kullan1m1n1n yüzdesidir ki bu orana eri_ildiinde indeksleme durdurulur (diskin doldurulmas1n1 engellemek için).<br>0 k1s1tlama yok demektir (Öntan1ml1).—This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).
0 means no limit (this is the default).confgui::ConfTopPanelWBu deer diske gönderilecek indekslenmi_ veri miktar1n1 ayarlar.<br>Bu indeksleyicinin bellek kullan1m1n1 kontrol etmeye yarar. Öntan1ml1 10MB ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWªBu deer ileti boyutunu ayarlar,<br>sadece hatalardan hata ay1klama verilerine kadar.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelWÜst dizinlerTop directoriesconfgui::ConfTopPanelWBSistemdeki 'file' komutunu kullanUse system's 'file' commandconfgui::ConfTopPanelWª0ç mime tipi belirleme i_lemi ba_ar1s1z olursa<br> sistemdeki 'file' komutunu kullan.NUse the system's 'file' command if internal
mime type identification fails.confgui::ConfTopPanelW &0ptal&CanceluiPrefsDialogBase &TAMAM&OKuiPrefsDialogBaseÔ[linux kernel] (2 sözcük) aramas1 [linux veya kernel veya (linux ifadesi 2 tane kernel)] olarak dei_tirilecektir. Bu, aranacak sözcüklerin tam olarak girildii gibi görüntülendii sonuçlara yüksek öncelik verilmesini salayacakt1r.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBase$Tümünü Etkinle_tir Activate AlluiPrefsDialogBase0ndeks ekle Add indexuiPrefsDialogBase*Dei_iklikleri uygula Apply changesuiPrefsDialogBase„Beyaz alan girdisi olduunda basit aramay1 otomatik olarak ba_lat.-Auto-start simple search on whitespace entry.uiPrefsDialogBaseXBasit aramalara ifadeyi otomatik olarak ekle+Automatically add phrase to simple searchesuiPrefsDialogBase GözatChooseuiPrefsDialogBase$Tümünü Pasifle_tirDeactivate AlluiPrefsDialogBase$Dei_iklikleri silDiscard changesuiPrefsDialogBasezBelgenin bir özeti varsa bile bir yapay özet olu_turulsun mu?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseöSorgu sözcükleri kullan1larak sonuç listesi girdileri için özet olu_turulsun mu ? Büyük boyutlu belgelerde yava_ olabilir.zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBase>Özetleri dinamik olarak olu_turDynamically build abstractsuiPrefsDialogBaseD1_ indekslerExternal IndexesuiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBasedÖnizlemede vurgulanacak en fazla metin boyutu (MB)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseFBir sonuç sayfas1ndaki sonuç say1s1"Number of entries in a result pageuiPrefsDialogBasejSonuç listesi yaz1tipini seçmek için bir pencere açar-Opens a dialog to select the result list fontuiPrefsDialogBase:S1ralama kurallar1n1 hat1rla.Remember sort activation state.uiPrefsDialogBaseXListeden sil. Bu diskteki indeksi etkilemez.7Remove from list. This has no effect on the disk index.uiPrefsDialogBaseSeçileni silRemove selecteduiPrefsDialogBase6Belgelerden özetleri kald1r Replace abstracts from documentsuiPrefsDialogBaseS1f1rlaResetuiPrefsDialogBasebSonuç listesi yaz1tipini sistem ayarlar1na döndür1Resets the result list font to the system defaultuiPrefsDialogBase,Sonuç listesi yaz1tipiResult list fontuiPrefsDialogBase&Arama parametreleriSearch parametersuiPrefsDialogBaseFGeli_mi_ arama penceresi ile ba_la.'Start with advanced search dialog open.uiPrefsDialogBase&Kök ayr1_t1rma diliStemming languageuiPrefsDialogBase*Yapay özet sözcükleri Synthetic abstract context wordsuiPrefsDialogBaseFYapay özet boyutu (karakter say1s1)$Synthetic abstract size (characters)uiPrefsDialogBase„Bu boyuttan büyük metinler önizlemede vurgulanmayacak (çok yava_).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBaseSeç /B1rakToggle selecteduiPrefsDialogBasezBelge düzenleyiciyi seçmek için masaüstü tercihlerini kullan.2Use desktop preferences to choose document editor.uiPrefsDialogBase"Kullan1c1 arayüzüUser interfaceuiPrefsDialogBase(Kullan1c1 tercihleriUser preferencesuiPrefsDialogBaserecoll-1.17.3/qtgui/i18n/recoll_uk.qm000644 001750 000000 00000103562 11757435371 017736 0ustar00dockeswheel000000 000000 <¸dÊÍ!¿`¡½ÝBH+M-MA+;goH,ÓH,,‘H,@&mb6û¨¥2¸Lô5‘f¾5Á¬ER¬ô(AEîyú$—:p'Hä7*Ð%)k*ì0)š+Lô G1ø ’:Îd&ÑG…Ôw‚Gß-˜H6óBžJ+‚ çJ+‚=±J6•ûJ6•JrWÈÕ#âXÉÄxie®Wsºñ{sºñ' v8“$Vv®Âòv®Â'qzϳ–€€£mW0œS>ÍH•Ðùƒ&XÐùƒE­ÐùƒIãnN>Eµ%3&`Žf0,…Rî>.c¢XM¹s–nÚX‘vãjÀ•ñ“QœW­Jû£cê tÎxC¼Þñƒ­ó L—þSI<.ÿµPJ ç #¸Î[„p#[vå$w 52äw 5;õw 5@Q€¢#:ÆŒUOú©Ö³E{ª6•B0»f3+ͼutSÐgž'šê•Ê<½ì;U`úU—úeî R ¬~n&ÁpS.‡ND7Î`‘?úd0¯?úd6ZJUY ÜJUY4©Y ôD3z ÓIº™{tÊ—¥'6Ôä^qlÝôLm ã¿CìxRiþA¢1¥çÞ=XLƒJ¨€ã‡é˜I¼ ³™n•#štµøŸf•F%Ÿf•LÔŸf•lk«,º«=âÚ#pÌãX|Mn -Z ŽzÏC-¼1ù)ÖTx¢B9€PªBìSAfr?)3]ržP‹¦,0}‹ÜðDŠŒÇ<+Ë›ˆ˜?±¦AS ªÃ¢$¡·¨ :0»œRBËÇ¢•4Ç¢•7œÇ¢•8ߨ~C 1ðŒµz£`³0 " ?ãUKôy=p hjw–T# —BšKY¦ %9¦öõE¶76¥ÊXÔ þd(CkÀFW#@F¯Nn“ŒÍw3!ŒÍw7_ŒÍw8˜ŒÏ—5ñn3¥“’žk¦š´'زð 4h²ð 7ô²ð 9A´ù€V>Ót( Ɇt}; áùF]:uîu’QçÇO}}à”ò“zöœ .i¨0ÎZsÄ?pÌí³ zͳ6$ÝÜe1äœcéö¨åT(ú Ã~´ ´H(® 9Zy? K¨ó/J ]#—#t ®œ¯mª ²9M± ü>vB äî( ÜcF ).~)Ï +<”UQ 6  © `P"½ `ç£ c·E.2 yD ˜Iœg2 ²ëC50 ²ëC86 ²ëC9 Áùš!h Äã4ù âæç-É åKÄe ®,ì ®ù-A TH‡ ŽÚ ³ T|c*Ü h¹° ë tÓ9]' ¨Î£.x »ïµ  Û·å/¸ ÛÓl§ 'И,! /¥# 97Ã^ PÖ™ RVŽ%¡ T#û VüT” \iCw× `F¥0 ©zó´ Ú÷E Ýøìj- é—~rH ö†ÀBd zs 8þgž FÁ"} m†CqÉ y·Gþ y¹~ ‚±3¤ ‡u<} ‰PÕ ‰P& 5dtÝ ’ãnJ, ÕHy û£D»€q"/¸.Ô<Þ|=Â*:G7Ò¾J›!,XPÎ}–bÙ(üpún*€zc9ù‚3.;‚3.>“ÝèGW›P¾ ̦Àè2k¶éS¢ÆÀè%Ôɾ—Ë“Tì;LFQá~v¿Y~s+3[žs1Ng3.ÿÕ bY ‚´µ“Ã<øÂ|“y£ÎÁ'$Ûâî£0þó l(kü©ÜÅü¶Li~þAV ?>;O All clauses AdvSearchC4L-O:5 ?>;5 Any clause AdvSearch<C;LB8<54V0media AdvSearch?>2V4><;5==Omessages AdvSearchV=H5other AdvSearch?@575=B0FVW presentations AdvSearchB01;8FV spreadsheets AdvSearch B5:AB8texts AdvSearch<----- AV <----- All AdvSearchBase<----- 81 <----- Sel AdvSearchBase>40B8 ?>;5 Add clause AdvSearchBase!:;04=89 ?>HC:Advanced search AdvSearchBaseAV -----> All ----> AdvSearchBaseÞAV =5?CABV ?>;O 1C45 >1'T4=0=> 70 4>?><>3>N  ("CAV A;>20") 01> " ("1C4L-O:V A;>20").<br>>;O B8?C "1C4L-O:V A;>20", "CAV A;>20" B0 "157 F8E A;V2" ?@89<0NBL AC<VH A;V2 B0 D@07 C ?>42V9=8E ;0?:0E.<br>>;O 157 40=8E =5 15@CBLAO 4> C2038.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBase5@53;O4Browse AdvSearchBase> :0B53>@VOE By categories AdvSearchBaseT8:>@8AB>2C20B8 DV;LB@0FVN ?> B8?0E D09;V2,Check this to enable filtering on file types AdvSearchBaseX8:>@8AB>2C20B8 :0B53>@VW 70<VABL B8?V2 MIME;Check this to use file categories instead of raw mime types AdvSearchBase0:@8B8Close AdvSearchBase@81@0B8 ?>;5 Delete clause AdvSearchBase0(C:0B8 BV;L:8 C :0B0;>7VEnter top directory for search AdvSearchBase3=>@>20=VIgnored file types AdvSearchBase(1<568B8 B8?8 D09;V2Restrict file types AdvSearchBaseJ1<568B8 ?>HC: ?> D09;0E 7 ?V445@520:%Restrict results to files in subtree: AdvSearchBase$15@53B8 O: B8?>2VSave as default AdvSearchBaseT(C:0B8<br>4>:C<5=B8,</br>I> 704>2V;L=ONBL:'Search for
documents
satisfying: AdvSearchBase 060=VSearched file types AdvSearchBase81 -----> Sel -----> AdvSearchBase (C:0B8 Start Search AdvSearchBaseB :>=DV3C@0FVW =5<0T :0B0;>3C   No db directory in configurationMain&0ABC?=5&NextPreview&>?5@54=T &PreviousPreview&(C:0B8: &Search for:Preview|5<>6;82> ?5@5B2>@8B8 4>:C<5=B =0 2=CB@VH=T ?@54AB02;5==O 4;O 0Can't turn doc into internal representation for PreviewV4<V=8B8CancelPreview !B5@B8ClearPreview0:@8B8 2:;04:C Close TabPreview6!B2>@NN B5:AB 4;O ?5@53;O4CCreating preview textPreviewJ020=B06CN B5:AB ?5@53;O4C 2 @540:B>@ Loading preview text into editorPreview,&'CB;82VABL 4> @5TAB@C Match &CasePreview@5 7=0945=> 4>?><V6=C ?@>3@0<C: Missing helper program: Preview>:07C20B8 ?>;O Show fieldsPreviewTextEdit2>:07C20B8 >A=>2=89 B5:ABShow main textPreviewTextEdit:<b>V445@520 7 =0;0HBC20==O<8Customised subtreesQObjecth<i>86G5=02545=V ?0@0<5B@8 7<V=NNBLAO 01> =0 25@E=L><C @V2=V, O:I><br>=5 281@0=> =VG>3> 01> ?CAB89 @O4>:, 01> 4;O 281@0=>W B5:8.<br>8 <>65B5 4>40B8 01> ?@81@0B8 B5:8 :=>?:0<8 +/-.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject "8?>25 :>4C20==ODefault character setQObject> >7:@820B8 A8<2>;VG=V ?>A8;0==OFollow symbolic linksQObject’%>48B8 ?> A8<;V=:0E ?@8 V=45:A0FVW. "8?>2> "=V" 4;O C=8:=5==O 4C1;V:0BV2TFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject$030;L=V ?0@0<5B@8Global parametersQObject8=45:AC20B8 2AV =0728 D09;V2Index all file namesQObject =45:AC20B8 B0:>6 =0728 D09;V2, 2<VAB O:8E =5 <>65 1CB8 2?V7=0=> G8 >1@>1;5=> (=52V4><89 01> =5?V4B@8<C20=89 B8? MIME). "8?>2> "B0:"}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject"VAF52V ?0@0<5B@8Local parametersQObject @>?CA:0B8 =0728 Skipped namesQObjectÄ!?8A>: B5: C V=45:A>20=V9 VT@0@EVW,<br>4;O O:8E 45O:V ?0@0<5B@8 ?>B@V1=> 7<V=8B8. "8?>2>: ?CAB89.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObjectj(01;>=8 =072 D09;V2 01> B5:, O:V =5 1C45 V=45:A>20=>.LThese are patterns for file or directory names which should not be indexed.QObject~>4C20==O, O:5 1C45 70AB>A>20=> ?@8 G8B0==V D09;V2, O:V =5 2:07CNBL B0:5 >A>1;82> (=0?@8:;04, G8AB> B5:AB>28E D09;V2).<br>"8?>2> =52:070=5, B>4V 28:>@8AB>2CTBLAO 7=0G5==O 7 >B>G5==O (;>:0;V).ÒThis is the character set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObject>?5@5465==OWarningRTIToolW(2AV <>28)(all languages)RclMain(157 A;>2>D>@<) (no stemming)RclMain@> Recoll About RecollRclMain2AVAllRclMain’52V@=89 :><0=4=89 @O4>: 4;O ?5@53;O40G0 %1: [%2] 5@52V@B5 D09; mimeconfCBad viewer command line for %1: [%2] Please check the mimeconf fileRclMain@5 <>6C AB2>@8B8 2V:=> ?5@53;O4CCan't create preview windowRclMainl5<>6;82> 74>1CB8 4>:C<5=B G8 AB2>@8B8 B8<G0A>289 D09;0Cannot extract document or create temporary fileRclMainJ5 <>6C 74>1CB8 4>:C<5=B 7 1078 40=8E+Cannot retrieve document info from databaseRclMain0:@820NClosingRclMain$AB>@VO 4>:C<5=BV2Document historyRclMain8:>=CN: [ Executing: [RclMain¦V4ACB=V 7>2=VH=V 4>40B:8/:><0=48, I> ?>B@V1=V 4;O V=45:AC20==O 20H8E 4>:C<5=BV2: SExternal applications/commands needed and not found for indexing your file types: RclMain0=V VAB>@VW History dataRclMain=45:ACTBLAO: Indexing in progress: RclMain6V4ACB=V 4>40B:>2V ?@>3@0<8Missing helper programsRclMain:AV 4>40B:>2V ?@>3@0<8 =0O2=VNo helpers found missingRclMainG8AB8B8PurgeRclMain5B0;V 70?8BC Query detailsRclMain" 57C;LB0B8 70?8BC Query resultsRclMain070 :>@5=V2StemdbRclMain.5&@5@20B8 V=45:AC20==OStop &IndexingRclMain0&59 ?>HC: 265 =50:B82=89"This search is not active any moreRclMain52V4><>UnknownRclMain >=>28B8 &V=45:A Update &IndexRclMain>?5@5465==OWarningRclMain:?><8;:0 74>1C20==O A?8A:C <>2#error retrieving stemming languagesRclMainDV;LB@>20=5filteredRclMain <54V0mediaRclMain?>2V4><;5==OmessageRclMainV=H5otherRclMain?@575=B0FVW presentationRclMainA>@B>20=5sortedRclMainB01;8FV spreadsheetRclMain B5:ABtextRclMain@> &Recoll &About Recoll RclMainBase&!:;04=89 ?>HC:&Advanced Search RclMainBase8&G8AB8B8 VAB>@VN 4>:C<5=BV2&Erase document history RclMainBase &$09;&File RclMainBase&>2V4:0&Help RclMainBase4&>=DV‘C@0FVO V=45:AC20==O&Indexing configuration RclMainBase&0;0HBC20==O &Preferences RclMainBase(>=DV‘C@0FVO &70?8BC&Query configuration RclMainBase"V4ACB=V ?@>3@0<8&Show missing helpers RclMainBase*&0@0<5B@8 A>@BC20==O&Sort parameters RclMainBase&=AB@C<5=B8&Tools RclMainBase*&>2V4=8: :>@8ABC20G0 &User manual RclMainBase8!:;04=89 (?>3;81;5=89) ?>HC:Advanced/complex Search RclMainBase2AVAll RclMainBase Ctrl+QCtrl+Q RclMainBase$AB>@VO 4>:C<5=BV2Document History RclMainBase&&AB>@VO 4>:C<5=BV2Document &History RclMainBase &8EV4E&xit RclMainBase4V0;>3 7>2=VH=L>3> V=45:ACExternal index dialog RclMainBase5@H0 AB>@V=:0 First page RclMainBaseL5@59B8 4> ?5@H>W AB>@V=:8 @57C;LB0BV2Go to first page of results RclMainBase"0ABC?=0 AB>@V=:0 Next page RclMainBase:0ABC?=0 AB>@V=:0 @57C;LB0BV2Next page of results RclMainBase$>?5@54=O AB>@V=:0 Previous page RclMainBase<>?5@54=O AB>@V=:0 @57C;LB0BV2Previous page of results RclMainBase RecollRecoll RclMainBase$!?8A>: @57C;LB0BV2 Result list RclMainBase$=AB@C<5=B8 ?>HC:C Search tools RclMainBase(0@0<5B@8 A>@BC20==OSort parameters RclMainBase&&02V‘0B>@ B5@<V=V2Term &explorer RclMainBase@=AB@C<5=B 4;O 282G0==O B5@<V=V2Term explorer tool RclMainBase &>=>28B8 V=45:A Update &index RclMainBase0B0Date RecollModel<'O D09;C File name RecollModel&5@53;O=CB8&PreviewResList (?>:070B8 70?8B) (show query)ResList2<p><b>5 7=0945=></b><br>

No results found
ResList,>?VN20B8 &=072C D09;0Copy &File NameResList>?VN20B8 &URL Copy &URLResList$AB>@VO 4>:C<5=BV2Document historyResList>:C<5=B8 DocumentsResList.=09B8 &AE>6V 4>:C<5=B8Find &similar documentsResList0ABC?=0NextResListV4:@8B8OpenResList5@53;O4PreviewResList>?5@54=OPreviousResList$!?8A>: @57C;LB0BV2 Result listResList&>:C<5=B =54>AO6=89Unavailable documentResList?>forResList7 ?@8=09<=Vout of at leastResList&5@53;O=CB8&PreviewResTable,>?VN20B8 &=072C D09;0Copy &File NameResTable>?VN20B8 &URL Copy &URLResTable.=09B8 &AE>6V 4>:C<5=B8Find &similar documentsResTable&5@53;O=CB8&PreviewResTableDetailArea,>?VN20B8 &=072C D09;0Copy &File NameResTableDetailArea>?VN20B8 &URL Copy &URLResTableDetailArea.=09B8 &AE>6V 4>:C<5=B8Find &similar documentsResTableDetailArea#AV A;>20 All termsSSearchC4L-O:5 A;>2>Any termSSearch*52V@=89 @O4>: 70?8BCBad query stringSSearch>?>2=5==O CompletionsSSearch’254VBL ?>HC:>2V A;>20. >6=0 28:>@8AB>2C20B8 Esc-?@>1V; 4;O 4>?>2=5==O.FEnter search terms here. Type ESC SPC for completions of current term.SSearch<'O D09;C File nameSSearch&54>AB0B=L> ?0<'OBV Out of memorySSearch>20 70?8BCQuery languageSSearch15@VBL:Select an item:SSearch00=04B> 1030B> 4>?>2=5=LToo many completionsSSearch&15@VBL B8? ?>HC:C.Choose search type. SSearchBase !B5@B8Clear SSearchBase Ctrl+SCtrl+S SSearchBase’254VBL ?>HC:>2V A;>20. >6=0 28:>@8AB>2C20B8 Esc-?@>1V; 4;O 4>?>2=5==O.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase2!B5@B8 2<VAB @O4:0 70?8B0Erase search entry SSearchBaseSSearchBase SSearchBase SSearchBase =09B8Search SSearchBase>G0B8 70?8B Start query SSearchBase2AVAll SearchClauseW<'O D09;C File name SearchClauseWlV;L:VABL 4>40B:>28E A;V2, I> <>6CBL 1CB8 <V6 >1@0=8<8HNumber of additional words that may be interspersed with the chosen ones SearchClauseWj815@VBL B8? 70?8BC, O:89 1C45 7@>1;5=> ?> F8E A;>20E>Select the type of query that will be performed with the words SearchClauseW&0:@8B8&Close SpellBase& >7:@8B8 &Expand  SpellBase Alt+CAlt+C SpellBase$02V‘0B>@ B5@<V=V2 Term Explorer SpellBase4><8;:0 @>7:@8BBO aspell. Aspell expansion error. SpellWn5 240;>AO 70?CAB8B8 aspell. >=> 27030;V 2AB0=>2;5=5?)Aspell init failed. Aspell not installed?SpellW* >7:@8BBO =5 7=0945=5No expansion foundSpellW 5328@07RegexpSpellW0?8A/72CG0==OSpelling/PhoneticSpellW& >7:@8BBO A;>2>D>@<Stem expansionSpellW !;>2>TermSpellW(01;>=8 WildcardsSpellW:?><8;:0 74>1C20==O A?8A:C <>2#error retrieving stemming languagesSpellW5@53;O4Choose UIPrefsDialog˜15@VBL B5:C V7 V=45:A>< Xapian (=0?@8:;04, /home/?@8OB5;L/.recoll/xapiandb)@Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) UIPrefsDialogJ1@0=0 B5:0 =5 AE>60 =0 V=45:A Xapian;The selected directory does not appear to be a Xapian index UIPrefsDialogB1@0=0 B5:0 265 C A?8A:C V=45:AV23The selected directory is already in the index list UIPrefsDialog:&5 >A=>2=89/;>:0;L=89 V=45:A!This is the main/local index! UIPrefsDialog:?><8;:0 74>1C20==O A?8A:C <>2#error retrieving stemming languages UIPrefsDialogR<V=0 4V9 V7 @V7=8<8 ?>B>G=8<8 7=0G5==O<8.Changing actions with different current values ViewAction<V=8B8 4VN Change ActionViewActionBase0:@8B8CloseViewActionBase" V4=V ?5@53;O40GVNative ViewersViewActionBaseÆ15@VBL >48= 01> 45:V;L:0 B8?V2 D09;V2, ?>BV< =0B8A=VBL "<V=8B8 4VN", I>1 7<V=8B8 ?@>3@0<C 4;O =8EbSelect one or several file types, then click Change Action to modify the program used to open themViewActionBaseH5<>6;82> 70?8A0B8 D09; :>=DV‘C@0FVWCan't write configuration fileconfgui::ConfIndexW5@53;O4Chooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLW;>10;L=VGlobalconfgui::ConfSubPanelWD560 @>7<V@C AB8A=5=8E D09;V2 (KB)Max. compressed file size (KB)confgui::ConfSubPanelW &5 7=0G5==O 2AB0=>2;NT ?>@V3 @>7<V@C AB8A=5=8E D09;V2, 1V;LHV 70 =L>3> =5 1C45 >?@0FL>20=>. -1 28<8:0T ;V<VB, 0 28<8:0T 45:><?@5AVN.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelW>20 aspellAspell languageconfgui::ConfTopPanelW"5:0 1078 40=8EDatabase directory nameconfgui::ConfTopPanelW8<8:0T 28:>@8AB0==O aspell 4;O 35=5@0FVW =01;865=L C =0?8A0==O 2 =02V‘0B>@V B5@<V=V2.<br>>@8A=5, :>;8 aspell 2V4ACB=V9 01> 7;0<0=89. †Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelW<=B5@20; A:840==O V=45:AC (1)Index flush megabytes intervalconfgui::ConfTopPanelW$09; 6C@=0;C Log file nameconfgui::ConfTopPanelW&>:;04=VABL 6C@=0;CLog verbosity levelconfgui::ConfTopPanelWD0:A8<0;L=5 28:>@8AB0==O 48A:C (%)Max disk occupation (%)confgui::ConfTopPanelW25 28:>@8AB>2C20B8 aspellNo aspell usageconfgui::ConfTopPanelW @>?CA:0B8 H;OE8 Skipped pathsconfgui::ConfTopPanelW(>28 7V A;>2>D>@<0<8Stemming languagesconfgui::ConfTopPanelWr$09;, :C48 ?V4CBL ?>2V4><;5==O.<br>'stderr' 4;O B5@<V=0;CPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWæ>20 A;>2=8:0 aspell. 0T 283;O40B8 O: 'en' 01> 'uk'...<br>/:I> =5 2AB0=>2;5=5, 1C45 28:>@8AB0=5 >B>G5==O (;>:0;L), I> 70728G09 @>18BL. )>1 7'OAC20B8, I> <0T<> =0 A8AB5<V, =015@VBL 'aspell config' B0 ?5@53;O=LB5 D09;8 .dat C B5FV 'data-dir'. 2The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW~>28, 4;O O:8E 1C45 ?>1C4>20=><br>A;>2=8:8 @>7:@8BBO A;>2>D>@<.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelWš!?8A>: B5:, 7 O:8E ?>G8=0TBLAO @5:C@A82=5 V=45:AC20==O. "8?>2>: 4><0H=O B5:0.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWâ0720 B5:8, 45 <VAB8BLAO V=45:A<br>V4=>A=89 H;OE 1C45 B@0:B>20=> 2V4=>A=> B5:8 :>=DV‘C@0FVW. "8?>2>: 'xapiandb'.–The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelW&5 =0728 B5:, C O:V V=45:AC20==O =5 ?>B@0?8BL.<br> >65 <VAB8B8 H01;>=8. 0T A?V2?040B8 V7 H;OE0<8, I> 10G8BL V=45:A0B>@ (=0?@8:;04, O:I> topdirs <VAB8BL '/home/me' B0 '/home' T ?>A8;0==O< =0 '/usr/home', B> 2V@=89 70?8A 1C45 '/home/me/tmp*', 0 =5 '/usr/home/me/tmp*')#These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelWV4A>B>: 709=OB>3> 48A:C, :>;8 V=45:AC20==O 1C45 7C?8=5=> (I>1 C=8:=CB8 70?>2=5==O 4>ABC?=>3> ?@>AB>@C).<br>"8?>2>: 0 (157 ;V<VBC).—This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).
0 means no limit (this is the default).confgui::ConfTopPanelW!:V;L:8 40=8E 1C45 ?@>V=45:A>20=> <V6 A:840==O<8 V=45:AC =0 48A:.<br>>?><030T :>=B@>;N20B8 28:>@8AB0==O ?0<'OBV V=45:A0B>@><. "8?>2>: 101 ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelW„AB0=>28B8 >1AO3 ?>2V4><;5=L,<br>2V4 ?><8;>: 4> 40=8E 7=520465==O.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW5@E=V B5:8Top directoriesconfgui::ConfTopPanelW>8:>@8AB>2C20B8 A8AB5<=C 'file'Use system's 'file' commandconfgui::ConfTopPanelW´8:>@8AB>2C20B8 :><0=4C 'file' 7 A8AB5<8, :>;8 2=CB@VH=T<br>287=0G5==O B8?C MIME 40T 71V9.NUse the system's 'file' command if internal
mime type identification fails.confgui::ConfTopPanelW&V4<V=0&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase˜>HC: [rolling stones] (2 A;>20) 1C45 7<V=5=> =0 [rolling or stones or (rolling phrase 2 stones)]. &5 <>65 ?V4=OB8 @57C;LB0B8, 2 O:8E ?>HC:>2V A;>20 7CAB@VG0NBLAO A0<5 2 B0:V9 ?>A;V4>2=>ABV, O: 2 70?8BV.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBase:;NG8B8 2A5 Activate AlluiPrefsDialogBase>40B8 V=45:A Add indexuiPrefsDialogBase"0AB>AC20B8 7<V=8 Apply changesuiPrefsDialogBaseX>G8=0B8 ?@>AB89 ?>HC: ?@8 22545==V ?@>1V;C.-Auto-start simple search on whitespace entry.uiPrefsDialogBaseZ2B><0B8G=> 4>4020B8 D@07C 4> ?@>AB8E ?>HC:V2+Automatically add phrase to simple searchesuiPrefsDialogBase5@53;O4ChooseuiPrefsDialogBase"15@VBL @540:B>@8Choose editor applicationsuiPrefsDialogBase8:;NG8B8 2A5Deactivate AlluiPrefsDialogBaseV4<V=8B8 7<V=8Discard changesuiPrefsDialogBase~'8 @>18B8 =>289 :>=A?5:B, =02VBL O:I> O:89AL 265 T 2 4>:C<5=BV?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBase '8 =0<030B8AO 1C4C20B8 :>=A?5:B8 4;O @57C;LB0BV2 ?>HC:C, 28:>@8AB>2CNGV :>=B5:AB 7=0945=8E A;V2? >65 ?@0FN20B8 ?>2V;L=> 4;O 25;8:8E 4>:C<5=BV2.zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBase88=0<VG=> 1C4C20B8 :>=A?5:B8Dynamically build abstractsuiPrefsDialogBase >2=VH=V V=45:A8External IndexesuiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBase %>20B8 4C1;V:0B8Hide duplicate results.uiPrefsDialogBase:>;V@ 284V;5==O :;NG>28E A;V2Highlight color for query termsuiPrefsDialogBaseÐ/:I> C2V<:=5=5, @57C;LB0B8 A B0:8< A0<8< 7<VAB>< B0 @V7=8<8 =0720<8 1C45 ?>:070=> =5 1V;LH5 >4=>3> @07C.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBaseb0:A8<0;L=89 @>7<V@ B5:ABC V7 ?V4A2VGC20==O< (1)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseBV;L:VABL @57C;LB0BV2 =0 AB>@V=:C"Number of entries in a result pageuiPrefsDialogBasebV4:@820T 4V0;>3 281>@C H@8DBC A?8A:C @57C;LB0BV2-Opens a dialog to select the result list fontuiPrefsDialogBasedV44020B8 ?5@5203C HTML =04 B5:AB>< 4;O ?5@53;O4C.&Prefer Html to plain text for preview.uiPrefsDialogBase80?0<'OB0B8 AB0= A>@BC20==O.Remember sort activation state.uiPrefsDialogBasef840;8B8 7V A?8A:C. 5 2?;820T =0 48A:>289 V=45:A.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase 840;8B8 281@0=5Remove selecteduiPrefsDialogBaseL0<V=OB8 =0O2=V C 4>:C<5=B0E :>=A?5:B8 Replace abstracts from documentsuiPrefsDialogBase!:8=CB8ResetuiPrefsDialogBaseD>25@B0T H@8DB C B8?>289 A8AB5<=891Resets the result list font to the system defaultuiPrefsDialogBase0(@8DB A?8A:C @57C;LB0BV2Result list fontuiPrefsDialogBase 0@0<5B@8 ?>HC:CSearch parametersuiPrefsDialogBase\V4:@820B8 4V0;>3 A:;04=>3> ?>HC:C ?@8 AB0@BV.'Start with advanced search dialog open.uiPrefsDialogBase>20 A;>2>D>@<Stemming languageuiPrefsDialogBase8>=B5:AB=8E A;V2 C :>=A?5:BV Synthetic abstract context wordsuiPrefsDialogBaseT >7<V@ A8=B5B8G=>3> :>=A?5:BC (C A8<2>;0E)$Synthetic abstract size (characters)uiPrefsDialogBaseÀ"5:AB8 V7 @>7<V@><, 1V;LH8< 70 2:070=89, =5 1C45 ?V4A2VG5=> C ?>?5@54=L><C ?5@53;O4V (?>2V;L=>).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase&5@5:;NG8B8 281@0=5Toggle selecteduiPrefsDialogBase€8:>@8AB>2C20B8 =0;0HBC20==O 45A:B>?C I>4> @540:B>@C 4>:C<5=BV2.2Use desktop preferences to choose document editor.uiPrefsDialogBase=B5@D59AUser interfaceuiPrefsDialogBase?>4>10==OUser preferencesuiPrefsDialogBaseˆ ý) ÿý, recoll-1.17.3/qtgui/i18n/recoll_xx.qm000644 001750 000000 00000000020 11757435371 017737 0ustar00dockeswheel000000 000000 <¸dÊÍ!¿`¡½Ýrecoll-1.17.3/qtgui/i18n/recoll_zh.qm000644 001750 000000 00000245353 11757435371 017745 0ustar00dockeswheel000000 000000 <¸dÊÍ!¿`¡½ÝB+ ^- ‹¯ ¬+;$KH,­ H,Â/H,ûaHYûŠIAÃÂZlÌXmbÐ÷¦y†Ù¨¥É¨¶E±VÐDcÙ]LôÏšVE¶šVEüf¾ÏÀlÀÅ2¬¬ô½wEî7ë$—ז'HäÑ(*Ð%¾¸*ì0¿!+Lôƒ°+f¾Ì+f¾Ñž+f¾Ôè1ø v:Îd¼OG…Ô5•GßÃH6óþ H6õþ:J+‚…1J+‚ù‚J6•J6•L™b±±Ph¨ËT°5ËŽWT‡}WÈÕ¶¼XÉÄ6.[ %Ì/e®……gwîØsºñÁsºñ¼yv8“·ãv®Âv®Â¼Ëzϳ¤€€£)ì„jªŒ!þ Ò0œÀÍoªJ-®½Þ,öÊð©Îº°÷ÃÞÓÐùƒ»þÐùƒMÐùƒÂã3ÈÛãn Õ æEµºõ&`Ž#U0,…~>.cŒ«Do2´[XM¹2X®©E`Þ^Îh0 ùlÿtûänÚˆÛwñ…Ë]wñ…®„3ÿÆ‘vã&Εñ“ŒvœW­}ž€Þ³¢‰j£cê †ÎxC‰ÞñƒÜó L¬ÒþSIø[ÿµª çŒï#¸Î¶p#vå¶ávå¥Êqw 5Ê¢w 5ø0w 5û³wîÊÑ€¢#×ÔŒU`Ÿ.«»£¹Þ Z©Ö³#ª6•ý«¯†”«»f3Á{ËÂî²éͼu2Ðgž¼ðÔÂõ…ÆØ.^Jê•Êø¾ì;U®ðï¡©FúU†—úeî > ¬˜ðŒµ8R`³Å‘" û.:ª UKô7jp h&—u9düv2㇖T#ˆn—B…VšKg¦ %1¦öõ9¨«‡»«¶7лÄÖ[µ­ÊXÔ IënDªÂðw)üüþ!ØC'~#+ä8‘7I^¾éFW#ü>F¯N+{H:"̬H:"ÑÌH:"Õ _gucjŒÍwÍŒÍwÒ!ŒÍwՌϗÏänͦ“’ž' ¦š´½ ²ð ÎÁ²ð ÓDzð ÖG´ù€¾l¯¸Ót½HÈૉɆt:ãéŽ#ƪ3‚µ áùÉ:uî3ïQçÇ‹Òoz ¸}}‹•€;EÔŸŽÄ^1t”ò“8Èœ .¼¨0ÎÄúÃÌí³ƒßͳÐb×°­ÊÝÜ"±äœcµä´¥«Ræí:¯àö¨åbú Ã<“ ´H½ä 9Zyú… ;´3´” K¨óÄÆ ]#—¶ cÄIÔ k¨µˆ¥ lMˆ‚ˆ ‰Œî: ŸÁòÐ ŸÁòÔG ŸÁòÖÛ «ƒÔÉR ­î6 ®œ¯*Ü ²9ª ü>4¹ äî‰_ íåõ'é *N‡; Üc‚ ).~¿R *REÒ +<”5 6 ¯µ G.~c) `Pµ `ç£ c·EÃë d8„ y†^ ˜Iœ$ ¤ž_ ±TúØ[ ²ëCÏQ ²ëCÓý ²ëCÖ‡ Áùš² ÄãÏ* âæçà åKÄ"ó æõçÃ3 ®ˆ ®ùÂÁ Ô… - yeDÉ THm ŽÚ„ =!f CK€„à Kj×Ëù T|cÀè h¹°„H tÓ9ë é £Ü ˆ< ¨Î£ÄJ »ïµ¯V ÖüõÆì Û·åÅ^ ÛÓ(ƒ Vd´Ò 'ИÁé /¥µA 97Ãr 9É· L*ÒR PÖ™¬R RVŽ»K T#Ž Vü® \iC5Ô ]æù ‘ `F¥> hôîÑc v—¥¸« {l4S €!Y¸l ‘–²°à ©zóî ¬æàª‘ Ër(Ñ Óͺ# Ú÷Ï Ýøì&] é—~0¼ ö†ÀýÛ zs? m£Ë/ 'Rçcª -èôË» 8þ$€ FÁ²¹ OE°bä m†C0e uò0Æl y· y¹~Û ‚±3§ …È©)O ‡uøŒ ‰P¬* ‰P»× 5d3 ’ãnÞ ¤š„¶d ¬Š©D\ ½ý7€* ÕHu û£• q©¾o€/Ö%Ýn‘./¸.¦16“É<Þ9~F÷Qá~5 Y~sÁ;[žsÇë\НEg3Ä—pû~€_Õ  «!&  ‚´‹Z­c@µ“Ãø÷»m€Ó@¿­cÂ|“7¬ÎÁ'¹âî£Æ8ó l½Ÿü©ÜËü¶Li<ÑQhègaNö All clauses AdvSearchNûagaNö Any clause AdvSearche‡Nö\:[øÇnäVhv„TSUOMN kcxn$Bad multiplier suffix in size filter AdvSearch YZ’OSe‡Nömedia AdvSearch®Nömessages AdvSearchQv[ƒother AdvSearchoy:e‡z? presentations AdvSearchu5[Pˆhh< spreadsheets AdvSearche‡g,texts AdvSearch !yûR¨Qhè <----- All AdvSearchBase !yûR¨ N-˜y <----- Sel AdvSearchBasemûR gaNö Add clause AdvSearchBasešØzïd}"Advanced search AdvSearchBase yûR¨Qhè!’ All ----> AdvSearchBaseÌSó¹v„b@g —^zz[WkµýOc qg;‘Nÿ QhègaNö  ˜yÿ b;‘bÿ NûagaNö  ˜yÿ ge~ÄT0<br> Nûa  Qhè TŒ eà N yÍ[Wkµ|{W‹ýc¥SדQe{€SU‹Í‹íTŒSÌ_S÷_u(v„‹Í~Äv„~ÄT0<br>zzv„“QehFOˆ«_ýue0All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBasemO‰ÈBrowse AdvSearchBase c Y'|{geÇnä By categories AdvSearchBase N-ÙN*ÿ NåO¿”ˆ[ùeågÛˆLÇnä'Check this to enable filtering on dates AdvSearchBase" N-ÙN*ÿ NåO¿”ˆ[ùe‡Nö|{W‹ÛˆLÇnä,Check this to enable filtering on file types AdvSearchBase" N-ÙN*ÿ NåO¿”ˆ[ùe‡Nö\:[øÛˆLÇnä'Check this to enable filtering on sizes AdvSearchBase4 N-ÙN*ÿ NåO¿Ou(ƒY'v„R|{ÿ € N Ou(QwOSv„e‡Nö|{W‹;Check this to use file categories instead of raw mime types AdvSearchBaseQs•íClose AdvSearchBaseR –dgaNö Delete clause AdvSearchBase“Qe‰d}"v„gN \Bvî_UEnter top directory for search AdvSearchBaseÇnäFilter AdvSearchBaseÇnäeåg Filter dates AdvSearchBaseÇnä\:[ø Filter sizes AdvSearchBasegåb~Find AdvSearchBaseNÎFrom AdvSearchBase‰_ýuev„e‡Nö|{W‹Ignored file types AdvSearchBase SÍlÇnägaNöInvert AdvSearchBasegY'\:[ø Max. Size AdvSearchBase0gY'\:[ø0O`SïOu(k/K0m/M0g/GO\N:SUOM4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBaseg\\:[ø Min. Size AdvSearchBase0g\\:[ø0O`SïOu(k/K0m/M0g/GO\N:SUOM4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase –P[še‡Nö|{W‹Restrict file types AdvSearchBase"\~ÓgœN-v„e‡Nö–P[šW(kd[Pvî_UhN-ÿ%Restrict results to files in subtree: AdvSearchBase OÝ[XN:žØ‹¤P<Save as default AdvSearchBase(d}"<br>ná³NåN gaNö<br>v„e‡hcÿ'Search for
documents
satisfying: AdvSearchBase\ˆ«d}"v„e‡Nö|{W‹Searched file types AdvSearchBase yûR¨ N-˜y!’ Sel -----> AdvSearchBase_YËd}" Start Search AdvSearchBaseR0To AdvSearchBase<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T19:47:37" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T19:56:53" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } .T3 { font-style:italic; } .T4 { font-family:Courier New,courier; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> by‘Ï}"_‹¡RNûR¡(cron) </p><p class="P1">kÏN*[WkµýSïNåSbìNN*‘M{&(*)0SUN*ep[WP<0S÷R–”v„Rˆh(1,3,5)TŒƒVô(1-7)0fôQÆxnW0‹ôÿ ÙN›[WkµOˆ«<span class="T3">c SŸh7</span>“QúR0crontab e‡NöN-ÿ VàkdÙ‘ÌSïNåOu(crontab v„b@g ‹ílÕÿ S€crontab(5)0</p><p class="P1"><br/>O‹Y‚ÿ W(<span class="T3">eåg</span>N-“Qe<span class="T4">*</span>ÿ <span class="T3">\eö</span>N-“Qe<span class="T4">12,19</span>ÿ <span class="T3">R”Ÿ</span>N-“Qe<span class="T4">15 </span>v„‹Ýÿ OW(kÏY)v„12:15 AM TŒ7:15 PMT/R¨recollindex0</p><p class="P1">NN*˜‘~AbgˆLv„‹¡RNûR¡ÿ Qv`'€ýSï€ýkÔN N [žeö}"_0</p></body></html> Å

Recoll batch indexing schedule (cron)

Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used as is inside the crontab file, and the full crontab syntax can be used, see crontab(5).


For example, entering * in Days, 12,19 in Hours and 15 in Minutes would start recollindex every day at 12:15 AM and 7:15 PM

A schedule with very frequent activations is probably less efficient than real time indexing.

 CronToolWª<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:08:00" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:11:47" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T2 { font-style:italic; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1">p¹Qû<span class="T2">yu(</span>NåP\kbÛˆLêR¨Sv„by‘Ï}"_ÿ p¹Qû<span class="T2">T/u(</span>NåT/u(kdRŸ€ýÿ p¹Qû<span class="T2">SÖmˆ</span>RN e9SØNûOUN‰0</p></body></html> š

Click Disable to stop automatic batch indexing, Enable to activate it, Cancel to change nothing.

 CronToolW‹¡RNûR¡[ù‹ÝhF Cron Dialog CronToolW&fgeå(*b0-7ÿ 0b7f/cfgY)))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolWyu(Disable CronToolWT/u(Enable CronToolW$cÒQecrongavîeöQú•0‹÷hÀgå‹ílÕ03Error installing cron entry. Bad syntax in fields ? CronToolW\eö(*b0-23)Hours (* or 0-23) CronToolWPw wge]ò~Ïg bKR¨‘Çv„recollindexgavîN†ÿ VàkdeàlÕ‘crontabPIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolWR”Ÿ(0-59)Minutes (0-59) CronToolW[ù‹ÝhFDialog EditDialogà<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:14:44" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:23:13" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T2 { font-weight:bold; } .T4 { font-style:italic; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T2">g*b~R0[ù^”NŽkd‘Mn[žO‹v„}"_epcn0</span><br/><br/>Y‚gœO`Sê`óNåN~ÄTtv„žØ‹¤SÂepge}"_O`v„[¶vî_Uv„‹Ýÿ \1vôc¥c <span class="T4">zËSs_YË}"_</span>c ”®0NåTØSïNåŒet‘MnSÂepv„0</p><p class="P1">Y‚gœO``óŒetgÐN›N‰v„‹Ýÿ \1Ou(N —bv„”þc¥geŒetQvN-v„}"_‘MnTŒ[šeö‹¡RT'0</p><p class="P1">ÙN›]åQwSïW(NåTÇ<span class="T4"> ˜y</span>ƒÜSU‹¿•î0</p></body></html> ê

It appears that the index for this configuration does not exist.

If you just want to index your home directory with a set of reasonable defaults, press the Start indexing now button. You will be able to adjust the details later.

If you want more control, use the following links to adjust the indexing configuration and schedule.

These tools can be accessed later from the Preferences menu.

FirstIdxDialog{,Nk!}"_‹¾nFirst indexing setupFirstIdxDialog}"_‘MnIndexing configurationFirstIdxDialog [šeö}"_NûR¡Indexing scheduleFirstIdxDialog zËSs_YË}"_Start indexing nowFirstIdxDialog^W(Ù‘ÌSïNåŒetO``ó‰[ùQvÛˆL}"_v„vî_Uÿ NåSÊQv[ƒSÂepÿ O‹Y‚ÿ‰c’–dTŒï_„bT [W0žØ‹¤[W{&–Æ & &This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.FirstIdxDialogdW(Ù‘ÌSïNå béf/‰ÛˆLby‘Ï}"_Øf/[žeö}"_ÿ ØSïN勾nNN*êR¨Sv„[šeöÿOu(cronÿ by‘Ï}"_NûR¡0€This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron).FirstIdxDialogJ<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:27:11" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:30:49" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> }"_z ^Sïc~íЈL^vNW(e‡NöSÑuSØSeö[ùQvÛˆL}"_ÿ N_SïNå•ô–”N[šeö•ôЈLNk!0</p><p class="P1">O`SïNå‹ûNN bKQŒÿ NåO¿fôY}W0PZQúb‰béÿc F1ÿ 0</p><p class="P1">ÙN*]åQwSï^.R©O`‹¾nNN*êR¨ÛˆLby‘Ï}"_v„[šeöNûR¡ÿ b€‹¾nb_SO`v{_UeöO¿T/R¨[žeö}"_ÿb€N$€T eöÛˆLÿ _Sq6£QàNNl¡g aNIÿ 0</p></body></html> ¿

Recoll indexing can run permanently, indexing files as they change, or run at discrete intervals.

Reading the manual may help you to decide between these approaches (press F1).

This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense).

 IdxSchedW[šeöNûR¡Cron scheduling IdxSchedWy:[Wkµ Show fieldsPreviewTextEditf>y:VþrG Show imagePreviewTextEdit f>y:N;e‡g,Show main textPreviewTextEdit<b>ê[šNIv„[Pvî_UhCustomised subtreesQObjectº<i>NåN v„SÂepÿ _SO`W(N —bv„RˆhN-N N-NûOUgavîb€ N-NN*zzˆLeöÿ <br>\1f/”ˆ[ù˜v~§vî_UwO\u(v„ÿ T&RO¿f/[ù N-v„[Pvî_UwO\u(v„0<br>O`SïNåp¹Qû+/-c ”®ÿ NåO¿mûR bR –dvî_U0ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObjectBeagleQ˜uS†SòBeagle web historyQObject žØ‹¤[W{&–ÆDefault character setQObject ߎ*{&S÷”þc¥Follow symbolic linksQObject4W(}"_eöߎ*{&S÷”þc¥0žØ‹¤f/N ߎ*v„ÿ NåQM‘ÍY }"_TFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObjectQh\@SÂepGlobal parametersQObject[ùb@g e‡NöT ÛˆL}"_Index all file namesQObjectT[ù£N›eàlÕR$e­bYtQvQ…[¹ÿg*wå|{W‹bQv|{W‹N ˆ«e/cÿ v„e‡Növ„T [WÛˆL}"_0žØ‹¤N:f/}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject\@èSÂepLocal parametersQObject‰ueÇv„e‡NöT  Skipped namesQObjectZÙf/]ò}"_v„vî_UhN-v„NN›[Pvî_U~Äbv„Rˆh<br>ÿ [ƒNìv„gÐN›SÂep—‰‘Í[šNI0žØ‹¤ÿzzv}0sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObject$Qwg ÙN›j!_v„e‡Nöbvî_UN Oˆ«}"_0LThese are patterns for file or directory names which should not be indexed.QObject„Ùf/u(ge‹ûSÖ£N›g*hfꎫv„[W{&–Æv„e‡Nöeöb@Ou(v„[W{&–Æÿ O‹Y‚~¯e‡g,e‡Nö0<br>žØ‹¤PThe default value is empty, and the value from the NLS environnement is used.QObject~<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T21:00:38" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T21:02:43" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> }"_z ^SïNåNå[ˆb¤Ûz v„e¹_ЈLÿ W(e‡NöSÑuSØSeöO¿[žeöfôe°}"_0Ùh7O`v„}"_Nvôf/Ne‡NöT kev„ÿ OFf/OS`u(N[šv„|û~ßDn0</p></body></html> .

Recoll indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.

RTIToolWT eökdk!N_zËSsT/R¨}"_Ûz 0%Also start indexing daemon right now.RTIToolW*êR¨T/R¨e‡Nö]ò~ÏR –d0N_‰g@k{_SRMÛz Tÿ2Autostart file deleted. Kill current process too ?RTIToolW eàlÕR^úÿCan't create: RTIToolWeàlÕbgˆLrecollindexCould not execute recollindexRTIToolW kcW(R –de‡Nö Deleting fileRTIToolW kcW(R –dÿ Deleting: RTIToolW[žeö}"_êR¨T/R¨"Real time indexing automatic startRTIToolWkcW(R –dêR¨T/R¨˜yRemoving autostartRTIToolW kcW(fÿcbe‡NöReplacing fileRTIToolW kcW(fÿcbÿ Replacing: RTIToolW$W(bv„hL—bO‹ÝT/R¨eöO¿T/R¨}"_Ûz 0.Start indexing daemon with my desktop session.RTIToolW‹fTJWarningRTIToolWÿ[ùQhè‹íŠÛˆL‹Íh9‹¡{—ÿ (all languages)RclMainÿN ÛˆL‹Íh9‹¡{—ÿ  (no stemming)RclMainRecoll‹ôf About RecollRclMainQhèAllRclMain>”ˆ[ù%1v„gåw T}Nä[%2]‘MnQú• ‹÷hÀgåmimeconfe‡NöCBad viewer command line for %1: [%2] Please check the mimeconf fileRclMaineàlÕ‹¿•îe‡NöÿCan't access file: RclMaineàlÕR^ú˜„‰Èz—SãCan't create preview windowRclMaineàlÕ‰ãS‹)kde‡NöÿCan't uncompress file: RclMaineàlÕfôe°}"_ÿ}"_z ^]òW(ЈL#Can't update index: indexer runningRclMaineàlÕcÐSÖe‡hcbR^úN4eöe‡Nö0Cannot extract document or create temporary fileRclMaineàlÕNÎepcn^“ƒ·SÖe‡hcOá`o+Cannot retrieve document info from databaseRclMainkcW(Qs•íClosingRclMain]ò~ÏN:ÙN›e‡Nö|{W‹}"_QvQ…[¹ÿ.Content has been indexed for these mime types:RclMain4eàlÕbS_Yè}"_0epcn^“g*bS_0‹÷hÀgåYè}"_Rˆh0HCould not open external index. Db not open. Check external indexes list.RclMaine‡hcR|{ÇnäVhDocument category filterRclMaine‡hcS†SòDocument historyRclMain]ò[ŒbDoneRclMain kcW(R –d}"_ Erasing indexRclMain•‹ïErrorRclMain kcW(bgˆLÿ[ Executing: [RclMain@—‰u(ge…R©[ùO`v„e‡NöÛˆL}"_ÿ StSÈb~N R0v„Yèz ^/T}Näÿ SExternal applications/commands needed and not found for indexing your file types: RclMainS†Sòepcn History dataRclMain }"_g*bS_Index not openRclMainnkde‡Növ„}"_]òÇeö0z ^bÒ~Ýf>y:•‹ïv„gavî0‹÷p¹Qûxn[šNåfôe°kde‡Növ„}"_ÿ {I_…}"_[ŒbNKTQgå‹â0b€ÿ SÖmˆ0´Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel.RclMain }"_gå‹âQú•Index query errorRclMain]ò}"_v„e‡Nö|{W‹Indexed MIME TypesRclMain}"_Y1%Indexing failedRclMain kcW(}"_ÿIndexing in progress: RclMaing*b~R0v„…R©z ^Missing helper programsRclMainvщÆVhMonitorRclMain$”ˆ[ùkdyÍe‡Nö|{W‹l¡g ‘MnYègåw Vh[-No external viewer configured for mime type [RclMainvîRMN :\NûOU…R©z ^No helpers found missingRclMain g*b~R0~ÓgœNo results foundRclMaineàNoneRclMainR –dPurgeRclMain gå‹â‹íSå~Æ‚‚ Query detailsRclMainLgå‹âkcW(ÛˆLN-0<br>u1NŽ}"_^“v„gÐN›–PR6ÿ <br>SÖmˆv„‹ÝO[üôz ^QúeQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMaingå‹â~Ógœ Query resultsRclMainNÎY4‘Íe°_YË}"_Tÿ(Reset the index and start from scratch ?RclMain~ÓgœepÿO0‹¡P<ÿ Result count (est.)RclMainOÝ[Xe‡Nö Save fileRclMainStemepcn^“StemdbRclMainP\kb}"_ÿ&Iÿ Stop &IndexingRclMainL_SRM}"_Ûz N f/u1kduL—bT/R¨v„0p¹Qûxn[šNåg@k{[ƒÿ b€p¹QûSÖmˆNå‹©[ƒêu1ЈLyThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMainNl¡g b~R0mimeviewN-N:%1: %2‘Mnv„gåw Vh0 f/T&‰bS_ ˜y[ù‹ÝhFÿhThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMainÙN*gå‹â]ò~ÏN f/m;Ãv„N†"This search is not active any moreRclMaing*wåUnknownRclMainfôe°}"_ÿ&Iÿ  Update &IndexRclMainkcW(fôe°UpdatingRclMain‹fTJWarningRclMaincÐSÖ‹Íh9‹íŠeöQú•#error retrieving stemming languagesRclMain]òÇnäfilteredRclMain YZ’OSe‡NömediaRclMain®NömessageRclMainQv[ƒotherRclMainoy:e‡hc presentationRclMain]òc’^sortedRclMainu5[Pˆhh< spreadsheetRclMaine‡g,e‡NötextRclMainRecoll‹ôfÿ&Aÿ  &About Recoll RclMainBasešØzïd}"ÿ&Aÿ &Advanced Search RclMainBaseR –de‡hcS†Sòÿ&Eÿ &Erase document history RclMainBaseR –dd}"S†Sòÿ&Eÿ &Erase search history RclMainBase e‡Nöÿ&Fÿ &File RclMainBase Qh\Oÿ&Fÿ  &Full Screen RclMainBase ^.R©ÿ&Hÿ &Help RclMainBase}"_‘Mnÿ&Iÿ &Indexing configuration RclMainBase[šeö}"_ÿ&Iÿ &Indexing schedule RclMainBase ˜yÿ&Pÿ  &Preferences RclMainBasegå‹â‘Mnÿ&Qÿ &Query configuration RclMainBase‘Íe°g„ }"_ÿ&Rÿ &Rebuild index RclMainBasef>y:]ò}"_v„e‡Nö|{W‹ÿ&Sÿ &Show indexed types RclMainBasef>y::\v„…R©z ^Rˆhÿ&Sÿ &Show missing helpers RclMainBasec’^SÂepÿ&Sÿ &Sort parameters RclMainBase ]åQwÿ&Tÿ &Tools RclMainBaseu(b7bKQŒÿ&Uÿ  &User manual RclMainBasešØzï/Y gBd}"Advanced/complex Search RclMainBaseQhèAll RclMainBase Ctrl+QCtrl+Q RclMainBasee‡hcS†SòDocument History RclMainBasee‡hcS†Sòÿ&Hÿ Document &History RclMainBase Qúÿ&xÿ E&xit RclMainBaseYè}"_[ù‹ÝhFÿ&xÿ E&xternal index dialog RclMainBaseYè}"_[ù‹ÝhFExternal index dialog RclMainBaseF11F11 RclMainBase{,N˜u First page RclMainBaseQh\O Full Screen RclMainBaseólR0~Ógœv„{,N˜uGo to first page of results RclMainBaseN N˜u Next page RclMainBase N N˜u~ÓgœNext page of results RclMainBaseTN û˜uPgDown RclMainBaseTN û˜uPgUp RclMainBaseN N˜u Previous page RclMainBase N N˜u~ÓgœPrevious page of results RclMainBase RecollRecoll RclMainBase~ÓgœRˆh Result list RclMainBased}"]åQw Search tools RclMainBaseShift+TN û˜u Shift+PgUp RclMainBasef>y:gå‹â‹íSå~Æ‚‚Show Query Details RclMainBaseNåˆhhy:~ÓgœShow results as table RclMainBasec eågc’Rÿ ge°v„W(RM—b#Sort by dates from newest to oldest RclMainBasec eågc’Rÿ geçv„W(RM—b#Sort by dates from oldest to newest RclMainBasec’^SÂepSort parameters RclMainBase‹Í‹íc¢}"Vhÿ&eÿ Term &explorer RclMainBase ‹Í‹íc¢}"VhTerm explorer tool RclMainBasefôe°}"_ÿ&iÿ  Update &index RclMainBasec eågSG^c’R sortByDateAsc RclMainBasec eåg–M^c’RsortByDateDesc RclMainBasedX‰Abstract RecollModelO\€Author RecollModeleågDate RecollModel eågSÊeö•ô Date and time RecollModele‡hceåg Document date RecollModele‡hc\:[ø Document size RecollModele‡Nöeåg File date RecollModele‡NöT  File name RecollModele‡Nö\:[ø File size RecollModelQ…èï_„Ipath RecollModelQs•.‹ÍKeywords RecollModele‡Nö|{W‹ MIME type RecollModelOîe9eö•ôMtime RecollModelSŸ[W{&–ÆOriginal character set RecollModelvøQs^¦Relevancy rating RecollModelh˜˜Title RecollModelï_„URL RecollModel bS_ÿ&Oÿ &OpenResListbS_N N~§e‡hc/vî_Uÿ&Oÿ &Open Parent document/folderResList ˜„‰Èÿ&Pÿ &PreviewResListQ™Qee‡Nöÿ&Wÿ &Write to FileResListÿf>y:gå‹â‹íSå~Æ‚‚ÿ  (show query)ResList&<p><b>g*b~R0~Ógœ</b><br>

No results found
ResList.<p><i>Qv[ƒbüQ™_b_ÿ_ý‰ÆSã—óÿ ÿ</i>4

Alternate spellings (accents suppressed): ResListY R6e‡NöT ÿ&Fÿ Copy &File NameResListY R6ï_„ÿ&Uÿ  Copy &URLResListe‡hcS†SòDocument historyResList{, DocumentsResListgåb~|{O <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-23T08:43:25" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-23T09:07:39" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .Standard { font-size:12pt; font-family:Nimbus Roman No9 L; writing-mode:page; } .T1 { font-style:italic; } .T2 { font-style:italic; } .T4 { font-weight:bold; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="Standard">“Qegå‹â‹íŠˆh¾_0{€‰‹ôfÿ<br/><span class="T2">‹Í‹í</span><span class="T1">1 </span><span class="T2">‹Í‹í</span><span class="T1">2</span> : '‹Í‹í1'TŒ'‹Í‹í2'T eöQús°W(Nûa[WkµN-0<br/><span class="T2">[Wkµ</span><span class="T1">:</span><span class="T2">‹Í‹í</span><span class="T1">1</span> : '‹Í‹í1'Qús°W([Wkµ'[Wkµ'N-0<br/>hQÆ[WkµT /T NIT ÿ<br/>title/subject/caption0author/from0recipient/to0filename0ext0<br/>O*[WkµT ÿdir0mime/format0type/rclcat0date0<br/>eågkµv„N$N*y:O‹ÿ2009-03-01/2009-05-20 2009-03-01/P2M0<br/><span class="T2">‹Í‹í</span><span class="T1">1 </span><span class="T2">‹Í‹í</span><span class="T1">2 OR </span><span class="T2">‹Í‹í</span><span class="T1">3</span> : ‹Í‹í1 <span class="T4">N</span> (‹Í‹í2 <span class="T4">b</span> ‹Í‹í3)0<br/>N QA‹¸u(wkcv„bìS÷geˆhy:;‘Qs|û0<br/><span class="T1">"</span><span class="T2">‹Í‹í</span><span class="T1">1 </span><span class="T2">‹Í‹í</span><span class="T1">2"</span> : ‹Í~Äÿ_Ř{c SŸh7Qús°ÿ 0Sïu(v„Oî™p‹Íÿ<br/><span class="T1">"</span><span class="T2">‹Í‹í</span><span class="T1">1 </span><span class="T2">‹Í‹í</span><span class="T1">2"p</span> : NåžØ‹¤Ýy»ÛˆLv„eà^ÑOg u‘•îeöSïOu(<span class="T4">f>y:gå‹â‹íSå~Æ‚‚</span>”þc¥gegåw gå‹â‹íSåv„~Æ‚‚ÿ SæY‹÷gåw bKQŒÿ&lt;F1&gt;ÿ NåN†‰ãfôYQ…[¹0</p></body></html> éEnter query language expression. Cheat sheet:
term1 term2 : 'term1' and 'term2' in any field.
field:term1 : 'term1' in field 'field'.
Standard field names/synonyms:
title/subject/caption, author/from, recipient/to, filename, ext.
Pseudo-fields: dir, mime/format, type/rclcat, date.
Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
term1 term2 OR term3 : term1 AND (term2 OR term3).
No actual parentheses allowed.
"term1 term2" : phrase (must occur exactly). Possible modifiers:
"term1 term2"p : unordered proximity search with default distance.
Use Show Query link when in doubt about result and see manual (<F1>) for more detail. SSearchBW(kd“Qe‰d}"v„‹Í‹í0c Esc zzhSelect the type of query that will be performed with the words SearchClauseW Qs•íÿ&Cÿ &Close SpellBase \U_ÿ&Eÿ &Expand  SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBaseg*b~R0epcn^“Oá`o0 No db info. SpellBase ‹Í‹íc¢}"Vh Term Explorer SpellBaseAspellbi\UQú•0Aspell expansion error. SpellW0AspellRYËSY1%0f/T&g*[‰ˆÅAspellÿ)Aspell init failed. Aspell not installed?SpellW e‡hcep/`;ep Doc. / Tot.SpellW&}"_ÿ%1N*e‡hcÿ ^sWG•^¦N:%2N*‹Í‹í,Index: %1 documents, average length %2 termsSpellW g*b~R0bi\UNo expansion foundSpellW kcRˆh¾_RegexpSpellWbüQ™/SÑ—óhÀgåSpelling/PhoneticSpellW‹Íh9bi\UStem expansionSpellW‹Í‹íTermSpellW‘M{& WildcardsSpellWcÐSÖ‹Íh9‹íŠeöQú•#error retrieving stemming languagesSpellW béChoose UIPrefsDialogZ béxapian}"_vî_UÿO‹Y‚ÿ/home/buddy/.recoll/xapiandbÿ @Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) UIPrefsDialog N-v„vî_UN f/Xapian}"_;The selected directory does not appear to be a Xapian index UIPrefsDialog N-v„vî_U]ò~ÏW(}"_RˆhN-3The selected directory is already in the index list UIPrefsDialogÙf/N;‰/g,W0}"_ÿThis is the main/local index! UIPrefsDialogcÐSÖ‹Íh9‹íŠeöQú•#error retrieving stemming languages UIPrefsDialogkcW(”ˆ[ùN T v„_SRMP<€ e9SØR¨O\.Changing actions with different current values ViewActionT}NäCommand ViewActione‡Nö|{W‹ MIME type ViewActionOîe9R¨O\ Change ActionViewActionBaseQs•íCloseViewActionBase g,W0gåw VhNative ViewersViewActionBaseH N-NN*bYN*e‡Nö|{W‹ÿ q6Tp¹Qû Oîe9R¨O\ geOîe9u(gebS_ÙN›e‡Növ„z ^bSelect one or several file types, then click Change Action to modify the program used to open themViewActionBasež N-NN*bYN*e‡Nö|{W‹y_p¹Qû Oîe9R¨O\ <br>b€SïNåQs•íÙN*[ù‹ÝhFÿ € W(N;—bgN- N- Ou(hL—bžØ‹¤‹¾n <br>£h7\1Oeà‰ÆÙN*Rˆh€ Ou(hL—bv„žØ‹¤‹¾n0ÉSelect one or several mime types then click "Change Action"
You can also close this dialog and check "Use desktop preferences"
in the main panel to ignore this list and use your desktop defaults.ViewActionBasetN SïЈLBeagle0T/u([ùbeagle–Rv„Ytÿ Nå}"_pkrÐQ˜uS†Sò0<br>ÿO`Ø—‰[‰ˆÅpkrÐBeaglecÒNöÿ ”Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.
(you should also install the Firefox Beagle plugin)confgui::ConfBeaglePanelW(_S\:[ø¾R0‹¾[šPY‚gœOu(vø[ùï_„ÿ ROvø[ùNŽ‘Mnvî_Uv„ï_„ÛˆLYt0‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWQ˜uP¨[Xvî_UT Web page store directory nameconfgui::ConfBeaglePanelWeàlÕQ™Qe‘Mne‡NöCan't write configuration fileconfgui::ConfIndexW béChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWœYèÇnäVhv„bgˆLeö•ôY‚gœ…ÇÙN*P<ÿ ROˆ«_:ˆLN-e­0W(U‰Áv„`ÅQµN ÿ gÐN›e‡hcÿO‹Y‚postscriptÿ O[üôÇnäVh–wQek{_ªs¯0‹¾nb-1Nåˆhy:N R –PR60 «External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. confgui::ConfSubPanelWQh\@Globalconfgui::ConfSubPanelW|Y‚gœ‹¾nT¯ÙN*P<ÿN {INŽ-1ÿ ÿ Re‡g,e‡NöOˆ«RRrbÙNHY'v„WWÿ ^vNÛˆL}"_0 Ùf/u(ged}"Y'W‹e‡g,e‡Növ„ÿO‹Y‚‹°_Ue‡Nöÿ 0¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWS‹)e‡NögY'\:[øÿKBÿ Max. compressed file size (KB)confgui::ConfSubPanelWÇnäVhv„g•bgˆLeö•ôÿSÿ Max. filter exec. time (S)confgui::ConfSubPanelWe‡g,e‡NögY'\:[øÿMBÿ Max. text file size (MB)confgui::ConfSubPanelWe‡g,e‡NöSU˜u\:[øÿKBÿ Text file page size (KB)confgui::ConfSubPanelWd\:[øY'NŽÙN*PW(l¡g [‰ˆÅaspellb€[ƒ]åO\N kc^8eöOu(ÙN* ˜y0†Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelWR7e°}"_v„•ô–”ÿ QF[W‚‚Index flush megabytes intervalconfgui::ConfTopPanelW ‹°_Ue‡NöT  Log file nameconfgui::ConfTopPanelW‹°_Uv„‹Ýuè~§R+Log verbosity levelconfgui::ConfTopPanelWgY'xlvØS`u(s‡ÿ%ÿ Max disk occupation (%)confgui::ConfTopPanelWN Ou(aspellNo aspell usageconfgui::ConfTopPanelW ueÇv„ï_„ Skipped pathsconfgui::ConfTopPanelW‹Íh9‹íŠStemming languagesconfgui::ConfTopPanelWTz ^“Qúv„mˆ`oOˆ«OÝ[XR0ÙN*e‡Nö0<br>Ou('stderr'Nåˆhy:\mˆ`o“QúR0~ÈzïPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWaspell‹ÍQxv„‹íŠ0ˆhy:e¹_f/'en'b'fr' & &<br>Y‚gœN ‹¾nÙN*P<ÿ ROOu(|û~ßs¯XƒN-v„êq6‹íŠ‹¾nOá`oÿ € £N*^8f/kcxnv„0‰`ógåw O`v„|û~ßN-[‰ˆÅT¯TêN›‹íŠv„‹Ýÿ \1bgˆL'aspell config'ÿ QW('data-dir'vî_UN-b~.date‡Nö02The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW*\O”ˆ[ùÙN›‹íŠ<br>g„ ‹Íh9bi\U‹ÍQx0IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW:}"_NÎÙN*RˆhN-v„vî_U_YËÿ _RW0ÛˆL0žØ‹¤ÿO`v„[¶vî_U0LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWtu(geP¨[X}"_epcnv„vî_Uv„T [W<br>Y‚gœOu(vø[ùï_„ÿ Rï_„Ovø[ùNŽ‘Mnvî_UÛˆL‹¡{—0žØ‹¤PA non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelW>}"_Ûz N OÛQeQwg ÙN›T [Wv„vî_U0<br>SïNåST+‘M{&0_Ř{S9‘M}"_Ûz ꎫb@‰ÁR0v„ï_„ÿO‹Y‚ÿY‚gœtopdirsST+'/home/me'ÿ € [ž–EN '/home'f/R0'/usr/home'v„”þc¥ÿ Rkcxnv„skippedPathgavî^”_Sf/'/home/me/tmp*'ÿ € N f/'/usr/home/me/tmp*'ÿ #These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelWr_SxlvØv„S`u(s‡¾R0ÙN*epeöÿ }"_OY1%^vNP\kbÿNåQMX^náO`v„xlvØÿ 0<br>‹¾N:0Rˆhy:N R –PR6ÿÙf/žØ‹¤P<ÿ 0—This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).
0 means no limit (this is the default).confgui::ConfTopPanelWvÙN*P<Œetv„f/ÿ _Syï}/T¯Y\}"_epcneöÿ bM\epcnR7e°R0xlvØN S»0<br>u(gec§R6}"_Ûz v„Q…[XS`u(`ÅQµ0žØ‹¤N:10MBŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWTÙN*P<Œetv„f/“Qúv„mˆ`ov„ep‘Ïÿ <br>Qv~§R+NÎNÅ“Qúb¥•Oá`oR0“QúNY'XŒ‹ÕOá`o0ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW˜v~§vî_UTop directoriesconfgui::ConfTopPanelWOu(|û~ß‘Ìv„'file'T}NäUse system's 'file' commandconfgui::ConfTopPanelWD_SQ…èv„e‡Nö|{W‹‹ÆR+RŸ€ýY1eHeö<br>Ou(|û~ß‘Ìv„'file'T}Nä0NUse the system's 'file' command if internal
mime type identification fails.confgui::ConfTopPanelW SÖmˆÿ&Cÿ &CanceluiPrefsDialogBase xn[šÿ&Oÿ &OKuiPrefsDialogBase’[ù[nÚ wó] (2N*‹Í‹í)v„d}"OSØb[nÚ or wó or (nÚ 2N*‹Í‹í wó)]0 [ùNŽ£N›d}"‹Í‹íW(QvN-c qgSŸh7Qús°v„~Ógœÿ QvOQH~§OšØNN›0ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBasedX‰N-v„rGkµv„R–”{&Abstract snippet separatoruiPrefsDialogBaseQhèoÀm; Activate AlluiPrefsDialogBasemûR }"_ Add indexuiPrefsDialogBase Oe9SØueH Apply changesuiPrefsDialogBase “Qezzh_ÙN›e9SØDiscard changesuiPrefsDialogBase>\e‡Nö|{W‹ÇnäVhf>y:b]åQwgaÿ € N f/c ”®—bgÿ—‰‘ÍT/z ^ÿ 0KDisplay category filter as toolbar instead of button panel (needs restart).uiPrefsDialogBase4SsOe‡hcg,Ž«båg NN*dX‰ÿ bNìNÍq6êˆLTbdX‰Oá`oÿEDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseTf/T&‰Ou(gå‹â‹Í‹íThVôv„N N e‡geg„ ~ÓgœRˆhgavîN-v„dX‰ÿ [ùNŽY'v„e‡hcSï€ýO_ˆab0zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBase R¨`g„ dX‰Dynamically build abstractsuiPrefsDialogBase ‘~Ógœ˜u—bv„htmlY4ècÒQe˜y#Edit result page html header insertuiPrefsDialogBase‘~Ógœkµ„=v„h<_[W{&N2#Edit result paragraph format stringuiPrefsDialogBaseT/u(EnableuiPrefsDialogBaseYè}"_External IndexesuiPrefsDialogBase¾Ùf/NN*˜‘s‡–P<ÿ …ÇÙN*PR0êR¨‹Í~ÄN-0 šØ˜‘‹Í‹íf/‹Í~ÄN-`'€ý•v„N;‰gen0 ueÇv„‹Í‹íOXžR ‹Í~Äv„zz:P<ÿ VàkdO–MONêR¨‹Í~ÄRŸ€ýv„eHs‡0 žØ‹¤Py:NN*0XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBase6PREN-v„e‡[WN OcbˆL0Ou(BRv„‹ÝOONN›)ÛY1eH0BLines in PRE text are not folded. Using BR loses some indentation.uiPrefsDialogBase0W(˜„‰ÈN-[ùQvÛˆLšØN®f>y:v„gY'e‡g,\:[øÿQF[W‚‚ÿ 5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseNN*~Ógœ˜u—bN-f>y:v„~Ógœgaep"Number of entries in a result pageuiPrefsDialogBase(bS_NN*[ù‹ÝhFÿ Nå béu(NŽ~ÓgœRˆhv„[WOS-Opens a dialog to select the result list fontuiPrefsDialogBase bS_NN*[ù‹ÝhFÿ Nå béh7_SUe‡Nö-Opens a dialog to select the style sheet fileuiPrefsDialogBase˜„‰ÈN-OQHOu(Html0&Prefer Html to plain text for preview.uiPrefsDialogBasegå‹â‹íŠy^YGe‡NöT T0(Query language magic file name suffixes.uiPrefsDialogBase‹°OOc’^r¶`0Remember sort activation state.uiPrefsDialogBase,NÎRˆhN-R –d0ÙN O[ùxlvØN v„}"_ bc_[³07Remove from list. This has no effect on the disk index.uiPrefsDialogBase R –d N-˜yRemove selecteduiPrefsDialogBaseSÖNãe‡hcN-ê^&v„dX‰ Replace abstracts from documentsuiPrefsDialogBase‘ÍnResetuiPrefsDialogBase"\~ÓgœRˆhN-v„[WOS‘Í‹¾N:|û~ߞ؋¤P<1Resets the result list font to the system defaultuiPrefsDialogBase\h7_SU‘ÍnN:žØ‹¤P<!Resets the style sheet to defaultuiPrefsDialogBase~ÓgœRˆh Result ListuiPrefsDialogBase ~ÓgœRˆh[WOSResult list fontuiPrefsDialogBased}"SÂepSearch parametersuiPrefsDialogBaseT/R¨eöbS_šØzïd}"[ù‹ÝhF0'Start with advanced search dialog open.uiPrefsDialogBase‹Íh9‹íŠStemming languageuiPrefsDialogBaseh7_SU Style sheetuiPrefsDialogBaseTbdX‰N N e‡ Synthetic abstract context wordsuiPrefsDialogBaseTbdX‰•^¦ÿ[W{&N*epÿ $Synthetic abstract size (characters)uiPrefsDialogBase4…ÇÙN*•^¦v„e‡g,N OW(˜„‰Èz—Sã‘ÌšØN®f>y:ÿY*abÿ 0CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase@ÙN*RˆhN-v„‹Í‹íOW(gå‹â‹íŠ“QehF‘ÌêR¨SØbext:xxx‹íSå0bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase Rcb N-˜yToggle selecteduiPrefsDialogBaseLW(\~¯e‡g,f>y:bhtml˜„‰Èv„eöPÿ Ou(<PRE>h{~ÿ € N f/<BR>h{~0GUse

 tags instead of 
to display plain text as html in preview.uiPrefsDialogBase$Ou(hL—b|û~ßv„‹¾nge bée‡hc‘Vh02Use desktop preferences to choose document editor.uiPrefsDialogBaseu(b7uL—bUser interfaceuiPrefsDialogBaseu(b7 ˜yUser preferencesuiPrefsDialogBaserecoll-1.17.3/qtgui/confgui/confgui.cpp000644 001750 000000 00000027771 11757434240 020432 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "confgui.h" #include "smallut.h" #include "debuglog.h" #include "rcldb.h" #include "guiutils.h" #include #include using std::list; using std::vector; namespace confgui { static const int spacing = 2; static const int margin = 2; void ConfParamW::setValue(const QString& value) { if (m_fsencoding) m_cflink->set(string((const char *)value.toLocal8Bit())); else m_cflink->set(string((const char *)value.toUtf8())); } void ConfParamW::setValue(int value) { char buf[30]; sprintf(buf, "%d", value); m_cflink->set(string(buf)); } void ConfParamW::setValue(bool value) { char buf[30]; sprintf(buf, "%d", value); m_cflink->set(string(buf)); } void setSzPol(QWidget *w, QSizePolicy::Policy hpol, QSizePolicy::Policy vpol, int hstretch, int vstretch) { QSizePolicy policy(hpol, vpol); policy.setHorizontalStretch(hstretch); policy.setVerticalStretch(vstretch); policy.setHeightForWidth(w->sizePolicy().hasHeightForWidth()); w->setSizePolicy(policy); } bool ConfParamW::createCommon(const QString& lbltxt, const QString& tltptxt) { m_hl = new QHBoxLayout(this); m_hl->setSpacing(spacing); QLabel *tl = new QLabel(this); setSzPol(tl, QSizePolicy::Preferred, QSizePolicy::Fixed, 0, 0); tl->setText(lbltxt); tl->setToolTip(tltptxt); m_hl->addWidget(tl); return true; } ConfParamIntW::ConfParamIntW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, int minvalue, int maxvalue, int defaultvalue) : ConfParamW(parent, cflink), m_defaultvalue(defaultvalue) { if (!createCommon(lbltxt, tltptxt)) return; m_sb = new QSpinBox(this); m_sb->setMinimum(minvalue); m_sb->setMaximum(maxvalue); setSzPol(m_sb, QSizePolicy::Fixed, QSizePolicy::Fixed, 0, 0); m_hl->addWidget(m_sb); QFrame *fr = new QFrame(this); setSzPol(fr, QSizePolicy::Preferred, QSizePolicy::Fixed, 0, 0); m_hl->addWidget(fr); loadValue(); QObject::connect(m_sb, SIGNAL(valueChanged(int)), this, SLOT(setValue(int))); } void ConfParamIntW::loadValue() { string s; if (m_cflink->get(s)) m_sb->setValue(atoi(s.c_str())); else m_sb->setValue(m_defaultvalue); } ConfParamStrW::ConfParamStrW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt) : ConfParamW(parent, cflink) { if (!createCommon(lbltxt, tltptxt)) return; m_le = new QLineEdit(this); setSzPol(m_le, QSizePolicy::Preferred, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(m_le); loadValue(); QObject::connect(m_le, SIGNAL(textChanged(const QString&)), this, SLOT(setValue(const QString&))); } void ConfParamStrW::loadValue() { string s; m_cflink->get(s); if (m_fsencoding) m_le->setText(QString::fromLocal8Bit(s.c_str())); else m_le->setText(QString::fromUtf8(s.c_str())); } ConfParamCStrW::ConfParamCStrW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, const QStringList &sl ) : ConfParamW(parent, cflink) { if (!createCommon(lbltxt, tltptxt)) return; m_cmb = new QComboBox(this); m_cmb->setEditable(FALSE); m_cmb->insertItems(0, sl); setSzPol(m_cmb, QSizePolicy::Preferred, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(m_cmb); loadValue(); QObject::connect(m_cmb, SIGNAL(activated(const QString&)), this, SLOT(setValue(const QString&))); } void ConfParamCStrW::loadValue() { string s; m_cflink->get(s); QString cs; if (m_fsencoding) cs = QString::fromLocal8Bit(s.c_str()); else cs = QString::fromUtf8(s.c_str()); for (int i = 0; i < m_cmb->count(); i++) { if (!cs.compare(m_cmb->itemText(i))) { m_cmb->setCurrentIndex(i); break; } } } ConfParamBoolW::ConfParamBoolW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt) : ConfParamW(parent, cflink) { // No createCommon because the checkbox has a label m_hl = new QHBoxLayout(this); m_hl->setSpacing(spacing); m_cb = new QCheckBox(lbltxt, this); setSzPol(m_cb, QSizePolicy::Fixed, QSizePolicy::Fixed, 0, 0); m_cb->setToolTip(tltptxt); m_hl->addWidget(m_cb); QFrame *fr = new QFrame(this); setSzPol(fr, QSizePolicy::Preferred, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(fr); loadValue(); QObject::connect(m_cb, SIGNAL(toggled(bool)), this, SLOT(setValue(bool))); } void ConfParamBoolW::loadValue() { string s; m_cflink->get(s); m_cb->setChecked(stringToBool(s)); } ConfParamFNW::ConfParamFNW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, bool isdir ) : ConfParamW(parent, cflink), m_isdir(isdir) { if (!createCommon(lbltxt, tltptxt)) return; m_fsencoding = true; m_le = new QLineEdit(this); m_le->setMinimumSize(QSize(150, 0 )); setSzPol(m_le, QSizePolicy::Preferred, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(m_le); m_pb = new QPushButton(this); m_pb->setText(tr("Choose")); setSzPol(m_pb, QSizePolicy::Fixed, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(m_pb); loadValue(); QObject::connect(m_pb, SIGNAL(clicked()), this, SLOT(showBrowserDialog())); QObject::connect(m_le, SIGNAL(textChanged(const QString&)), this, SLOT(setValue(const QString&))); } void ConfParamFNW::loadValue() { string s; m_cflink->get(s); m_le->setText(QString::fromLocal8Bit(s.c_str())); } void ConfParamFNW::showBrowserDialog() { QString s = myGetFileName(m_isdir); if (!s.isEmpty()) m_le->setText(s); } class SmallerListWidget: public QListWidget { public: SmallerListWidget(QWidget *parent) : QListWidget(parent) {} virtual QSize sizeHint() {return QSize(150, 40);} }; ConfParamSLW::ConfParamSLW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt) : ConfParamW(parent, cflink) { // Can't use createCommon here cause we want the buttons below the label m_hl = new QHBoxLayout(this); m_hl->setSpacing(spacing); QVBoxLayout *vl1 = new QVBoxLayout(); QHBoxLayout *hl1 = new QHBoxLayout(); QLabel *tl = new QLabel(this); setSzPol(tl, QSizePolicy::Preferred, QSizePolicy::Fixed, 0, 0); tl->setText(lbltxt); tl->setToolTip(tltptxt); vl1->addWidget(tl); QPushButton *pbA = new QPushButton(this); pbA->setText(tr("+")); setSzPol(pbA, QSizePolicy::Fixed, QSizePolicy::Fixed, 0, 0); hl1->addWidget(pbA); QPushButton *pbD = new QPushButton(this); setSzPol(pbD, QSizePolicy::Fixed, QSizePolicy::Fixed, 0, 0); pbD->setText(tr("-")); hl1->addWidget(pbD); vl1->addLayout(hl1); m_hl->addLayout(vl1); m_lb = new SmallerListWidget(this); m_lb->setSelectionMode(QAbstractItemView::ExtendedSelection); setSzPol(m_lb, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 1); m_hl->addWidget(m_lb); setSzPol(this, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 1); loadValue(); QObject::connect(pbA, SIGNAL(clicked()), this, SLOT(showInputDialog())); QObject::connect(pbD, SIGNAL(clicked()), this, SLOT(deleteSelected())); } void ConfParamSLW::loadValue() { string s; m_cflink->get(s); list ls; stringToStrings(s, ls); QStringList qls; for (list::const_iterator it = ls.begin(); it != ls.end(); it++) { if (m_fsencoding) qls.push_back(QString::fromLocal8Bit(it->c_str())); else qls.push_back(QString::fromUtf8(it->c_str())); } m_lb->clear(); m_lb->insertItems(0, qls); } void ConfParamSLW::showInputDialog() { bool ok; QString s = QInputDialog::getText (this, "", // title "", // label, QLineEdit::Normal, // EchoMode mode "", // const QString & text &ok); if (ok && !s.isEmpty()) { QListitems = m_lb->findItems(s, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (items.empty()) { m_lb->insertItem(0, s); m_lb->sortItems(); listToConf(); } } } void ConfParamSLW::listToConf() { list ls; for (int i = 0; i < m_lb->count(); i++) { // General parameters are encoded as utf-8. File names as // local8bit There is no hope for 8bit file names anyway // except for luck: the original encoding is unknown. QString text = m_lb->item(i)->text(); if (m_fsencoding) ls.push_back((const char *)(text.toLocal8Bit())); else ls.push_back((const char *)(text.toUtf8())); } string s; stringsToString(ls, s); m_cflink->set(s); } void ConfParamSLW::deleteSelected() { // We used to repeatedly go through the list and delete the first // found selected item (then restart from the beginning). But it // seems (probably depends on the qt version), that, when deleting // a selected item, qt will keep the selection active at the same // index (now containing the next item), so that we'd end up // deleting the whole list. // // Instead, we now build a list of indices, and delete it starting // from the top so as not to invalidate lower indices vector idxes; for (int i = 0; i < m_lb->count(); i++) { if (m_lb->item(i)->isSelected()) { idxes.push_back(i); } } for (vector::reverse_iterator it = idxes.rbegin(); it != idxes.rend(); it++) { LOGDEB0(("deleteSelected: %d was selected\n", *it)); QListWidgetItem *item = m_lb->takeItem(*it); emit entryDeleted(item->text()); delete item; } listToConf(); } // "Add entry" dialog for a file name list void ConfParamDNLW::showInputDialog() { QString s = myGetFileName(true); if (!s.isEmpty()) { QListitems = m_lb->findItems(s, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (items.empty()) { m_lb->insertItem(0, s); m_lb->sortItems(); QListitems = m_lb->findItems(s, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (m_lb->selectionMode() == QAbstractItemView::SingleSelection && !items.empty()) m_lb->setCurrentItem(*items.begin()); listToConf(); } } } // "Add entry" dialog for a constrained string list void ConfParamCSLW::showInputDialog() { bool ok; QString s = QInputDialog::getItem (this, // parent "", // title "", // label, m_sl, // items, 0, // current = 0 FALSE, // editable = true, &ok); if (ok && !s.isEmpty()) { QListitems = m_lb->findItems(s, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (items.empty()) { m_lb->insertItem(0, s); m_lb->sortItems(); listToConf(); } } } } // Namespace confgui recoll-1.17.3/qtgui/confgui/confgui.h000644 001750 000000 00000016633 11740755063 020073 0ustar00dockeswheel000000 000000 /* Copyright (C) 2007 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 _confgui_h_included_ #define _confgui_h_included_ /** * This file defines a number of simple classes (virtual base: ConfParamW) * which let the user input configuration parameters. * * Subclasses are defined for entering different kind of data, ie a string, * a file name, an integer, etc. * * Each configuration gui object is linked to the configuration data through * a "link" object which knows the details of interacting with the actual * configuration data, like the parameter name, the actual config object, * the method to call etc. * * The link object is set when the input widget is created and cannot be * changed. * * The widgets are typically linked to a temporary configuration object, which * is then copied to the actual configuration if the data is accepted, or * destroyed and recreated as a copy if Cancel is pressed (you have to * delete/recreate the widgets in this case as the links are no longer valid). */ #include #include #include #include #include #include "refcntr.h" using std::string; class QHBoxLayout; class QLineEdit; class QListWidget; class QSpinBox; class QComboBox; class QCheckBox; class QPushButton; namespace confgui { // A class to isolate the gui widget from the config storage mechanism class ConfLinkRep { public: virtual ~ConfLinkRep() {} virtual bool set(const string& val) = 0; virtual bool get(string& val) = 0; }; typedef RefCntr ConfLink; // Useful to store/manage data which has no direct representation in // the config, ie list of subkey directories class ConfLinkNullRep : public ConfLinkRep { public: virtual ~ConfLinkNullRep() {} virtual bool set(const string&) { return true; } virtual bool get(string& val) {val = ""; return true;} }; // A widget to let the user change one configuration // parameter. Subclassed for specific parameter types. Basically // has a label and some kind of entry widget class ConfParamW : public QWidget { Q_OBJECT public: ConfParamW(QWidget *parent, ConfLink cflink) : QWidget(parent), m_cflink(cflink), m_fsencoding(false) { } virtual void loadValue() = 0; virtual void setFsEncoding(bool onoff) {m_fsencoding = onoff;} protected: ConfLink m_cflink; QHBoxLayout *m_hl; // File names are encoded as local8bit in the config files. Other // are encoded as utf-8 bool m_fsencoding; virtual bool createCommon(const QString& lbltxt, const QString& tltptxt); public slots: virtual void setEnabled(bool) = 0; protected slots: void setValue(const QString& newvalue); void setValue(int newvalue); void setValue(bool newvalue); }; // Widgets for setting the different types of configuration parameters: // Int class ConfParamIntW : public ConfParamW { Q_OBJECT public: // The default value is only used if none exists in the sample // configuration file. Defaults are normally set in there. ConfParamIntW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, int minvalue = INT_MIN, int maxvalue = INT_MAX, int defaultvalue = 0); virtual void loadValue(); public slots: virtual void setEnabled(bool i) {if(m_sb) ((QWidget*)m_sb)->setEnabled(i);} protected: QSpinBox *m_sb; int m_defaultvalue; }; // Arbitrary string class ConfParamStrW : public ConfParamW { Q_OBJECT public: ConfParamStrW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt); virtual void loadValue(); public slots: virtual void setEnabled(bool i) {if(m_le) ((QWidget*)m_le)->setEnabled(i);} protected: QLineEdit *m_le; }; // Constrained string: choose from list class ConfParamCStrW : public ConfParamW { Q_OBJECT public: ConfParamCStrW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, const QStringList& sl); virtual void loadValue(); public slots: virtual void setEnabled(bool i) {if(m_cmb) ((QWidget*)m_cmb)->setEnabled(i);} protected: QComboBox *m_cmb; }; // Boolean class ConfParamBoolW : public ConfParamW { Q_OBJECT public: ConfParamBoolW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt); virtual void loadValue(); public slots: virtual void setEnabled(bool i) {if(m_cb) ((QWidget*)m_cb)->setEnabled(i);} public: QCheckBox *m_cb; }; // File name class ConfParamFNW : public ConfParamW { Q_OBJECT public: ConfParamFNW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, bool isdir = false); virtual void loadValue(); protected slots: void showBrowserDialog(); public slots: virtual void setEnabled(bool i) { if(m_le) ((QWidget*)m_le)->setEnabled(i); if(m_pb) ((QWidget*)m_pb)->setEnabled(i); } protected: QLineEdit *m_le; QPushButton *m_pb; bool m_isdir; }; // String list class ConfParamSLW : public ConfParamW { Q_OBJECT public: ConfParamSLW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt); virtual void loadValue(); QListWidget *getListBox() {return m_lb;} public slots: virtual void setEnabled(bool i) {if(m_lb) ((QWidget*)m_lb)->setEnabled(i);} protected slots: virtual void showInputDialog(); void deleteSelected(); signals: void entryDeleted(QString); protected: QListWidget *m_lb; void listToConf(); }; // Dir name list class ConfParamDNLW : public ConfParamSLW { Q_OBJECT public: ConfParamDNLW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt) : ConfParamSLW(parent, cflink, lbltxt, tltptxt) { m_fsencoding = true; } protected slots: virtual void showInputDialog(); }; // Constrained string list (chose from predefined) class ConfParamCSLW : public ConfParamSLW { Q_OBJECT public: ConfParamCSLW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, const QStringList& sl) : ConfParamSLW(parent, cflink, lbltxt, tltptxt), m_sl(sl) { } protected slots: virtual void showInputDialog(); protected: const QStringList m_sl; }; extern void setSzPol(QWidget *w, QSizePolicy::Policy hpol, QSizePolicy::Policy vpol, int hstretch, int vstretch); } #endif /* _confgui_h_included_ */ recoll-1.17.3/qtgui/confgui/confguiindex.cpp000644 001750 000000 00000042360 11740755063 021452 0ustar00dockeswheel000000 000000 /* Copyright (C) 2007 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 #include #include #include #include #include #include #include #include #include using std::list; #include "confgui.h" #include "recoll.h" #include "confguiindex.h" #include "smallut.h" #include "debuglog.h" #include "rcldb.h" #include "conflinkrcl.h" #include "execmd.h" #include "rclconfig.h" namespace confgui { static const int spacing = 3; static const int margin = 3; ConfIndexW::ConfIndexW(QWidget *parent, RclConfig *config) : QDialog(parent), m_rclconf(config) { setWindowTitle(QString::fromLocal8Bit(config->getConfDir().c_str())); tabWidget = new QTabWidget; reloadPanels(); buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(tabWidget); mainLayout->addWidget(buttonBox); setLayout(mainLayout); resize(QSize(600, 450).expandedTo(minimumSizeHint())); connect(buttonBox, SIGNAL(accepted()), this, SLOT(acceptChanges())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(rejectChanges())); } void ConfIndexW::acceptChanges() { LOGDEB(("ConfIndexW::acceptChanges()\n")); if (!m_conf) { LOGERR(("ConfIndexW::acceptChanges: no config\n")); return; } // Let the changes to disk if (!m_conf->holdWrites(false)) { QMessageBox::critical(0, "Recoll", tr("Can't write configuration file")); } // Delete local copy and update the main one from the file delete m_conf; m_conf = 0; m_rclconf->updateMainConfig(); snapshotConfig(); hide(); } void ConfIndexW::rejectChanges() { LOGDEB(("ConfIndexW::rejectChanges()\n")); // Discard local changes. delete m_conf; m_conf = 0; hide(); } void ConfIndexW::reloadPanels() { if ((m_conf = m_rclconf->cloneMainConfig()) == 0) return; m_conf->holdWrites(true); tabWidget->clear(); m_widgets.clear(); QWidget *w = new ConfTopPanelW(this, m_conf); m_widgets.push_back(w); tabWidget->addTab(w, QObject::tr("Global parameters")); w = new ConfSubPanelW(this, m_conf); m_widgets.push_back(w); tabWidget->addTab(w, QObject::tr("Local parameters")); w = new ConfBeaglePanelW(this, m_conf); m_widgets.push_back(w); tabWidget->addTab(w, QObject::tr("Beagle web history")); } ConfBeaglePanelW::ConfBeaglePanelW(QWidget *parent, ConfNull *config) : QWidget(parent) { QVBoxLayout *vboxLayout = new QVBoxLayout(this); vboxLayout->setSpacing(spacing); vboxLayout->setMargin(margin); ConfLink lnk1(new ConfLinkRclRep(config, "processbeaglequeue")); ConfParamBoolW* cp1 = new ConfParamBoolW(this, lnk1, tr("Steal Beagle indexing queue"), tr("Beagle MUST NOT be running. Enables processing " "the beagle queue to index Firefox web history.
" "(you should also install the Firefox Beagle plugin)" )); vboxLayout->addWidget(cp1); ConfLink lnk2(new ConfLinkRclRep(config, "webcachedir")); ConfParamFNW* cp2 = new ConfParamFNW(this, lnk2, tr("Web page store directory name"), tr("The name for a directory where to store the copies " "of visited web pages.
" "A non-absolute path is taken relative to the " "configuration directory."), true); cp2->setEnabled(cp1->m_cb->isChecked()); connect(cp1->m_cb, SIGNAL(toggled(bool)), cp2, SLOT(setEnabled(bool))); vboxLayout->addWidget(cp2); ConfLink lnk3(new ConfLinkRclRep(config, "webcachemaxmbs")); ConfParamIntW *cp3 = new ConfParamIntW(this, lnk3, tr("Max. size for the web store (MB)"), tr("Entries will be recycled once the size is reached"), -1, 1000); cp3->setEnabled(cp1->m_cb->isChecked()); connect(cp1->m_cb, SIGNAL(toggled(bool)), cp3, SLOT(setEnabled(bool))); vboxLayout->addWidget(cp3); vboxLayout->insertStretch(-1); } ConfTopPanelW::ConfTopPanelW(QWidget *parent, ConfNull *config) : QWidget(parent) { QGridLayout *gl1 = new QGridLayout(this); gl1->setSpacing(spacing); gl1->setMargin(margin); ConfLink lnktopdirs(new ConfLinkRclRep(config, "topdirs")); ConfParamDNLW *etopdirs = new ConfParamDNLW(this, lnktopdirs, tr("Top directories"), tr("The list of directories where recursive " "indexing starts. Default: your home.")); setSzPol(etopdirs, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 3); gl1->addWidget(etopdirs, 0, 0, 1, 2); ConfLink lnkskp(new ConfLinkRclRep(config, "skippedPaths")); ConfParamSLW *eskp = new ConfParamSLW(this, lnkskp, tr("Skipped paths"), tr("These are names of directories which indexing " "will not enter.
May contain wildcards. " "Must match " "the paths seen by the indexer (ie: if topdirs " "includes '/home/me' and '/home' is actually a link " "to '/usr/home', a correct skippedPath entry " "would be '/home/me/tmp*', not '/usr/home/me/tmp*')")); eskp->setFsEncoding(true); setSzPol(eskp, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 3); gl1->addWidget(eskp, 1, 0, 1, 2); list cstemlangs = Rcl::Db::getStemmerNames(); QStringList stemlangs; for (list::const_iterator it = cstemlangs.begin(); it != cstemlangs.end(); it++) { stemlangs.push_back(QString::fromUtf8(it->c_str())); } ConfLink lnkidxsl(new ConfLinkRclRep(config, "indexstemminglanguages")); ConfParamCSLW *eidxsl = new ConfParamCSLW(this, lnkidxsl, tr("Stemming languages"), tr("The languages for which stemming expansion
" "dictionaries will be built."), stemlangs); setSzPol(eidxsl, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 1); gl1->addWidget(eidxsl, 2, 0, 1, 2); ConfLink lnk4(new ConfLinkRclRep(config, "logfilename")); ConfParamFNW *e4 = new ConfParamFNW(this, lnk4, tr("Log file name"), tr("The file where the messages will be written.
" "Use 'stderr' for terminal output"), false); gl1->addWidget(e4, 3, 0, 1, 2); QWidget *w = 0; ConfLink lnk1(new ConfLinkRclRep(config, "loglevel")); w = new ConfParamIntW(this, lnk1, tr("Log verbosity level"), tr("This value adjusts the amount of " "messages,
from only errors to a " "lot of debugging data."), 0, 6); gl1->addWidget(w, 4, 0); ConfLink lnkidxflsh(new ConfLinkRclRep(config, "idxflushmb")); w = new ConfParamIntW(this, lnkidxflsh, tr("Index flush megabytes interval"), tr("This value adjust the amount of " "data which is indexed between flushes to disk.
" "This helps control the indexer memory usage. " "Default 10MB "), 0, 1000); gl1->addWidget(w, 4, 1); ConfLink lnkfsocc(new ConfLinkRclRep(config, "maxfsoccuppc")); w = new ConfParamIntW(this, lnkfsocc, tr("Max disk occupation (%)"), tr("This is the percentage of disk occupation where " "indexing will fail and stop (to avoid filling up " "your disk).
" "0 means no limit (this is the default)."), 0, 100); gl1->addWidget(w, 5, 0); ConfLink lnkusfc(new ConfLinkRclRep(config, "usesystemfilecommand")); w = new ConfParamBoolW(this, lnkusfc, tr("Use system's 'file' command"), tr("Use the system's 'file' command if internal
" "mime type identification fails.")); gl1->addWidget(w, 5, 1); ConfLink lnknaspl(new ConfLinkRclRep(config, "noaspell")); ConfParamBoolW* cpasp = new ConfParamBoolW(this, lnknaspl, tr("No aspell usage"), tr("Disables use of aspell to generate spelling " "approximation in the term explorer tool.
" "Useful if aspell is absent or does not work. ")); gl1->addWidget(cpasp, 6, 0); ConfLink lnk2(new ConfLinkRclRep(config, "aspellLanguage")); ConfParamStrW* cpaspl = new ConfParamStrW(this, lnk2, tr("Aspell language"), tr("The language for the aspell dictionary. " "This should look like 'en' or 'fr' ...
" "If this value is not set, the NLS environment " "will be used to compute it, which usually works." "To get an idea of what is installed on your system, " "type 'aspell config' and look for .dat files inside " "the 'data-dir' directory. ")); cpaspl->setEnabled(!cpasp->m_cb->isChecked()); connect(cpasp->m_cb, SIGNAL(toggled(bool)), cpaspl,SLOT(setDisabled(bool))); gl1->addWidget(cpaspl, 6, 1); ConfLink lnkdbd(new ConfLinkRclRep(config, "dbdir")); ConfParamFNW *edbd = new ConfParamFNW(this, lnkdbd, tr("Database directory name"), tr("The name for a directory where to store the index
" "A non-absolute path is taken relative to the " " configuration directory. The default is 'xapiandb'." ), true); gl1->addWidget(edbd, 7, 0, 1, 2); } ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config) : QWidget(parent), m_config(config) { QVBoxLayout *vboxLayout = new QVBoxLayout(this); vboxLayout->setSpacing(spacing); vboxLayout->setMargin(margin); ConfLink lnksubkeydirs(new ConfLinkNullRep()); m_subdirs = new ConfParamDNLW(this, lnksubkeydirs, QObject::tr("Customised subtrees"), QObject::tr("The list of subdirectories in the indexed " "hierarchy
where some parameters need " "to be redefined. Default: empty.")); m_subdirs->getListBox()->setSelectionMode(QAbstractItemView::SingleSelection); connect(m_subdirs->getListBox(), SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), this, SLOT(subDirChanged(QListWidgetItem *, QListWidgetItem *))); connect(m_subdirs, SIGNAL(entryDeleted(QString)), this, SLOT(subDirDeleted(QString))); // We only retrieve the subkeys from the user's config (shallow), // no use to confuse the user by showing the subtrees which are // customized in the system config like .thunderbird or // .purple. This doesn't prevent them to add and customize them // further. list allkeydirs = config->getSubKeys(true); QStringList qls; for (list::const_iterator it = allkeydirs.begin(); it != allkeydirs.end(); it++) { qls.push_back(QString::fromUtf8(it->c_str())); } m_subdirs->getListBox()->insertItems(0, qls); vboxLayout->addWidget(m_subdirs); QFrame *line2 = new QFrame(this); line2->setFrameShape(QFrame::HLine); line2->setFrameShadow(QFrame::Sunken); vboxLayout->addWidget(line2); QLabel *explain = new QLabel(this); explain->setText( QObject:: tr("The parameters that follow are set either at the " "top level, if nothing
" "or an empty line is selected in the listbox above, " "or for the selected subdirectory.
" "You can add or remove directories by clicking " "the +/- buttons.")); vboxLayout->addWidget(explain); m_groupbox = new QGroupBox(this); setSzPol(m_groupbox, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 3); QGridLayout *gl1 = new QGridLayout(m_groupbox); gl1->setSpacing(spacing); gl1->setMargin(margin); ConfLink lnkskn(new ConfLinkRclRep(config, "skippedNames", &m_sk)); ConfParamSLW *eskn = new ConfParamSLW(m_groupbox, lnkskn, QObject::tr("Skipped names"), QObject::tr("These are patterns for file or directory " " names which should not be indexed.")); eskn->setFsEncoding(true); m_widgets.push_back(eskn); gl1->addWidget(eskn, 0, 0, 1, 2); list args; args.push_back("-l"); ExecCmd ex; string icout; string cmd = "iconv"; int status = ex.doexec(cmd, args, 0, &icout); if (status) { LOGERR(("Can't get list of charsets from 'iconv -l'")); } icout = neutchars(icout, ","); list ccsets; stringToStrings(icout, ccsets); QStringList charsets; charsets.push_back(""); for (list::const_iterator it = ccsets.begin(); it != ccsets.end(); it++) { charsets.push_back(QString::fromUtf8(it->c_str())); } ConfLink lnk21(new ConfLinkRclRep(config, "defaultcharset", &m_sk)); ConfParamCStrW *e21 = new ConfParamCStrW(m_groupbox, lnk21, QObject::tr("Default character set"), QObject::tr("This is the character set used for reading files " "which do not identify the character set " "internally, for example pure text files.
" "The default value is empty, " "and the value from the NLS environnement is used." ), charsets); m_widgets.push_back(e21); gl1->addWidget(e21, 1, 0, 1, 2); ConfLink lnk3(new ConfLinkRclRep(config, "followLinks", &m_sk)); ConfParamBoolW *e3 = new ConfParamBoolW(m_groupbox, lnk3, QObject::tr("Follow symbolic links"), QObject::tr("Follow symbolic links while " "indexing. The default is no, " "to avoid duplicate indexing")); m_widgets.push_back(e3); gl1->addWidget(e3, 2, 0); ConfLink lnkafln(new ConfLinkRclRep(config, "indexallfilenames", &m_sk)); ConfParamBoolW *eafln = new ConfParamBoolW(m_groupbox, lnkafln, QObject::tr("Index all file names"), QObject::tr("Index the names of files for which the contents " "cannot be identified or processed (no or " "unsupported mime type). Default true")); m_widgets.push_back(eafln); gl1->addWidget(eafln, 2, 1); ConfLink lnkzfmaxkbs(new ConfLinkRclRep(config, "compressedfilemaxkbs")); ConfParamIntW *ezfmaxkbs = new ConfParamIntW(m_groupbox, lnkzfmaxkbs, tr("Max. compressed file size (KB)"), tr("This value sets a threshold beyond which compressed" "files will not be processed. Set to -1 for no " "limit, to 0 for no decompression ever."), -1, 1000000, -1); m_widgets.push_back(ezfmaxkbs); gl1->addWidget(ezfmaxkbs, 3, 0); ConfLink lnktxtmaxmbs(new ConfLinkRclRep(config, "textfilemaxmbs")); ConfParamIntW *etxtmaxmbs = new ConfParamIntW(m_groupbox, lnktxtmaxmbs, tr("Max. text file size (MB)"), tr("This value sets a threshold beyond which text " "files will not be processed. Set to -1 for no " "limit. \nThis is for excluding monster " "log files from the index."), -1, 1000000); m_widgets.push_back(etxtmaxmbs); gl1->addWidget(etxtmaxmbs, 3, 1); ConfLink lnktxtpagekbs(new ConfLinkRclRep(config, "textfilepagekbs")); ConfParamIntW *etxtpagekbs = new ConfParamIntW(m_groupbox, lnktxtpagekbs, tr("Text file page size (KB)"), tr("If this value is set (not equal to -1), text " "files will be split in chunks of this size for " "indexing.\nThis will help searching very big text " " files (ie: log files)."), -1, 1000000); m_widgets.push_back(etxtpagekbs); gl1->addWidget(etxtpagekbs, 4, 0); ConfLink lnkfiltmaxsecs(new ConfLinkRclRep(config, "filtermaxseconds")); ConfParamIntW *efiltmaxsecs = new ConfParamIntW(m_groupbox, lnkfiltmaxsecs, tr("Max. filter exec. time (S)"), tr("External filters working longer than this will be " "aborted. This is for the rare case (ie: postscript) " "where a document could cause a filter to loop" "Set to -1 for no limit.\n"), -1, 10000); m_widgets.push_back(efiltmaxsecs); gl1->addWidget(efiltmaxsecs, 4, 1); vboxLayout->addWidget(m_groupbox); subDirChanged(0, 0); } void ConfSubPanelW::reloadAll() { for (list::iterator it = m_widgets.begin(); it != m_widgets.end(); it++) { (*it)->loadValue(); } } void ConfSubPanelW::subDirChanged(QListWidgetItem *current, QListWidgetItem *) { LOGDEB(("ConfSubPanelW::subDirChanged\n")); if (current == 0 || current->text() == "") { m_sk = ""; m_groupbox->setTitle(tr("Global")); } else { m_sk = (const char *) current->text().toUtf8(); m_groupbox->setTitle(current->text()); } LOGDEB(("ConfSubPanelW::subDirChanged: now [%s]\n", m_sk.c_str())); reloadAll(); } void ConfSubPanelW::subDirDeleted(QString sbd) { LOGDEB(("ConfSubPanelW::subDirDeleted(%s)\n", (const char *)sbd.toUtf8())); if (sbd == "") { // Can't do this, have to reinsert it QTimer::singleShot(0, this, SLOT(restoreEmpty())); return; } // Have to delete all entries for submap m_config->eraseKey((const char *)sbd.toUtf8()); } void ConfSubPanelW::restoreEmpty() { LOGDEB(("ConfSubPanelW::restoreEmpty()\n")); m_subdirs->getListBox()->insertItem(0, ""); } } // Namespace confgui recoll-1.17.3/qtgui/confgui/confguiindex.h000644 001750 000000 00000005134 11740755063 021115 0ustar00dockeswheel000000 000000 /* Copyright (C) 2007 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 _confguiindex_h_included_ #define _confguiindex_h_included_ /** * Classes to handle the gui for the indexing configuration. These group * confgui elements, linked to configuration parameters, into panels. */ #include #include #include #include #include #include #include #include #include using std::string; using std::list; class ConfNull; class RclConfig; class ConfParamW; class ConfParamDNLW; namespace confgui { class ConfIndexW : public QDialog { Q_OBJECT public: ConfIndexW(QWidget *parent, RclConfig *config); public slots: void acceptChanges(); void rejectChanges(); void reloadPanels(); private: RclConfig *m_rclconf; ConfNull *m_conf; list m_widgets; QTabWidget *tabWidget; QDialogButtonBox *buttonBox; }; /** * A panel with the top-level parameters which can't be redefined in * subdirectoriess: */ class ConfTopPanelW : public QWidget { Q_OBJECT public: ConfTopPanelW(QWidget *parent, ConfNull *config); }; /** * A panel for the parameters that can be changed in subdirectories: */ class ConfSubPanelW : public QWidget { Q_OBJECT public: ConfSubPanelW(QWidget *parent, ConfNull *config); private slots: void subDirChanged(QListWidgetItem *, QListWidgetItem *); void subDirDeleted(QString); void restoreEmpty(); private: string m_sk; ConfParamDNLW *m_subdirs; list m_widgets; ConfNull *m_config; QGroupBox *m_groupbox; void reloadAll(); }; /** * Extra or little used parameters */ class ConfBeaglePanelW : public QWidget { Q_OBJECT public: ConfBeaglePanelW(QWidget *parent, ConfNull *config); }; } // Namespace confgui #endif /* _confguiindex_h_included_ */ recoll-1.17.3/qtgui/confgui/conflinkrcl.h000644 001750 000000 00000003713 11740755063 020740 0ustar00dockeswheel000000 000000 /* 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 _CONFLINKRCL_H_INCLUDED_ #define _CONFLINKRCL_H_INCLUDED_ /** * A Gui-to-Data link class for ConfTree * Has a subkey pointer member which makes it easy to change the * current subkey for a number at a time. */ #include "confgui.h" #include "conftree.h" #include "debuglog.h" namespace confgui { class ConfLinkRclRep : public ConfLinkRep { public: ConfLinkRclRep(ConfNull *conf, const string& nm, string *sk = 0) : m_conf(conf), m_nm(nm), m_sk(sk) { } virtual ~ConfLinkRclRep() {} virtual bool set(const string& val) { if (!m_conf) return false; LOGDEB1(("Setting [%s] value to [%s]\n", m_nm.c_str(), val.c_str())); bool ret = m_conf->set(m_nm, val, m_sk?*m_sk:""); if (!ret) LOGERR(("Value set failed\n")); return ret; } virtual bool get(string& val) { if (!m_conf) return false; bool ret = m_conf->get(m_nm, val, m_sk?*m_sk:""); LOGDEB1(("ConfLinkRcl::get: [%s] sk [%s] -> [%s]\n", m_nm.c_str(), m_sk?m_sk->c_str():"", ret ? val.c_str() : "no value")); return ret; } private: ConfNull *m_conf; const string m_nm; const string *m_sk; }; } // Namespace confgui #endif /* _CONFLINKRCL_H_INCLUDED_ */ recoll-1.17.3/qtgui/confgui/main.cpp000644 001750 000000 00000006715 11740755063 017720 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #include using namespace std; #include #include #include #include #include #include #include #include #include #include #include #include #include #include "pathut.h" #include "confguiindex.h" #include "debuglog.h" #include "rclconfig.h" #include "execmd.h" #include "conflinkrcl.h" using namespace confgui; static const char *thisprog; static int op_flags; #define OPT_MOINS 0x1 #define OPT_h 0x4 #define OPT_c 0x20 static const char usage [] = "\n" "trconf\n" " -h : Print help and exit\n" ; //" -c : specify config directory, overriding $RECOLL_CONFDIR\n" //; static void Usage(void) { FILE *fp = (op_flags & OPT_h) ? stdout : stderr; fprintf(fp, "%s: Usage: %s", thisprog, usage); exit((op_flags & OPT_h)==0); } static RclConfig *config; int main(int argc, char **argv) { QApplication app(argc, argv); // fprintf(stderr, "Application created\n"); thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) Usage(); while (**argv) switch (*(*argv)++) { case 'h': op_flags |= OPT_h; Usage();break; } // b1: argc--; argv++; } DebugLog::getdbl()->setloglevel(DEBDEB1); DebugLog::setfilename("stderr"); string a_config = "tstconfdir"; config = new RclConfig(&a_config); if (config == 0 || !config->ok()) { cerr << "Cant read configuration in: " << a_config << endl; exit(1); } cerr << "Working with configuration file in: " << config->getConfDir() << endl; // Translation file for Qt QTranslator qt( 0 ); qt.load( QString( "qt_" ) + QTextCodec::locale(), "." ); app.installTranslator( &qt ); // Translations for Recoll string translatdir = path_cat(config->getDatadir(), "translations"); QTranslator translator( 0 ); // QTextCodec::locale() returns $LANG translator.load( QString("recoll_") + QTextCodec::locale(), translatdir.c_str() ); app.installTranslator( &translator ); // fprintf(stderr, "Translations installed\n"); ConfIndexW w(0, config); QSize size(0, 0); size = size.expandedTo(w.minimumSizeHint()); w.resize(size); //w.setSizeGripEnabled(true); w.show(); // Connect exit handlers etc.. Beware, apparently this must come // after mainWindow->show() , else the QMessageBox above never // returns. app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit())); // fprintf(stderr, "Go\n"); // Let's go return app.exec(); } recoll-1.17.3/qtgui/confgui/trconf.pro000644 001750 000000 00000001223 11740755063 020272 0ustar00dockeswheel000000 000000 TEMPLATE = app LANGUAGE = C++ CONFIG += qt warn_on thread release debug HEADERS += confgui.h confguiindex.h SOURCES += main.cpp confgui.cpp confguiindex.cpp #FORMS = unix { UI_DIR = .ui MOC_DIR = .moc OBJECTS_DIR = .obj DEFINES += RECOLL_DATADIR='\\"/usr/local/share/recoll\\"' LIBS += ../../lib/librcl.a -lxapian -liconv -lz INCLUDEPATH += ../../common ../../utils ../../rcldb #../index ../internfile ../query ../unac \ # ../aspell ../rcldb POST_TARGETDEPS = ../../lib/librcl.a } UNAME = $$system(uname -s) contains( UNAME, [lL]inux ) { LIBS -= -liconv } #The following line was inserted by qt3to4 QT += qt3support recoll-1.17.3/python/README.txt000644 001750 000000 00000000200 11740755063 016503 0ustar00dockeswheel000000 000000 How to build and use the python interface is documented in the Recoll user manual, inside the "Programming interface" chapter. recoll-1.17.3/python/recoll/000755 001750 000000 00000000000 11757440614 016276 5ustar00dockeswheel000000 000000 recoll-1.17.3/python/samples/000755 001750 000000 00000000000 11740755063 016461 5ustar00dockeswheel000000 000000 recoll-1.17.3/python/xesam/000755 001750 000000 00000000000 11740755063 016132 5ustar00dockeswheel000000 000000 recoll-1.17.3/python/xesam/xesam-recoll-service000755 001750 000000 00000020003 11740755063 022104 0ustar00dockeswheel000000 000000 #!/usr/bin/env python """ Recoll implementation of a xesam server. Based on the example in the xesam-tools package by: Mikkel Kamstrup Erlandsen Run it like xesam-recoll-service And launch a search on it via xesam-tool search hello """ # Sets up path to uninstalled xesam module import demo import xesam import xesam.query import xesam.server import gobject import sys import datetime import recoll def timestampToIso8601(ts): return datetime.datetime.fromtimestamp(long(ts)).isoformat() class RecollServer (xesam.server.Searcher): """ """ def __init__ (self): h_fact = xesam.server.HandleFactory () fact = xesam.server.ClientFactory (self, h_fact, RecollSession, RecollSearch) xesam.server.Searcher.__init__ (self, h_fact, fact) self.set_echo_queries (True) self.rcldb = recoll.connect() def start (self): # Export our selves via a SearchServerStub xesam.server.SearchServerStub(self).start() def GetProperty (self, shandle, name): prop = xesam.server.Searcher.GetProperty(self, shandle, name) xesam.debug ("Got property request for '%s' on session '%s', returning %s" % (name, shandle, prop)) return prop def SetProperty (self, shandle, name, value): val = xesam.server.Searcher.SetProperty(self, shandle, name, value) xesam.debug ("Set property request for '%s=%s', on session '%s', returning %s" % (name, value, shandle,val)) return val class RecollSession (xesam.server.Session): """ """ def __init__ (self, searcher, session_handle): xesam.server.Session.__init__ (self, searcher, session_handle) self.set_property ("recoll.org", "xesam-recoll-service") class RecollSearch (xesam.server.Search): """ """ SLICE = 10 def __init__ (self, searcher, session, search_handle, \ query=None, xml=None) : # Our parent class does possible xml-to-query parsing. We end up # with a query xesam.server.Search.__init__ (self, searcher, session, search_handle, \ query=query, xml=xml) self._hit_fields = session.get_property (xesam.SESSION_HIT_FIELDS) if self._hit_fields is None: xesam.error ("Got property hit.fields as None." " Setting default xesam:url") self._hit_fields = ["xesam:url"] xesam.debug("RecollSearch: fields:" % self._hit_fields) xesam.debug ("Created %s with handle %s and query:\n%s" % (self.__class__, self.get_handle(), self.get_query())) # Instantiate a recoll query self.rclquery = self._searcher.rcldb.query() # In the latest version (>0.95), primary/secondary is replaced by # a field list. sortfield = session.get_property(xesam.SESSION_SORT_PRIMARY) order = session.get_property(xesam.SESSION_SORT_ORDER) # xesam-tool does not know how to set these for now, so let's # TEST here sortfield = "contentModified" order = "descending" xesam.debug("Session sort primary %s order %s" % (sortfield, order)) # END TEST if sortfield: self.rclquery.sortby(sortfield, order == "ascending" and 1 or 0) def doc_to_hit(self, doc): data = [] for fld in self._hit_fields: # Need to handle ContentCategory and SourceCategory fld = fld.lower().replace("xesam:", "") xesam.debug("Adding data for fld %s" % (fld)) if fld == "snippet": data.append(self._searcher.rcldb.makeDocAbstract(doc, self.rclquery)) elif fld == "contentmodified": data.append(timestampToIso8601(getattr(doc, "mtime"))) else: data.append(getattr(doc, fld, "")) return data def start (self): xesam.debug ("RecollSearch") if isinstance(self.get_query(), xesam.query.UserQuery): self.nres = self.rclquery.execute(self.get_query().get_string()) elif isinstance(self.get_query(), xesam.query.CompositeQuery): self.build_search(None) self.nres = self.rclquery.executesd(self.searchdata) else: raise Exception ("Neither UserQuery nor composite query ??") hits = 0 done = 0 while self.rclquery.next >= 0 and self.rclquery.next < self.nres: doc = self.rclquery.fetchone() data = self.doc_to_hit(doc) self.add_new_hit (self._hit_fields, data) hits += 1 if hits >= self.SLICE: break else: done = 1 if hits > 0: self.emit ("hits-added", hits) xesam.debug ("Search '%s' emitted 'hits-added' %d" % \ (self.get_handle(), hits)) if done: self.emit ("done") xesam.debug ("Search '%s' emitted 'done'" % self.get_handle()) self.stop() def get_hits(self, num_hits): xesam.debug ("RecollSearch get_hits") if self._stopped: return xesam.server.Search.get_hits(self, num_hits) hits = 0 done = 0 while self.rclquery.next >= 0 and self.rclquery.next < self.nres: doc = self.rclquery.fetchone() data = self.doc_to_hit(doc) self.add_new_hit (self._hit_fields, data) hits += 1 if hits >= self.SLICE or hits >= num_hits: break else: done = 1 if hits > 0: self.emit ("hits-added", hits) xesam.debug ("Search '%s' emitted 'hits-added' %d" % \ (self.get_handle(), hits)) if done: self.emit ("done") xesam.debug ("Search '%s' emitted 'done'" % self.get_handle()) self.stop() return xesam.server.Search.get_hits(self, num_hits) # Build Recoll searchData tree out of Xesam CompositeQuery # This is recursive, parent is the current SearchData into which we are # adding clauses/subsearches. def build_search(self, parent = None): Arrete apres le hackfest parce qu'apparemment il y a de gros changements la dedans. Il manque plein de trucs, comme traiter les "names" des selectors (see xesam/query.py: SELECTORS, traiter les differents types de values, et leurs attributs (phrase, slack, ordered etc, cf xesam/query.py: StringValue xq = self.get_query() cl = xq.get_clause() if isinstance(cl, xesam.query.SelectorClause): xesam.debug ("Selector clause") if parent is None: # Top clause is a selector. Needs to have a parent self.searchdata = recoll.SearchData() parent = self.searchdata # Fields. If there are several we must turn this into an OR # combination of searches on the different fields nfields = length(cl.get_fields()) if nfields > 1: orsearch = recoll.SearchData(type = "or") for fld in cl.get_fields(): simple_selec_addclause(self, orsearch, cl, fld) parent.addclause(type = "sub", subSearch = orsearch) elif nfields == 1: simple_selec_addclause(self, parent, cl, cl.get_fields[0]) else: simple_selec_addclause(self, parent, cl) elif isinstance(cl, xesam.query.CollectorClause): xesam.debug ("Collector clause") else: raise Exception("Non Collector or Selector Clause found") # Add Recoll clause for xesam selector clause, dealing with at most # one field. def simple_selec_addclause(self, parent, cl, fld = ""): parent.addclause(type = "and", field = fld, qstring = cl.get_value().get()) if __name__ == "__main__": RecollServer().start() recoll-1.17.3/python/samples/rcldlkp.py000755 001750 000000 00000005324 11740755063 020475 0ustar00dockeswheel000000 000000 #!/usr/bin/env python __doc__ = """ An exemple indexer for an arbitrary multi-document file format. Not supposed to run ''as-is'' or be really useful. ''Lookup'' notes file indexing The file format has text notes separated by lines with a single '%' character If the script is called with just the file name as an argument, it will (re)index the contents. If the script is called with second numeric argument, it will retrieve the specified record and output it in html """ import os import stat import sys import re rclconf = "/Users/dockes/.recoll-dlkp" def udi(docfile, numrec): return docfile + "#" + str(numrec) ############################################################### def index_rec(db, numrec, rec): doc = recoll.Doc() # url doc.url = "file://" + docfile # utf8fn # ipath doc.ipath = str(numrec) # mimetype doc.mimetype = "text/plain" # mtime # origcharset # title lines = rec.split("\n") if len(lines) >= 2: doc.title = unicode(lines[1], "iso-8859-1") if len(doc.title.strip()) == 0 and len(lines) >= 3: doc.title = unicode(lines[2], "iso-8859-1") # keywords # abstract # author # fbytes doc.fbytes = str(fbytes) # text doc.text = unicode(rec, "iso-8859-1") # dbytes doc.dbytes = str(len(rec)) # sig if numrec == 0: doc.sig = str(fmtime) db.addOrUpdate(udi(docfile, numrec), doc) def output_rec(rec): # Escape html rec = unicode(rec, "iso-8859-1").encode("utf-8") rec = rec.replace("<", "<"); rec = rec.replace("&", "&"); rec = rec.replace('"', "&dquot;"); print '' print '' print '
'
    print rec
    print '
' ################################################################ def usage(): sys.stderr.write("Usage: rcldlkp.py []\n") exit(1) if len(sys.argv) < 2: usage() docfile = sys.argv[1] if len(sys.argv) > 2: targetnum = int(sys.argv[2]) else: targetnum = None #print docfile, targetnum stdata = os.stat(docfile) fmtime = stdata[stat.ST_MTIME] fbytes = stdata[stat.ST_SIZE] f = open(docfile, 'r') if targetnum == None: import recoll db = recoll.connect(confdir=rclconf, writable=1) if not db.needUpdate(udi(docfile, 0), str(fmtime)): exit(0) rec = "" numrec = 1 for line in f: if re.compile("^%[ \t]*").match(line): if targetnum == None: index_rec(db, numrec, rec) elif targetnum == numrec: output_rec(rec) exit(0) numrec += 1 rec = "" else: rec += line if targetnum == None: index_rec(db, 0, "") recoll-1.17.3/python/samples/rclmbox.py000644 001750 000000 00000006657 11740755063 020517 0ustar00dockeswheel000000 000000 #!/usr/bin/env python """An example that uses python tools to parse mbox/rfcxxx format and index messages. Not supposed to run as-is or be really useful""" import mailbox import email.header import email.utils #import sys import recoll import os import stat #mbfile = "/Users/dockes/projets/fulltext/testrecoll/mail/fred" mbfile = "/Users/dockes/mail/outmail" rclconf = "/Users/dockes/.recoll-test" def header_value(msg, nm, to_utf = False): value = msg.get(nm) if value == None: return "" value = value.replace("\n", "") value = value.replace("\r", "") #print value parts = email.header.decode_header(value) #print parts univalue = u"" for part in parts: if part[1] != None: univalue += unicode(part[0], part[1]) + " " else: univalue += part[0] + " " if to_utf: return univalue.encode('utf-8') else: return univalue class mbox_indexer: def __init__(self, mbfile): self.mbfile = mbfile stdata = os.stat(mbfile) self.fmtime = stdata[stat.ST_MTIME] self.fbytes = stdata[stat.ST_SIZE] self.msgnum = 1 def sig(self): return str(self.fmtime) + ":" + str(self.fbytes) def udi(self, msgnum): return self.mbfile + ":" + str(msgnum) def index(self, db): if not db.needUpdate(self.udi(1), self.sig()): return None mb = mailbox.mbox(self.mbfile) for msg in mb.values(): self.index_message(db, msg) self.msgnum += 1 def index_message(self, db, msg): doc = recoll.Doc() doc.author = header_value(msg, "From") doc.recipient = header_value(msg, "To") + " " + header_value(msg, "Cc") # url doc.url = "file://" + self.mbfile # utf8fn # ipath doc.ipath = str(self.msgnum) # mimetype doc.mimetype = "message/rfc822" # mtime dte = header_value(msg, "Date") tm = email.utils.parsedate_tz(dte) if tm == None: doc.mtime = str(self.fmtime) else: doc.mtime = str(email.utils.mktime_tz(tm)) # origcharset # title doc.title = header_value(msg, "Subject") # keywords # abstract # author # fbytes doc.fbytes = str(self.fbytes) # text text = u"" text += u"From: " + header_value(msg, "From") + u"\n" text += u"To: " + header_value(msg, "To") + u"\n" text += u"Subject: " + header_value(msg, "Subject") + u"\n" #text += u"Message-ID: " + header_value(msg, "Message-ID") + u"\n" text += u"\n" for part in msg.walk(): if part.is_multipart(): pass #print "Multipart: " + part.get_content_type() else: ct = part.get_content_type() #print "Simple: " + ct if ct.lower() == "text/plain": charset = part.get_content_charset("iso-8859-1") print "charset: ", charset print "text: ", part.get_payload(None, True) text += unicode(part.get_payload(None, True), charset) doc.text = text # dbytes doc.dbytes = str(len(text)) # sig doc.sig = self.sig() udi = self.udi(self.msgnum) db.addOrUpdate(udi, doc) db = recoll.connect(confdir=rclconf, writable=1) mbidx = mbox_indexer(mbfile) mbidx.index(db) recoll-1.17.3/python/samples/recollq.py000755 001750 000000 00000003505 11740755063 020502 0ustar00dockeswheel000000 000000 #!/usr/bin/env python """A python version of the command line query tool recollq (a bit simplified) The input string is always interpreted as a query language string. This could actually be useful for something after some customization """ import sys from getopt import getopt import recoll allmeta = ("title", "keywords", "abstract", "url", "mimetype", "mtime", "ipath", "fbytes", "dbytes", "relevancyrating") def Usage(): print >> sys.stderr, "Usage: recollq.py [-c conf] [-i extra_index] " sys.exit(1); def doquery(db, q): """Parse and execute query on open db""" # Get query object query = db.query() # Parse/run input query string nres = query.execute(q) # Print results: print "Result count: ", nres while query.next >= 0 and query.next < nres: doc = query.fetchone() print query.next, ":", for k in ("title", "url", "mtime"): print k, ":", getattr(doc, k).encode('utf-8') abs = db.makeDocAbstract(doc, query).encode('utf-8') print abs print if len(sys.argv) < 2: Usage() confdir="" extra_dbs = [] # Snippet params maxchars = 120 contextwords = 4 # Process options: [-c confdir] [-i extra_db [-i extra_db] ...] options, args = getopt(sys.argv[1:], "c:i:") for opt,val in options: if opt == "-c": confdir = val elif opt == "-i": extra_dbs.append(val) else: print >> sys.stderr, "Bad opt: ", opt Usage() # The query should be in the remaining arg(s) if len(args) == 0: print >> sys.stderr, "No query found in command line" Usage() q = "" for word in args: q += word + " " print "QUERY: [", q, "]" db = recoll.connect(confdir=confdir, extra_dbs=extra_dbs) db.setAbstractParams(maxchars=maxchars, contextwords=contextwords) doquery(db, q) recoll-1.17.3/python/samples/recollqsd.py000644 001750 000000 00000001642 11740755063 021026 0ustar00dockeswheel000000 000000 #!/usr/bin/env python """Example for using the ''searchdata''' structured query interface. Not good for anything except showing/trying the code.""" import sys import recoll def dotest(db, q): query = db.query() query.sortby("title", 1) nres = query.executesd(q) print "Result count: ", nres if nres > 10: nres = 10 while query.next >= 0 and query.next < nres: doc = query.fetchone() print query.next for k in ("url", "mtime", "title", "author", "abstract"): print k, ":", getattr(doc, k).encode('utf-8') #abs = db.makeDocAbstract(doc, query).encode('utf-8') #print abs print # End dotest sd = recoll.SearchData() sd.addclause("and", "essaouira maroc") #sd.addclause("and", "dockes", field="author") #sd.addclause("phrase", "jean francois", 1) #sd.addclause("excl", "plage") db = recoll.connect() dotest(db, sd) sys.exit(0) recoll-1.17.3/python/recoll/Makefile000644 001750 000000 00000000122 11740755063 017730 0ustar00dockeswheel000000 000000 all: python setup.py build clean: rm -rf build distclean: clean rm -f setup.py recoll-1.17.3/python/recoll/pyrecoll.cpp000644 001750 000000 00000115347 11740755063 020645 0ustar00dockeswheel000000 000000 /* Copyright (C) 2007 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 #include #include using namespace std; #include "rclinit.h" #include "rclconfig.h" #include "rcldb.h" #include "searchdata.h" #include "rclquery.h" #include "pathut.h" #include "wasastringtoquery.h" #include "wasatorcl.h" #include "debuglog.h" #include "pathut.h" static set the_dbs; static set the_queries; static set the_docs; static RclConfig *rclconfig; // This has to exist somewhere in the python api ?? PyObject *obj_Create(PyTypeObject *tp, PyObject *args, PyObject *kwargs) { PyObject *result = tp->tp_new(tp, args, kwargs); if (result && tp->tp_init(result, args, kwargs) < 0) return 0; return result; } ////////////////////////////////////////////////////////////////////// /// SEARCHDATA SearchData code typedef struct { PyObject_HEAD /* Type-specific fields go here. */ RefCntr sd; } recoll_SearchDataObject; static void SearchData_dealloc(recoll_SearchDataObject *self) { LOGDEB(("SearchData_dealloc\n")); self->ob_type->tp_free((PyObject*)self); } static PyObject * SearchData_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { LOGDEB(("SearchData_new\n")); recoll_SearchDataObject *self; self = (recoll_SearchDataObject *)type->tp_alloc(type, 0); if (self == 0) return 0; return (PyObject *)self; } static int SearchData_init(recoll_SearchDataObject *self, PyObject *args, PyObject *kwargs) { LOGDEB(("SearchData_init\n")); static const char* kwlist[] = {"type", NULL}; char *stp = 0; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", (char**)kwlist, &stp)) return -1; Rcl::SClType tp = Rcl::SCLT_AND; if (stp && strcasecmp(stp, "or")) { tp = Rcl::SCLT_OR; } self->sd = RefCntr(new Rcl::SearchData(tp)); return 0; } /* Note: addclause necessite And/Or vient du fait que le string peut avoir plusieurs mots. A transferer dans l'i/f Python ou pas ? */ PyDoc_STRVAR(doc_addclause, "addclause(type='and'|'or'|'excl'|'phrase'|'near'|'sub',\n" " qstring=string, slack=int, field=string, stemming=1|0,\n" " subSearch=SearchData)\n" "Adds a simple clause to the SearchData And/Or chain, or a subquery\n" "defined by another SearchData object\n" ); /* Forward declaration only, definition needs recoll_searchDataType */ static PyObject * SearchData_addclause(recoll_SearchDataObject* self, PyObject *args, PyObject *kwargs); static PyMethodDef SearchData_methods[] = { {"addclause", (PyCFunction)SearchData_addclause, METH_VARARGS|METH_KEYWORDS, doc_addclause}, {NULL} /* Sentinel */ }; PyDoc_STRVAR(doc_SearchDataObject, "SearchData()\n" "\n" "A SearchData object describes a query. It has a number of global\n" "parameters and a chain of search clauses.\n" ); static PyTypeObject recoll_SearchDataType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "recoll.SearchData", /*tp_name*/ sizeof(recoll_SearchDataObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)SearchData_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ doc_SearchDataObject, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ SearchData_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)SearchData_init, /* tp_init */ 0, /* tp_alloc */ SearchData_new, /* tp_new */ }; static PyObject * SearchData_addclause(recoll_SearchDataObject* self, PyObject *args, PyObject *kwargs) { LOGDEB(("SearchData_addclause\n")); if (self->sd.isNull()) { LOGERR(("SearchData_addclause: not init??\n")); PyErr_SetString(PyExc_AttributeError, "sd"); return 0; } static const char *kwlist[] = {"type", "qstring", "slack", "field", "stemming", "subsearch", NULL}; char *tp = 0; char *qs = 0; // needs freeing int slack = 0; char *fld = 0; // needs freeing int dostem = 1; // needs freeing recoll_SearchDataObject *sub = 0; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ses|iesiO!", (char**)kwlist, &tp, "utf-8", &qs, &slack, "utf-8", &fld, &dostem, &recoll_SearchDataType, &sub)) return 0; Rcl::SearchDataClause *cl = 0; switch (tp[0]) { case 'a': case 'A': if (strcasecmp(tp, "and")) goto defaultcase; cl = new Rcl::SearchDataClauseSimple(Rcl::SCLT_AND, qs, fld?fld:""); break; case 'o': case 'O': if (strcasecmp(tp, "or")) goto defaultcase; cl = new Rcl::SearchDataClauseSimple(Rcl::SCLT_OR, qs, fld?fld:""); break; case 'e': case 'E': if (strcasecmp(tp, "excl")) goto defaultcase; cl = new Rcl::SearchDataClauseSimple(Rcl::SCLT_EXCL, qs, fld?fld:""); break; case 'n': case 'N': if (strcasecmp(tp, "near")) goto defaultcase; cl = new Rcl::SearchDataClauseDist(Rcl::SCLT_NEAR, qs, slack, fld ? fld : ""); break; case 'p': case 'P': if (strcasecmp(tp, "phrase")) goto defaultcase; cl = new Rcl::SearchDataClauseDist(Rcl::SCLT_PHRASE, qs, slack, fld ? fld : ""); break; case 's': case 'S': if (strcasecmp(tp, "sub")) goto defaultcase; cl = new Rcl::SearchDataClauseSub(Rcl::SCLT_SUB, sub->sd); break; defaultcase: default: PyErr_SetString(PyExc_AttributeError, "Bad tp arg"); return 0; } if (dostem == 0) { cl->setModifiers(Rcl::SearchDataClause::SDCM_NOSTEMMING); } PyMem_Free(qs); PyMem_Free(fld); self->sd->addClause(cl); Py_RETURN_NONE; } /////////////////////////////////////////////////////////////////////// ///// DOC Doc code typedef struct { PyObject_HEAD /* Type-specific fields go here. */ Rcl::Doc *doc; } recoll_DocObject; static void Doc_dealloc(recoll_DocObject *self) { LOGDEB(("Doc_dealloc\n")); if (self->doc) the_docs.erase(self->doc); delete self->doc; self->doc = 0; self->ob_type->tp_free((PyObject*)self); } static PyObject * Doc_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { recoll_DocObject *self; LOGDEB(("Doc_new\n")); self = (recoll_DocObject *)type->tp_alloc(type, 0); if (self == 0) return 0; self->doc = 0; return (PyObject *)self; } static int Doc_init(recoll_DocObject *self, PyObject *, PyObject *) { LOGDEB(("Doc_init\n")); if (self->doc) the_docs.erase(self->doc); delete self->doc; self->doc = new Rcl::Doc; if (self->doc == 0) return -1; the_docs.insert(self->doc); return 0; } static PyObject * Doc_getattr(recoll_DocObject *self, char *name) { LOGDEB(("Doc_getattr: name [%s]\n", name)); if (self->doc == 0 || the_docs.find(self->doc) == the_docs.end()) { PyErr_SetString(PyExc_AttributeError, "doc"); return 0; } #if 0 for (map::const_iterator it = self->doc->meta.begin(); it != self->doc->meta.end(); it++) { LOGDEB(("meta[%s] -> [%s]\n", it->first.c_str(), it->second.c_str())); } #endif string key = rclconfig->fieldCanon(string(name)); // Handle special cases, then try retrieving key value from meta // array string value; switch (key.at(0)) { case 'u': if (!key.compare(Rcl::Doc::keyurl)) { value = self->doc->url; } break; case 'f': if (!key.compare(Rcl::Doc::keyfs)) { value = self->doc->fbytes; } else if (!key.compare(Rcl::Doc::keyfs)) { value = self->doc->fbytes; } else if (!key.compare(Rcl::Doc::keyfmt)) { value = self->doc->fmtime; } break; case 'd': if (!key.compare(Rcl::Doc::keyds)) { value = self->doc->dbytes; } else if (!key.compare(Rcl::Doc::keydmt)) { value = self->doc->dmtime; } break; case 'i': if (!key.compare(Rcl::Doc::keyipt)) { value = self->doc->ipath; } break; case 'm': if (!key.compare(Rcl::Doc::keytp)) { value = self->doc->mimetype; } else if (!key.compare(Rcl::Doc::keymt)) { value = self->doc->dmtime.empty() ? self->doc->fmtime : self->doc->dmtime; } break; case 'o': if (!key.compare(Rcl::Doc::keyoc)) { value = self->doc->origcharset; } break; case 's': if (!key.compare(Rcl::Doc::keysig)) { value = self->doc->sig; } else if (!key.compare(Rcl::Doc::keysz)) { value = self->doc->dbytes.empty() ? self->doc->fbytes : self->doc->dbytes; } break; } if (value.empty()) value = self->doc->meta[key]; LOGDEB(("Doc_getattr: [%s] (%s) -> [%s]\n", name, key.c_str(), value.c_str())); // Return a python unicode object PyObject* res = PyUnicode_Decode(value.c_str(), value.size(), "UTF-8", "replace"); return res; } static int Doc_setattr(recoll_DocObject *self, char *name, PyObject *value) { if (self->doc == 0 || the_docs.find(self->doc) == the_docs.end()) { PyErr_SetString(PyExc_AttributeError, "doc??"); return -1; } LOGDEB1(("Doc_setmeta: doc %p\n", self->doc)); if (PyString_Check(value)) { value = PyUnicode_FromObject(value); if (value == 0) return -1; } if (!PyUnicode_Check(value)) { PyErr_SetString(PyExc_AttributeError, "value not str/unicode??"); return -1; } if (name == 0) { PyErr_SetString(PyExc_AttributeError, "name??"); return -1; } PyObject* putf8 = PyUnicode_AsUTF8String(value); if (putf8 == 0) { LOGERR(("Doc_setmeta: encoding to utf8 failed\n")); PyErr_SetString(PyExc_AttributeError, "value??"); return -1; } char* uvalue = PyString_AsString(putf8); string key = rclconfig->fieldCanon(string(name)); LOGDEB0(("Doc_setattr: [%s] (%s) -> [%s]\n", key.c_str(), name, uvalue)); // We set the value in the meta array in all cases. Good idea ? or do it // only for fields without a dedicated Doc:: entry? self->doc->meta[key] = uvalue; switch (key.at(0)) { case 't': if (!key.compare("text")) { self->doc->text = uvalue; } break; case 'u': if (!key.compare(Rcl::Doc::keyurl)) { self->doc->url = uvalue; } break; case 'f': if (!key.compare(Rcl::Doc::keyfs)) { self->doc->fbytes = uvalue; } else if (!key.compare(Rcl::Doc::keyfn)) { self->doc->utf8fn = uvalue; } else if (!key.compare(Rcl::Doc::keyfmt)) { self->doc->fmtime = uvalue; } break; case 'd': if (!key.compare(Rcl::Doc::keyds)) { self->doc->dbytes = uvalue; } else if (!key.compare(Rcl::Doc::keydmt)) { self->doc->dmtime = uvalue; } break; case 'i': if (!key.compare(Rcl::Doc::keyipt)) { self->doc->ipath = uvalue; } break; case 'm': if (!key.compare(Rcl::Doc::keytp)) { self->doc->mimetype = uvalue; } else if (!key.compare(Rcl::Doc::keymt)) { self->doc->dmtime = uvalue; } break; case 'o': if (!key.compare(Rcl::Doc::keyoc)) { self->doc->origcharset = uvalue; } break; case 's': if (!key.compare(Rcl::Doc::keysig)) { self->doc->sig = uvalue; } else if (!key.compare(Rcl::Doc::keysz)) { self->doc->dbytes = uvalue; } break; } return 0; } PyDoc_STRVAR(doc_DocObject, "Doc()\n" "\n" "A Doc object contains index data for a given document.\n" "The data is extracted from the index when searching, or set by the\n" "indexer program when updating. The Doc object has no useful methods but\n" "many attributes to be read or set by its user. It matches exactly the\n" "Rcl::Doc c++ object. Some of the attributes are predefined, but, \n" "especially when indexing, others can be set, the name of which will be\n" "processed as field names by the indexing configuration.\n" "Inputs can be specified as unicode or strings.\n" "Outputs are unicode objects.\n" "All dates are specified as unix timestamps, printed as strings\n" "Predefined attributes (index/query/both):\n" " text (index): document plain text\n" " url (both)\n" " fbytes (both) optional) file size in bytes\n" " filename (both)\n" " fmtime (both) optional file modification date. Unix time printed \n" " as string\n" " dbytes (both) document text bytes\n" " dmtime (both) document creation/modification date\n" " ipath (both) value private to the app.: internal access path\n" " inside file\n" " mtype (both) mime type for original document\n" " mtime (query) dmtime if set else fmtime\n" " origcharset (both) charset the text was converted from\n" " size (query) dbytes if set, else fbytes\n" " sig (both) app-defined file modification signature. \n" " For up to date checks\n" " relevancyrating (query)\n" " abstract (both)\n" " author (both)\n" " title (both)\n" " keywords (both)\n" ); static PyTypeObject recoll_DocType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "recoll.Doc", /*tp_name*/ sizeof(recoll_DocObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)Doc_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ (getattrfunc)Doc_getattr, /*tp_getattr*/ (setattrfunc)Doc_setattr, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ doc_DocObject, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)Doc_init, /* tp_init */ 0, /* tp_alloc */ Doc_new, /* tp_new */ }; ////////////////////////////////////////////////////// /// QUERY Query object typedef struct { PyObject_HEAD /* Type-specific fields go here. */ Rcl::Query *query; int next; // Index of result to be fetched next or -1 if uninit char *sortfield; int ascending; } recoll_QueryObject; static void Query_dealloc(recoll_QueryObject *self) { LOGDEB(("Query_dealloc\n")); if (self->query) the_queries.erase(self->query); delete self->query; self->query = 0; self->sortfield = 0; self->ob_type->tp_free((PyObject*)self); } static PyObject * Query_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { recoll_QueryObject *self; LOGDEB(("Query_new\n")); self = (recoll_QueryObject *)type->tp_alloc(type, 0); if (self == 0) return 0; self->query = 0; self->next = -1; self->sortfield = 0; return (PyObject *)self; } // Query_init creates an unusable object. The only way to create a // valid Query Object is through db_query(). (or we'd need to add a Db // parameter to the Query object creation method) static int Query_init(recoll_QueryObject *self, PyObject *, PyObject *) { LOGDEB(("Query_init\n")); if (self->query) the_queries.erase(self->query); delete self->query; self->query = 0; self->next = -1; self->sortfield = 0; self->ascending = true; return 0; } PyDoc_STRVAR(doc_Query_sortby, "sortby(field=fieldname, ascending=true)\n" "Sort results by 'fieldname', in ascending or descending order.\n" "Only one field can be used, no subsorts for now.\n" "Must be called before executing the search\n" ); static PyObject * Query_sortby(recoll_QueryObject* self, PyObject *args, PyObject *kwargs) { LOGDEB(("Query_sortby\n")); static const char *kwlist[] = {"field", "ascending", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", (char**)kwlist, &self->sortfield, &self->ascending)) return 0; Py_RETURN_NONE; } PyDoc_STRVAR(doc_Query_execute, "execute(query_string, stemming=1|0)\n" "\n" "Starts a search for query_string, a Recoll search language string\n" "(mostly Xesam-compatible).\n" "The query can be a simple list of terms (and'ed by default), or more\n" "complicated with field specs etc. See the Recoll manual.\n" ); static PyObject * Query_execute(recoll_QueryObject* self, PyObject *args, PyObject *kwargs) { LOGDEB(("Query_execute\n")); static const char *kwlist[] = {"query_string", "stemming", NULL}; char *sutf8 = 0; // needs freeing int dostem = 1; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "es|i:Query_execute", (char**)kwlist, "utf-8", &sutf8, &dostem)) { return 0; } LOGDEB(("Query_execute: [%s]\n", sutf8)); string utf8(sutf8); PyMem_Free(sutf8); if (self->query == 0 || the_queries.find(self->query) == the_queries.end()) { PyErr_SetString(PyExc_AttributeError, "query"); return 0; } string reason; Rcl::SearchData *sd = wasaStringToRcl(rclconfig, utf8, reason); if (!sd) { PyErr_SetString(PyExc_ValueError, reason.c_str()); return 0; } // SearchData defaults to stemming in english // Use default for now but need to add way to specify language if (!dostem) sd->setStemlang(""); RefCntr rq(sd); string sf = self->sortfield ? string(self->sortfield) : string(""); self->query->setSortBy(sf, self->ascending); self->query->setQuery(rq); int cnt = self->query->getResCnt(); self->next = 0; return Py_BuildValue("i", cnt); } PyDoc_STRVAR(doc_Query_executesd, "executesd(SearchData)\n" "\n" "Starts a search for the query defined by the SearchData object.\n" ); static PyObject * Query_executesd(recoll_QueryObject* self, PyObject *args, PyObject *kwargs) { static const char *kwlist[] = {"searchdata", NULL}; recoll_SearchDataObject *pysd = 0; LOGDEB(("Query_executeSD\n")); if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!:Query_execute", (char **)kwlist, &recoll_SearchDataType, &pysd)) { return 0; } if (pysd == 0 || self->query == 0 || the_queries.find(self->query) == the_queries.end()) { PyErr_SetString(PyExc_AttributeError, "query"); return 0; } string sf = self->sortfield ? string(self->sortfield) : string(""); self->query->setSortBy(sf, self->ascending); self->query->setQuery(pysd->sd); int cnt = self->query->getResCnt(); self->next = 0; return Py_BuildValue("i", cnt); } PyDoc_STRVAR(doc_Query_fetchone, "fetchone(None) -> Doc\n" "\n" "Fetches the next Doc object in the current search results.\n" ); static PyObject * Query_fetchone(recoll_QueryObject* self, PyObject *, PyObject *) { LOGDEB(("Query_fetchone\n")); if (self->query == 0 || the_queries.find(self->query) == the_queries.end()) { PyErr_SetString(PyExc_AttributeError, "query"); return 0; } int cnt = self->query->getResCnt(); if (cnt <= 0 || self->next < 0) { PyErr_SetString(PyExc_AttributeError, "query: no results"); return 0; } recoll_DocObject *result = (recoll_DocObject *)obj_Create(&recoll_DocType, 0, 0); if (!result) { LOGERR(("Query_fetchone: couldn't create doc object for result\n")); return 0; } if (!self->query->getDoc(self->next, *result->doc)) { PyErr_SetString(PyExc_EnvironmentError, "query: cant fetch result"); self->next = -1; return 0; } self->next++; // Move some data from the dedicated fields to the meta array to make // fetching attributes easier. Is this actually needed ? Useful for // url which is also formatted . Rcl::Doc *doc = result->doc; printableUrl(rclconfig->getDefCharset(), doc->url, doc->meta[Rcl::Doc::keyurl]); doc->meta[Rcl::Doc::keytp] = doc->mimetype; doc->meta[Rcl::Doc::keyipt] = doc->ipath; doc->meta[Rcl::Doc::keyfs] = doc->fbytes; doc->meta[Rcl::Doc::keyds] = doc->dbytes; return (PyObject *)result; } static PyMethodDef Query_methods[] = { {"execute", (PyCFunction)Query_execute, METH_VARARGS|METH_KEYWORDS, doc_Query_execute}, {"executesd", (PyCFunction)Query_executesd, METH_VARARGS|METH_KEYWORDS, doc_Query_executesd}, {"fetchone", (PyCFunction)Query_fetchone, METH_VARARGS, doc_Query_fetchone}, {"sortby", (PyCFunction)Query_sortby, METH_VARARGS|METH_KEYWORDS, doc_Query_sortby}, {NULL} /* Sentinel */ }; static PyMemberDef Query_members[] = { {(char*)"next", T_INT, offsetof(recoll_QueryObject, next), 0, (char*)"Next index to be fetched from results. Normally increments after\n" "each fetchone() call, but can be set/reset before the call effect\n" "seeking. Starts at 0" }, {NULL} /* Sentinel */ }; PyDoc_STRVAR(doc_QueryObject, "Recoll Query objects are used to execute index searches. \n" "They must be created by the Db.query() method.\n" ); static PyTypeObject recoll_QueryType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "recoll.Query", /*tp_name*/ sizeof(recoll_QueryObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)Query_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ doc_QueryObject, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ Query_methods, /* tp_methods */ Query_members, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)Query_init, /* tp_init */ 0, /* tp_alloc */ Query_new, /* tp_new */ }; /////////////////////////////////////////////// ////// DB Db object code typedef struct { PyObject_HEAD /* Type-specific fields go here. */ Rcl::Db *db; } recoll_DbObject; static void Db_dealloc(recoll_DbObject *self) { LOGDEB(("Db_dealloc\n")); if (self->db) the_dbs.erase(self->db); delete self->db; self->db = 0; self->ob_type->tp_free((PyObject*)self); } static PyObject * Db_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { LOGDEB(("Db_new\n")); recoll_DbObject *self; self = (recoll_DbObject *)type->tp_alloc(type, 0); if (self == 0) return 0; self->db = 0; return (PyObject *)self; } static int Db_init(recoll_DbObject *self, PyObject *args, PyObject *kwargs) { LOGDEB(("Db_init\n")); static const char *kwlist[] = {"confdir", "extra_dbs", "writable", NULL}; PyObject *extradbs = 0; char *confdir = 0; int writable = 0; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|sOi", (char**)kwlist, &confdir, &extradbs, &writable)) return -1; // If the user creates several dbs, changing the confdir, we call // recollinit repeatedly, which *should* be ok... string reason; delete rclconfig; if (confdir) { string cfd = confdir; rclconfig = recollinit(0, 0, reason, &cfd); } else { rclconfig = recollinit(0, 0, reason, 0); } if (rclconfig == 0) { PyErr_SetString(PyExc_EnvironmentError, reason.c_str()); return -1; } if (!rclconfig->ok()) { PyErr_SetString(PyExc_EnvironmentError, "Bad config ?"); return -1; } if (self->db) the_dbs.erase(self->db); delete self->db; self->db = new Rcl::Db(rclconfig); if (!self->db->open(writable ? Rcl::Db::DbUpd : Rcl::Db::DbRO)) { LOGERR(("Db_init: db open error\n")); PyErr_SetString(PyExc_EnvironmentError, "Can't open index"); return -1; } if (extradbs) { if (!PySequence_Check(extradbs)) { PyErr_SetString(PyExc_TypeError, "extra_dbs must be a sequence"); deleteZ(self->db); return -1; } int dbcnt = PySequence_Size(extradbs); if (dbcnt == -1) { PyErr_SetString(PyExc_TypeError, "extra_dbs could not be sized"); deleteZ(self->db); return -1; } for (int i = 0; i < dbcnt; i++) { PyObject *item = PySequence_GetItem(extradbs, i); char *s = PyString_AsString(item); Py_DECREF(item); if (!s) { PyErr_SetString(PyExc_TypeError, "extra_dbs must contain strings"); deleteZ(self->db); return -1; } if (!self->db->addQueryDb((const char *)s)) { PyErr_SetString(PyExc_EnvironmentError, "extra db could not be opened"); deleteZ(self->db); return -1; } } } the_dbs.insert(self->db); return 0; } static PyObject * Db_query(recoll_DbObject* self) { LOGDEB(("Db_query\n")); if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) { LOGERR(("Db_query: db not found %p\n", self->db)); PyErr_SetString(PyExc_AttributeError, "db"); return 0; } recoll_QueryObject *result = (recoll_QueryObject *)obj_Create(&recoll_QueryType, 0, 0); if (!result) return 0; result->query = new Rcl::Query(self->db); the_queries.insert(result->query); return (PyObject *)result; } static PyObject * Db_setAbstractParams(recoll_DbObject *self, PyObject *args, PyObject *kwargs) { LOGDEB(("Db_setAbstractParams\n")); static const char *kwlist[] = {"maxchars", "contextwords", NULL}; int ctxwords = -1, maxchars = -1; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ii", (char**)kwlist, &maxchars, &ctxwords)) return 0; if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) { LOGERR(("Db_query: db not found %p\n", self->db)); PyErr_SetString(PyExc_AttributeError, "db id not found"); return 0; } self->db->setAbstractParams(-1, maxchars, ctxwords); Py_RETURN_NONE; } static PyObject * Db_makeDocAbstract(recoll_DbObject* self, PyObject *args, PyObject *) { LOGDEB(("Db_makeDocAbstract\n")); recoll_DocObject *pydoc = 0; recoll_QueryObject *pyquery = 0; if (!PyArg_ParseTuple(args, "O!O!:Db_makeDocAbstract", &recoll_DocType, &pydoc, &recoll_QueryType, &pyquery)) { return 0; } if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) { LOGERR(("Db_makeDocAbstract: db not found %p\n", self->db)); PyErr_SetString(PyExc_AttributeError, "db"); return 0; } if (pydoc->doc == 0 || the_docs.find(pydoc->doc) == the_docs.end()) { LOGERR(("Db_makeDocAbstract: doc not found %p\n", pydoc->doc)); PyErr_SetString(PyExc_AttributeError, "doc"); return 0; } if (pyquery->query == 0 || the_queries.find(pyquery->query) == the_queries.end()) { LOGERR(("Db_makeDocAbstract: query not found %p\n", pyquery->query)); PyErr_SetString(PyExc_AttributeError, "query"); return 0; } string abstract; if (!self->db->makeDocAbstract(*(pydoc->doc), pyquery->query, abstract)) { PyErr_SetString(PyExc_EnvironmentError, "rcl makeDocAbstract failed"); return 0; } // Return a python unicode object return PyUnicode_Decode(abstract.c_str(), abstract.size(), "UTF-8", "replace"); } static PyObject * Db_needUpdate(recoll_DbObject* self, PyObject *args, PyObject *kwds) { char *udi = 0; // needs freeing char *sig = 0; // needs freeing LOGDEB(("Db_needUpdate\n")); if (!PyArg_ParseTuple(args, "eses:Db_needUpdate", "utf-8", &udi, "utf-8", &sig)) { return 0; } if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) { LOGERR(("Db_needUpdate: db not found %p\n", self->db)); PyErr_SetString(PyExc_AttributeError, "db"); PyMem_Free(udi); PyMem_Free(sig); return 0; } bool result = self->db->needUpdate(udi, sig); PyMem_Free(udi); PyMem_Free(sig); return Py_BuildValue("i", result); } static PyObject * Db_delete(recoll_DbObject* self, PyObject *args, PyObject *kwds) { char *udi = 0; // needs freeing LOGDEB(("Db_delete\n")); if (!PyArg_ParseTuple(args, "es:Db_delete", "utf-8", &udi)) { return 0; } if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) { LOGERR(("Db_delete: db not found %p\n", self->db)); PyErr_SetString(PyExc_AttributeError, "db"); PyMem_Free(udi); return 0; } bool result = self->db->purgeFile(udi); PyMem_Free(udi); return Py_BuildValue("i", result); } static PyObject * Db_purge(recoll_DbObject* self) { if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) { LOGERR(("Db_purge: db not found %p\n", self->db)); PyErr_SetString(PyExc_AttributeError, "db"); return 0; } bool result = self->db->purge(); return Py_BuildValue("i", result); } static PyObject * Db_addOrUpdate(recoll_DbObject* self, PyObject *args, PyObject *) { LOGDEB(("Db_addOrUpdate\n")); char *sudi = 0; // needs freeing char *sparent_udi = 0; // needs freeing recoll_DocObject *pydoc; if (!PyArg_ParseTuple(args, "esO!|es:Db_addOrUpdate", "utf-8", &sudi, &recoll_DocType, &pydoc, "utf-8", &sparent_udi)) { return 0; } string udi(sudi); string parent_udi(sparent_udi ? sparent_udi : ""); PyMem_Free(sudi); PyMem_Free(sparent_udi); if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) { LOGERR(("Db_addOrUpdate: db not found %p\n", self->db)); PyErr_SetString(PyExc_AttributeError, "db"); return 0; } if (pydoc->doc == 0 || the_docs.find(pydoc->doc) == the_docs.end()) { LOGERR(("Db_addOrUpdate: doc not found %p\n", pydoc->doc)); PyErr_SetString(PyExc_AttributeError, "doc"); return 0; } if (!self->db->addOrUpdate(udi, parent_udi, *pydoc->doc)) { LOGERR(("Db_addOrUpdate: rcldb error\n")); PyErr_SetString(PyExc_AttributeError, "rcldb error"); return 0; } Py_RETURN_NONE; } static PyMethodDef Db_methods[] = { {"query", (PyCFunction)Db_query, METH_NOARGS, "query() -> Query. Return a new, blank query object for this index." }, {"setAbstractParams", (PyCFunction)Db_setAbstractParams, METH_VARARGS|METH_KEYWORDS, "setAbstractParams(maxchars, contextwords).\n" "Set the parameters used to build 'keyword-in-context' abstracts" }, {"makeDocAbstract", (PyCFunction)Db_makeDocAbstract, METH_VARARGS, "makeDocAbstract(Doc, Query) -> string\n" "Build and return 'keyword-in-context' abstract for document\n" "and query." }, {"needUpdate", (PyCFunction)Db_needUpdate, METH_VARARGS, "needUpdate(udi, sig) -> Bool.\n" "Check if the index is up to date for the document defined by udi,\n" "having the current signature sig." }, {"delete", (PyCFunction)Db_delete, METH_VARARGS, "delete(udi) -> Bool.\n" "Purge index from all data for udi. If udi matches a container\n" "document, purge all subdocs (docs with a parent_udi matching udi)." }, {"purge", (PyCFunction)Db_purge, METH_NOARGS, "purge() -> Bool.\n" "Delete all documents that were not touched during the just finished\n" "indexing pass (since open-for-write). These are the documents for\n" "the needUpdate() call was not performed, indicating that they no\n" "longer exist in the primary storage system.\n" }, {"addOrUpdate", (PyCFunction)Db_addOrUpdate, METH_VARARGS, "addOrUpdate(udi, doc, parent_udi=None) -> None\n" "Add or update index data for a given document\n" "The udi string must define a unique id for the document. It is not\n" "interpreted inside Recoll\n" "doc is a Doc object\n" "if parent_udi is set, this is a unique identifier for the\n" "top-level container (ie mbox file)" }, {NULL} /* Sentinel */ }; PyDoc_STRVAR(doc_DbObject, "Db([confdir=None], [extra_dbs=None], [writable = False])\n" "\n" "A Db object holds a connection to a Recoll index. Use the connect()\n" "function to create one.\n" "confdir specifies a Recoll configuration directory (default: \n" " $RECOLL_CONFDIR or ~/.recoll).\n" "extra_dbs is a list of external databases (xapian directories)\n" "writable decides if we can index new data through this connection\n" ); static PyTypeObject recoll_DbType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "recoll.Db", /*tp_name*/ sizeof(recoll_DbObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)Db_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ doc_DbObject, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ Db_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)Db_init, /* tp_init */ 0, /* tp_alloc */ Db_new, /* tp_new */ }; ////////////////////////////////////////////////////////////////////////// // Module methods static PyObject * recoll_connect(PyObject *self, PyObject *args, PyObject *kwargs) { LOGDEB(("recoll_connect\n")); recoll_DbObject *db = (recoll_DbObject *)obj_Create(&recoll_DbType, args, kwargs); return (PyObject *)db; } PyDoc_STRVAR(doc_connect, "connect([confdir=None], [extra_dbs=None], [writable = False])\n" " -> Db.\n" "\n" "Connects to a Recoll database and returns a Db object.\n" "confdir specifies a Recoll configuration directory\n" "(the default is built like for any Recoll program).\n" "extra_dbs is a list of external databases (xapian directories)\n" "writable decides if we can index new data through this connection\n" ); static PyMethodDef recollMethods[] = { {"connect", (PyCFunction)recoll_connect, METH_VARARGS|METH_KEYWORDS, doc_connect}, {NULL, NULL, 0, NULL} /* Sentinel */ }; PyDoc_STRVAR(pyrecoll_doc_string, "This is an interface to the Recoll full text indexer."); #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ #define PyMODINIT_FUNC void #endif PyMODINIT_FUNC initrecoll(void) { string reason; rclconfig = recollinit(0, 0, reason, 0); if (rclconfig == 0) { PyErr_SetString(PyExc_EnvironmentError, reason.c_str()); return; } if (!rclconfig->ok()) { PyErr_SetString(PyExc_EnvironmentError, "Recoll init error: bad environment ?"); return; } PyObject* m; m = Py_InitModule3("recoll", recollMethods, "Recoll extension module."); if (PyType_Ready(&recoll_DbType) < 0) return; Py_INCREF(&recoll_DbType); PyModule_AddObject(m, "Db", (PyObject *)&recoll_DbType); if (PyType_Ready(&recoll_QueryType) < 0) return; Py_INCREF(&recoll_QueryType); PyModule_AddObject(m, "Query", (PyObject *)&recoll_QueryType); if (PyType_Ready(&recoll_DocType) < 0) return; Py_INCREF(&recoll_DocType); PyModule_AddObject(m, "Doc", (PyObject *)&recoll_DocType); if (PyType_Ready(&recoll_SearchDataType) < 0) return; Py_INCREF(&recoll_SearchDataType); PyModule_AddObject(m, "SearchData", (PyObject *)&recoll_SearchDataType); PyModule_AddStringConstant(m, "__doc__", pyrecoll_doc_string); } recoll-1.17.3/python/recoll/setup.py.in000644 001750 000000 00000004141 11740755063 020414 0ustar00dockeswheel000000 000000 from distutils.core import setup, Extension import os import sys sysname = os.uname()[0] top = os.path.join('..', '..') libiconv = "@LIBICONV@" if libiconv.find("-liconv") != -1: libs = ['rcl', 'xapian', 'iconv'] else: libs = ['rcl', 'xapian'] libxapiandir="@LIBXAPIANDIR@" if libxapiandir != "": libdirs = [os.path.join(top, 'lib'), libxapiandir, '/usr/local/lib'] else: libdirs = [os.path.join(top, 'lib'), '/usr/local/lib'] # Verify that the Recoll library was compiled with the PIC options localdefs = os.path.join(top, 'mk', 'localdefs') try: lines = open(localdefs, 'r').readlines() except: print 'You need to build recoll first. Use configure --enable-pic' sys.exit(1) picok = False for line in lines: if line.find('PICFLAGS') == 0: picok = True break if not picok: print 'You need to rebuild recoll with PIC enabled. Use configure --enable-pic and make clean' sys.exit(1) module1 = Extension('recoll', define_macros = [('MAJOR_VERSION', '1'), ('MINOR_VERSION', '0'), ('UNAC_VERSION', '"1.0.7"'), ('RECOLL_DATADIR', '"@QTRECOLL_DATADIR@"') ], include_dirs = ['/usr/local/include', os.path.join(top, 'utils'), os.path.join(top, 'common'), os.path.join(top, 'rcldb'), os.path.join(top, 'query'), os.path.join(top, 'unac') ], libraries = libs, library_dirs = libdirs, sources = ['pyrecoll.cpp', ]) setup (name = 'Recoll', version = '1.0', description = 'Query/Augment a Recoll full text index', author = 'J.F. Dockes', author_email = 'jfd@recoll.org', long_description = ''' ''', ext_modules = [module1]) recoll-1.17.3/php/00README.txt000644 001750 000000 00000001360 11740755063 016121 0ustar00dockeswheel000000 000000 Recoll PHP extension: Author: Wenqiang Song (wsong.cn, google mail) This has minimum features for now. The php/sample/ subdirectory has a minimal script which demonstrates the interface. Building the extension needs the librcl.a library (recoll-xxx/lib/librcl.a) to have been built with PIC objects. Use "configure --enable-pic" in the top Recoll directory, then "make". There is no significant disadvantage in using PIC objects for everything so you need not bother having different builds for the extensions and the programs. The php/recoll/ subdirectory has the C++ code and the build script (make.sh). You'll need to "make install" after building. If you want to clean up the php/recoll/ directory, you can run phpize --clean in there. recoll-1.17.3/php/recoll/000755 001750 000000 00000000000 11740755063 015543 5ustar00dockeswheel000000 000000 recoll-1.17.3/php/sample/000755 001750 000000 00000000000 11740755063 015544 5ustar00dockeswheel000000 000000 recoll-1.17.3/php/sample/shell.php000644 001750 000000 00000000773 11740755063 017373 0ustar00dockeswheel000000 000000 query("python",120,16); if( false == $rescnt ) { echo "error during query\n"; var_dump($rescnt); return; } print "total results ".$rescnt."\n"; for ($i = 0; $i < $rescnt; $i++) { $res = $query->get_doc($i); if( false == $res) { echo "error\n"; return; } $token=strtok($res,$splitter); while ($token != false) { echo "$token\n"; $token = strtok($splitter); } } ?> recoll-1.17.3/php/recoll/config.m4000644 001750 000000 00000001226 11740755063 017253 0ustar00dockeswheel000000 000000 PHP_ARG_ENABLE(recoll, [Whether to enable the "recoll" extension], [ --enable-recoll Enable "recoll" extension support]) if test $PHP_RECOLL != "no"; then PHP_REQUIRE_CXX() PHP_SUBST(RECOLL_SHARED_LIBADD) PHP_ADD_INCLUDE(../../utils) PHP_ADD_INCLUDE(../../common) PHP_ADD_INCLUDE(../../rcldb) PHP_ADD_INCLUDE(../../query) PHP_ADD_INCLUDE(../../unac) PHP_ADD_INCLUDE(../../internfile) PHP_ADD_LIBRARY_WITH_PATH(rcl, ../../lib, RECOLL_SHARED_LIBADD) PHP_ADD_LIBRARY(xapian, , RECOLL_SHARED_LIBADD) PHP_ADD_LIBRARY(stdc++, 1, RECOLL_SHARED_LIBADD) PHP_NEW_EXTENSION(recoll, recoll.cpp, $ext_shared) fi recoll-1.17.3/php/recoll/make.sh000755 001750 000000 00000000640 11740755063 017017 0ustar00dockeswheel000000 000000 #!/bin/sh phpize --clean phpize # The version of libtool shipped with php at this time (2010-01-29) # is buggy (ECHO/echo typo...) # autoreconf -i should replace them with the system versions # Another approach would be to ship an autoconf'd version to avoid # needing autotools on the target compile system. What a mess. rm -f ltmain.sh libtool rm -f aclocal.m4 autoreconf -i ./configure --enable-recoll make -j3 recoll-1.17.3/php/recoll/php_recoll.h000644 001750 000000 00000000477 11740755063 020053 0ustar00dockeswheel000000 000000 #ifndef PHP_RECOLL_H #define PHP_RECOLL_H #define PHP_RECOLL_EXTNAME "recoll" #define PHP_RECOLL_EXTVER "0.1" #ifdef HAVE_CONFIG_H #include "config.h" #endif extern "C" { #include "php.h" } extern zend_module_entry recoll_module_entry; #define phpext_recoll_ptr &recoll_module_entry; #endif /* PHP_RECOLL_H */ recoll-1.17.3/php/recoll/recoll.cpp000644 001750 000000 00000014303 11740755063 017530 0ustar00dockeswheel000000 000000 /* * 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. */ /* * First Draft 2010/01/22 * Wenqiang Song * wsong.cn@gmail.com */ #include "php_recoll.h" #include #include #include #include #include #include #include #include #include "rcldb.h" #include "rclquery.h" #include "rclconfig.h" #include "pathut.h" #include "rclinit.h" #include "debuglog.h" #include "wasastringtoquery.h" #include "wasatorcl.h" #include "internfile.h" #include "wipedir.h" #include "transcode.h" using namespace std; /* * Class Query Definition */ zend_object_handlers query_object_handlers; zend_class_entry *query_ce; struct query_object { zend_object std; Rcl::Query *pRclQuery; Rcl::Db *pRclDb; }; void query_free_storage(void *object TSRMLS_DC) { query_object *obj = (query_object *)object; delete obj->pRclQuery; delete obj->pRclDb; zend_hash_destroy(obj->std.properties); FREE_HASHTABLE(obj->std.properties); efree(obj); } zend_object_value query_create_handler(zend_class_entry *type TSRMLS_DC) { zval *tmp; zend_object_value retval; query_object *obj = (query_object *)emalloc(sizeof(query_object)); memset(obj, 0, sizeof(query_object)); obj->std.ce = type; ALLOC_HASHTABLE(obj->std.properties); zend_hash_init(obj->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); zend_hash_copy(obj->std.properties, &type->default_properties, (copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *)); retval.handle = zend_objects_store_put(obj, NULL, query_free_storage, NULL TSRMLS_CC); retval.handlers = &query_object_handlers; return retval; } PHP_METHOD(Query, query) { string reason; string a_config; char *qs_c; int qs_len; long maxchars; long ctxwords; if (zend_parse_parameters(3 TSRMLS_CC, "sll", &qs_c, &qs_len, &maxchars, &ctxwords) == FAILURE) { printf("failed to get parameters\n"); RETURN_BOOL(false); } string qs = qs_c; RclConfig *rclconfig = recollinit(0, 0, reason, &a_config); if (!rclconfig || !rclconfig->ok()) { fprintf(stderr, "Recoll init failed: %s\n", reason.c_str()); RETURN_BOOL(false); } Rcl::Db *pRclDb = new Rcl::Db(rclconfig); if (!pRclDb->open(Rcl::Db::DbRO)) { cerr << "Cant open database in " << rclconfig->getDbDir() << " reason: " << pRclDb->getReason() << endl; RETURN_BOOL(false); } pRclDb->setAbstractParams(-1, maxchars, ctxwords); Rcl::SearchData *sd = 0; // jf: the original implementation built an AND clause. It would // be nice to offer an option, but the next best thing is to // default to the query language sd = wasaStringToRcl(rclconfig, qs, reason); if (!sd) { cerr << "Query string interpretation failed: " << reason << endl; RETURN_BOOL(false); } sd->setStemlang("english"); RefCntr rq(sd); Rcl::Query *pRclQuery = new Rcl::Query(pRclDb); pRclQuery->setQuery(rq); query_object *obj = (query_object *)zend_object_store_get_object(getThis() TSRMLS_CC); obj->pRclQuery = pRclQuery; obj->pRclDb = pRclDb; int rescnt = pRclQuery->getResCnt(); RETURN_LONG(rescnt); /* -1 means no result */ } PHP_METHOD(Query, get_doc) { Rcl::Query *pRclQuery; query_object *obj = (query_object *)zend_object_store_get_object( getThis() TSRMLS_CC); pRclQuery = obj->pRclQuery; if(NULL == pRclQuery) { printf("error, NULL pointer pRclQuery\n"); RETURN_BOOL(false); } long index; if (zend_parse_parameters(1 TSRMLS_CC, "l", &index) == FAILURE) { RETURN_BOOL(false); } Rcl::Doc doc; if (!pRclQuery->getDoc(index, doc)) { RETURN_BOOL(false); } string abs; pRclQuery->whatDb()->makeDocAbstract(doc, pRclQuery, abs); char splitter[] = {7,8,1,2,0}; char ret_string[1000]; snprintf(ret_string, 1000, "mime:%s%surl:%s%stitle:%s%sabs:%s", doc.mimetype.c_str(),splitter, doc.url.c_str(),splitter, doc.meta[Rcl::Doc::keytt].c_str(), splitter, abs.c_str()); RETURN_STRING(ret_string, 1); } function_entry query_methods[] = { PHP_ME(Query, query, NULL, ZEND_ACC_PUBLIC) PHP_ME(Query, get_doc, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; /* End of Class Query Definition */ PHP_FUNCTION(recoll_connect) { zval *object; ALLOC_INIT_ZVAL(object); object_init_ex(object, query_ce); query_object *obj = (query_object *)zend_object_store_get_object(object TSRMLS_CC); obj->pRclQuery = NULL; RETURN_ZVAL(object,NULL,NULL); } function_entry recoll_functions[] = { PHP_FE(recoll_connect, NULL) {NULL, NULL, NULL} }; PHP_MINIT_FUNCTION(recoll) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, "Query", query_methods); query_ce = zend_register_internal_class(&ce TSRMLS_CC); query_ce->create_object = query_create_handler; memcpy(&query_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); query_object_handlers.clone_obj = NULL; return SUCCESS; } zend_module_entry recoll_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif PHP_RECOLL_EXTNAME, recoll_functions, /* Functions */ PHP_MINIT(recoll), /* MINIT */ NULL, /* MSHUTDOWN */ NULL, /* RINIT */ NULL, /* RSHUTDOWN */ NULL, /* MINFO */ #if ZEND_MODULE_API_NO >= 20010901 PHP_RECOLL_EXTVER, #endif STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_RECOLL extern "C" { ZEND_GET_MODULE(recoll) } #endif recoll-1.17.3/mk/AIX000644 001750 000000 00000000245 11740755063 014450 0ustar00dockeswheel000000 000000 include $(depth)/mk/commondefs include $(depth)/mk/localdefs ALL_CXXFLAGS = $(CXXFLAGS) $(COMMONCXXFLAGS) $(LOCALCXXFLAGS) CC = gcc CXX = g++ LIBSYS = -lpthread recoll-1.17.3/mk/Darwin000644 001750 000000 00000000227 11740755063 015253 0ustar00dockeswheel000000 000000 include $(depth)/mk/commondefs include $(depth)/mk/localdefs ALL_CXXFLAGS = $(CXXFLAGS) $(COMMONCXXFLAGS) $(LOCALCXXFLAGS) RANLIB = ranlib LIBSYS = recoll-1.17.3/mk/Default000644 001750 000000 00000000251 11740755063 015410 0ustar00dockeswheel000000 000000 include $(depth)/mk/commondefs include $(depth)/mk/localdefs ALL_CXXFLAGS = $(CXXFLAGS) $(COMMONCXXFLAGS) $(LOCALCXXFLAGS) \ -D_GNU_SOURCE LIBSYS = -lpthread -ldl recoll-1.17.3/mk/FreeBSD000644 001750 000000 00000000223 11740755063 015235 0ustar00dockeswheel000000 000000 include $(depth)/mk/commondefs include $(depth)/mk/localdefs ALL_CXXFLAGS = $(CXXFLAGS) $(COMMONCXXFLAGS) $(LOCALCXXFLAGS) -pthread LIBSYS = -lz recoll-1.17.3/mk/Linux000644 001750 000000 00000000251 11740755063 015123 0ustar00dockeswheel000000 000000 include $(depth)/mk/commondefs include $(depth)/mk/localdefs ALL_CXXFLAGS = $(CXXFLAGS) $(COMMONCXXFLAGS) $(LOCALCXXFLAGS) \ -D_GNU_SOURCE LIBSYS = -lpthread -ldl recoll-1.17.3/mk/OpenBSD000644 001750 000000 00000000243 11740755063 015257 0ustar00dockeswheel000000 000000 include $(depth)/mk/commondefs include $(depth)/mk/localdefs ALL_CXXFLAGS = $(CXXFLAGS) $(COMMONCXXFLAGS) $(LOCALCXXFLAGS) \ -pthread -I/usr/include LIBSYS = recoll-1.17.3/mk/SunOS000644 001750 000000 00000000271 11740755063 015035 0ustar00dockeswheel000000 000000 include $(depth)/mk/commondefs include $(depth)/mk/localdefs ALL_CXXFLAGS = $(CXXFLAGS) $(COMMONCXXFLAGS) $(LOCALCXXFLAGS) CC = gcc CXX = g++ LIBSYS = -lpthread -lnsl -lsocket -ldl recoll-1.17.3/mk/commondefs000644 001750 000000 00000001004 11740755063 016153 0ustar00dockeswheel000000 000000 # Common/default for all systems, can be overridden by sys-specific include COMMONCXXFLAGS = -I. \ -I$(depth)/aspell \ -I$(depth)/bincimapmime \ -I$(depth)/common \ -I$(depth)/index \ -I$(depth)/internfile \ -I$(depth)/rcldb \ -I$(depth)/unac \ -I$(depth)/utils # We happen to be using gcc on all platforms for now. Can be overridden in # the sys file or localdefs SYSPICFLAGS = -fPIC -DPIC BIGLIB = $(depth)/lib/librcl.a RANLIB = test -f AR=ar recoll-1.17.3/mk/localdefs.in000644 001750 000000 00000001421 11740755063 016365 0ustar00dockeswheel000000 000000 # @(#$Id: localdefs.in,v 1.14 2008-09-07 06:43:30 dockes Exp $ (C) 2006 J.F.Dockes # 'Make' definitions which depend on local configuration. LIBXAPIAN=@LIBXAPIAN@ XAPIANCXXFLAGS=@XAPIANCXXFLAGS@ LIBICONV=@LIBICONV@ INCICONV=@INCICONV@ LIBFAM = @LIBFAM@ X_CFLAGS=@X_CFLAGS@ X_PRE_LIBS=@X_PRE_LIBS@ X_LIBS=@X_LIBS@ X_EXTRA_LIBS=@X_EXTRA_LIBS@ X_LIBX11=@X_LIBX11@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ libdir = @libdir@ RECOLL_DATADIR = ${datadir}/recoll @NOPIC@PICFLAGS = $(SYSPICFLAGS) LOCALCXXFLAGS = -g -O2 -Wall -Wno-unused \ $(INCICONV) $(XAPIANCXXFLAGS) $(X_CFLAGS) \ -DRECOLL_DATADIR=\"$(RECOLL_DATADIR)\" \ -DLIBDIR=\"$(libdir)\" \ $(PICFLAGS) \ @DEFS@ CXXFLAGS ?= @CXXFLAGS@ recoll-1.17.3/lib/mkMake000755 001750 000000 00000010162 11757427521 015400 0ustar00dockeswheel000000 000000 #!/bin/sh mk=Makefile depth=${depth:-..} SRC_CPP="\ ${depth}/aspell/rclaspell.cpp \ ${depth}/common/beaglequeuecache.cpp \ ${depth}/common/cstr.cpp \ ${depth}/common/rclconfig.cpp \ ${depth}/common/rclinit.cpp \ ${depth}/common/textsplit.cpp \ ${depth}/common/unacpp.cpp \ ${depth}/index/beaglequeue.cpp \ ${depth}/index/fsindexer.cpp \ ${depth}/index/indexer.cpp \ ${depth}/index/mimetype.cpp \ ${depth}/index/subtreelist.cpp \ ${depth}/internfile/htmlparse.cpp \ ${depth}/internfile/myhtmlparse.cpp \ ${depth}/internfile/mimehandler.cpp \ ${depth}/internfile/internfile.cpp \ ${depth}/internfile/mh_exec.cpp \ ${depth}/internfile/mh_execm.cpp \ ${depth}/internfile/mh_html.cpp \ ${depth}/internfile/mh_mail.cpp \ ${depth}/internfile/mh_mbox.cpp \ ${depth}/internfile/mh_text.cpp \ ${depth}/internfile/txtdcode.cpp \ ${depth}/query/docseq.cpp \ ${depth}/query/docseqdb.cpp \ ${depth}/query/docseqhist.cpp \ ${depth}/query/filtseq.cpp \ ${depth}/query/dynconf.cpp \ ${depth}/query/plaintorich.cpp \ ${depth}/query/recollq.cpp \ ${depth}/query/reslistpager.cpp \ ${depth}/query/sortseq.cpp \ ${depth}/query/wasastringtoquery.cpp \ ${depth}/query/wasatorcl.cpp \ ${depth}/rcldb/rcldb.cpp \ ${depth}/rcldb/rcldoc.cpp \ ${depth}/rcldb/rclquery.cpp \ ${depth}/rcldb/searchdata.cpp \ ${depth}/rcldb/stemdb.cpp \ ${depth}/rcldb/stoplist.cpp \ ${depth}/utils/base64.cpp \ ${depth}/utils/circache.cpp \ ${depth}/utils/closefrom.cpp \ ${depth}/utils/conftree.cpp \ ${depth}/utils/copyfile.cpp \ ${depth}/utils/debuglog.cpp \ ${depth}/utils/ecrontab.cpp \ ${depth}/utils/execmd.cpp \ ${depth}/utils/fstreewalk.cpp \ ${depth}/utils/idfile.cpp \ ${depth}/utils/fileudi.cpp \ ${depth}/utils/md5.cpp \ ${depth}/utils/mimeparse.cpp \ ${depth}/utils/netcon.cpp \ ${depth}/utils/pathut.cpp \ ${depth}/utils/pxattr.cpp \ ${depth}/utils/rclionice.cpp \ ${depth}/utils/readfile.cpp \ ${depth}/utils/smallut.cpp \ ${depth}/utils/transcode.cpp \ ${depth}/utils/wipedir.cpp \ ${depth}/utils/x11mon.cpp \ " SRC_CC="\ ${depth}/bincimapmime/mime-parsefull.cc \ ${depth}/bincimapmime/mime-parseonlyheader.cc \ ${depth}/bincimapmime/mime-printbody.cc \ ${depth}/bincimapmime/mime.cc \ ${depth}/bincimapmime/convert.cc \ ${depth}/bincimapmime/iodevice.cc \ ${depth}/bincimapmime/iofactory.cc \ " for c in $SRC_CPP;do o=`basename $c .cpp`.o OBJS="$OBJS $o" d=`basename $c .cpp`.dep cp /dev/null $d s=`basename $c .cpp`.dep.stamp DEPS="$DEPS $s" done for c in $SRC_CC;do o=`basename $c .cc`.o OBJS="$OBJS $o" d=`basename $c .cc`.dep cp /dev/null $d s=`basename $c .cc`.dep.stamp DEPS="$DEPS $s" done # The objects need to depend on the localdefs file in case it is # changed by a re-configure (it has the local compile flags) defs=\$\(depth\)/mk/localdefs test -f $mk && chmod +w $mk cat > $mk <> $mk echo " \$(CXX) \$(ALL_CXXFLAGS) -c $c" >> $mk done for c in $SRC_CC;do o=`basename $c .cc`.o echo "$o : $c $defs" >> $mk echo " \$(CXX) \$(ALL_CXXFLAGS) -c $c" >> $mk done cat >> $mk <> $mk echo " \$(CXX) -M \$(ALL_CXXFLAGS) $c > $d" >> $mk echo " touch $s" >> $mk done for c in $SRC_CPP;do d=`basename $c .cpp`.dep echo "include $d" >> $mk done for c in $SRC_CC;do d=`basename $c .cc`.dep s=`basename $c .cc`.dep.stamp echo "$s : $c $defs" >> $mk echo " \$(CXX) -M \$(ALL_CXXFLAGS) $c > $d" >> $mk echo " touch $s" >> $mk done for c in $SRC_CC;do d=`basename $c .cc`.dep echo "include $d" >> $mk done recoll-1.17.3/lib/Makefile000644 001750 000000 00000054311 11757433165 015712 0ustar00dockeswheel000000 000000 # DONT EDIT BY HAND: created by script mkMake depth = .. include $(depth)/mk/sysconf LIBS = librcl.a all: $(LIBS) OBJS = rclaspell.o beaglequeuecache.o cstr.o rclconfig.o rclinit.o textsplit.o unacpp.o beaglequeue.o fsindexer.o indexer.o mimetype.o subtreelist.o htmlparse.o myhtmlparse.o mimehandler.o internfile.o mh_exec.o mh_execm.o mh_html.o mh_mail.o mh_mbox.o mh_text.o txtdcode.o docseq.o docseqdb.o docseqhist.o filtseq.o dynconf.o plaintorich.o recollq.o reslistpager.o sortseq.o wasastringtoquery.o wasatorcl.o rcldb.o rcldoc.o rclquery.o searchdata.o stemdb.o stoplist.o base64.o circache.o closefrom.o conftree.o copyfile.o debuglog.o ecrontab.o execmd.o fstreewalk.o idfile.o fileudi.o md5.o mimeparse.o netcon.o pathut.o pxattr.o rclionice.o readfile.o smallut.o transcode.o wipedir.o x11mon.o mime-parsefull.o mime-parseonlyheader.o mime-printbody.o mime.o convert.o iodevice.o iofactory.o DEPS = rclaspell.dep.stamp beaglequeuecache.dep.stamp cstr.dep.stamp rclconfig.dep.stamp rclinit.dep.stamp textsplit.dep.stamp unacpp.dep.stamp beaglequeue.dep.stamp fsindexer.dep.stamp indexer.dep.stamp mimetype.dep.stamp subtreelist.dep.stamp htmlparse.dep.stamp myhtmlparse.dep.stamp mimehandler.dep.stamp internfile.dep.stamp mh_exec.dep.stamp mh_execm.dep.stamp mh_html.dep.stamp mh_mail.dep.stamp mh_mbox.dep.stamp mh_text.dep.stamp txtdcode.dep.stamp docseq.dep.stamp docseqdb.dep.stamp docseqhist.dep.stamp filtseq.dep.stamp dynconf.dep.stamp plaintorich.dep.stamp recollq.dep.stamp reslistpager.dep.stamp sortseq.dep.stamp wasastringtoquery.dep.stamp wasatorcl.dep.stamp rcldb.dep.stamp rcldoc.dep.stamp rclquery.dep.stamp searchdata.dep.stamp stemdb.dep.stamp stoplist.dep.stamp base64.dep.stamp circache.dep.stamp closefrom.dep.stamp conftree.dep.stamp copyfile.dep.stamp debuglog.dep.stamp ecrontab.dep.stamp execmd.dep.stamp fstreewalk.dep.stamp idfile.dep.stamp fileudi.dep.stamp md5.dep.stamp mimeparse.dep.stamp netcon.dep.stamp pathut.dep.stamp pxattr.dep.stamp rclionice.dep.stamp readfile.dep.stamp smallut.dep.stamp transcode.dep.stamp wipedir.dep.stamp x11mon.dep.stamp mime-parsefull.dep.stamp mime-parseonlyheader.dep.stamp mime-printbody.dep.stamp mime.dep.stamp convert.dep.stamp iodevice.dep.stamp iofactory.dep.stamp librcl.a : $(DEPS) $(OBJS) unac.o ar ru librcl.a $(OBJS) unac.o $(RANLIB) librcl.a unac.o : $(depth)/unac/unac.c $(depth)/unac/unac.h $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c $(depth)/unac/unac.c rclaspell.o : ../aspell/rclaspell.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../aspell/rclaspell.cpp beaglequeuecache.o : ../common/beaglequeuecache.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../common/beaglequeuecache.cpp cstr.o : ../common/cstr.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../common/cstr.cpp rclconfig.o : ../common/rclconfig.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../common/rclconfig.cpp rclinit.o : ../common/rclinit.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../common/rclinit.cpp textsplit.o : ../common/textsplit.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../common/textsplit.cpp unacpp.o : ../common/unacpp.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../common/unacpp.cpp beaglequeue.o : ../index/beaglequeue.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../index/beaglequeue.cpp fsindexer.o : ../index/fsindexer.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../index/fsindexer.cpp indexer.o : ../index/indexer.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../index/indexer.cpp mimetype.o : ../index/mimetype.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../index/mimetype.cpp subtreelist.o : ../index/subtreelist.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../index/subtreelist.cpp htmlparse.o : ../internfile/htmlparse.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../internfile/htmlparse.cpp myhtmlparse.o : ../internfile/myhtmlparse.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../internfile/myhtmlparse.cpp mimehandler.o : ../internfile/mimehandler.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../internfile/mimehandler.cpp internfile.o : ../internfile/internfile.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../internfile/internfile.cpp mh_exec.o : ../internfile/mh_exec.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../internfile/mh_exec.cpp mh_execm.o : ../internfile/mh_execm.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../internfile/mh_execm.cpp mh_html.o : ../internfile/mh_html.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../internfile/mh_html.cpp mh_mail.o : ../internfile/mh_mail.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../internfile/mh_mail.cpp mh_mbox.o : ../internfile/mh_mbox.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../internfile/mh_mbox.cpp mh_text.o : ../internfile/mh_text.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../internfile/mh_text.cpp txtdcode.o : ../internfile/txtdcode.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../internfile/txtdcode.cpp docseq.o : ../query/docseq.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../query/docseq.cpp docseqdb.o : ../query/docseqdb.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../query/docseqdb.cpp docseqhist.o : ../query/docseqhist.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../query/docseqhist.cpp filtseq.o : ../query/filtseq.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../query/filtseq.cpp dynconf.o : ../query/dynconf.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../query/dynconf.cpp plaintorich.o : ../query/plaintorich.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../query/plaintorich.cpp recollq.o : ../query/recollq.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../query/recollq.cpp reslistpager.o : ../query/reslistpager.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../query/reslistpager.cpp sortseq.o : ../query/sortseq.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../query/sortseq.cpp wasastringtoquery.o : ../query/wasastringtoquery.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../query/wasastringtoquery.cpp wasatorcl.o : ../query/wasatorcl.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../query/wasatorcl.cpp rcldb.o : ../rcldb/rcldb.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../rcldb/rcldb.cpp rcldoc.o : ../rcldb/rcldoc.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../rcldb/rcldoc.cpp rclquery.o : ../rcldb/rclquery.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../rcldb/rclquery.cpp searchdata.o : ../rcldb/searchdata.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../rcldb/searchdata.cpp stemdb.o : ../rcldb/stemdb.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../rcldb/stemdb.cpp stoplist.o : ../rcldb/stoplist.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../rcldb/stoplist.cpp base64.o : ../utils/base64.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/base64.cpp circache.o : ../utils/circache.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/circache.cpp closefrom.o : ../utils/closefrom.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/closefrom.cpp conftree.o : ../utils/conftree.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/conftree.cpp copyfile.o : ../utils/copyfile.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/copyfile.cpp debuglog.o : ../utils/debuglog.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/debuglog.cpp ecrontab.o : ../utils/ecrontab.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/ecrontab.cpp execmd.o : ../utils/execmd.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/execmd.cpp fstreewalk.o : ../utils/fstreewalk.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/fstreewalk.cpp idfile.o : ../utils/idfile.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/idfile.cpp fileudi.o : ../utils/fileudi.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/fileudi.cpp md5.o : ../utils/md5.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/md5.cpp mimeparse.o : ../utils/mimeparse.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/mimeparse.cpp netcon.o : ../utils/netcon.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/netcon.cpp pathut.o : ../utils/pathut.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/pathut.cpp pxattr.o : ../utils/pxattr.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/pxattr.cpp rclionice.o : ../utils/rclionice.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/rclionice.cpp readfile.o : ../utils/readfile.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/readfile.cpp smallut.o : ../utils/smallut.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/smallut.cpp transcode.o : ../utils/transcode.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/transcode.cpp wipedir.o : ../utils/wipedir.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/wipedir.cpp x11mon.o : ../utils/x11mon.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../utils/x11mon.cpp mime-parsefull.o : ../bincimapmime/mime-parsefull.cc $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../bincimapmime/mime-parsefull.cc mime-parseonlyheader.o : ../bincimapmime/mime-parseonlyheader.cc $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../bincimapmime/mime-parseonlyheader.cc mime-printbody.o : ../bincimapmime/mime-printbody.cc $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../bincimapmime/mime-printbody.cc mime.o : ../bincimapmime/mime.cc $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../bincimapmime/mime.cc convert.o : ../bincimapmime/convert.cc $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../bincimapmime/convert.cc iodevice.o : ../bincimapmime/iodevice.cc $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../bincimapmime/iodevice.cc iofactory.o : ../bincimapmime/iofactory.cc $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../bincimapmime/iofactory.cc depend: $(DEPS) clean: rm -f $(OBJS) $(LIBS) $(DEPS) *.stamp unac.o for i in *.dep;do test -f $$i && cp /dev/null $$i;done distclean: clean rm -f *.dep rclaspell.dep.stamp : ../aspell/rclaspell.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../aspell/rclaspell.cpp > rclaspell.dep touch rclaspell.dep.stamp beaglequeuecache.dep.stamp : ../common/beaglequeuecache.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../common/beaglequeuecache.cpp > beaglequeuecache.dep touch beaglequeuecache.dep.stamp cstr.dep.stamp : ../common/cstr.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../common/cstr.cpp > cstr.dep touch cstr.dep.stamp rclconfig.dep.stamp : ../common/rclconfig.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../common/rclconfig.cpp > rclconfig.dep touch rclconfig.dep.stamp rclinit.dep.stamp : ../common/rclinit.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../common/rclinit.cpp > rclinit.dep touch rclinit.dep.stamp textsplit.dep.stamp : ../common/textsplit.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../common/textsplit.cpp > textsplit.dep touch textsplit.dep.stamp unacpp.dep.stamp : ../common/unacpp.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../common/unacpp.cpp > unacpp.dep touch unacpp.dep.stamp beaglequeue.dep.stamp : ../index/beaglequeue.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../index/beaglequeue.cpp > beaglequeue.dep touch beaglequeue.dep.stamp fsindexer.dep.stamp : ../index/fsindexer.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../index/fsindexer.cpp > fsindexer.dep touch fsindexer.dep.stamp indexer.dep.stamp : ../index/indexer.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../index/indexer.cpp > indexer.dep touch indexer.dep.stamp mimetype.dep.stamp : ../index/mimetype.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../index/mimetype.cpp > mimetype.dep touch mimetype.dep.stamp subtreelist.dep.stamp : ../index/subtreelist.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../index/subtreelist.cpp > subtreelist.dep touch subtreelist.dep.stamp htmlparse.dep.stamp : ../internfile/htmlparse.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../internfile/htmlparse.cpp > htmlparse.dep touch htmlparse.dep.stamp myhtmlparse.dep.stamp : ../internfile/myhtmlparse.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../internfile/myhtmlparse.cpp > myhtmlparse.dep touch myhtmlparse.dep.stamp mimehandler.dep.stamp : ../internfile/mimehandler.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../internfile/mimehandler.cpp > mimehandler.dep touch mimehandler.dep.stamp internfile.dep.stamp : ../internfile/internfile.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../internfile/internfile.cpp > internfile.dep touch internfile.dep.stamp mh_exec.dep.stamp : ../internfile/mh_exec.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../internfile/mh_exec.cpp > mh_exec.dep touch mh_exec.dep.stamp mh_execm.dep.stamp : ../internfile/mh_execm.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../internfile/mh_execm.cpp > mh_execm.dep touch mh_execm.dep.stamp mh_html.dep.stamp : ../internfile/mh_html.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../internfile/mh_html.cpp > mh_html.dep touch mh_html.dep.stamp mh_mail.dep.stamp : ../internfile/mh_mail.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../internfile/mh_mail.cpp > mh_mail.dep touch mh_mail.dep.stamp mh_mbox.dep.stamp : ../internfile/mh_mbox.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../internfile/mh_mbox.cpp > mh_mbox.dep touch mh_mbox.dep.stamp mh_text.dep.stamp : ../internfile/mh_text.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../internfile/mh_text.cpp > mh_text.dep touch mh_text.dep.stamp txtdcode.dep.stamp : ../internfile/txtdcode.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../internfile/txtdcode.cpp > txtdcode.dep touch txtdcode.dep.stamp docseq.dep.stamp : ../query/docseq.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../query/docseq.cpp > docseq.dep touch docseq.dep.stamp docseqdb.dep.stamp : ../query/docseqdb.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../query/docseqdb.cpp > docseqdb.dep touch docseqdb.dep.stamp docseqhist.dep.stamp : ../query/docseqhist.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../query/docseqhist.cpp > docseqhist.dep touch docseqhist.dep.stamp filtseq.dep.stamp : ../query/filtseq.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../query/filtseq.cpp > filtseq.dep touch filtseq.dep.stamp dynconf.dep.stamp : ../query/dynconf.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../query/dynconf.cpp > dynconf.dep touch dynconf.dep.stamp plaintorich.dep.stamp : ../query/plaintorich.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../query/plaintorich.cpp > plaintorich.dep touch plaintorich.dep.stamp recollq.dep.stamp : ../query/recollq.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../query/recollq.cpp > recollq.dep touch recollq.dep.stamp reslistpager.dep.stamp : ../query/reslistpager.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../query/reslistpager.cpp > reslistpager.dep touch reslistpager.dep.stamp sortseq.dep.stamp : ../query/sortseq.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../query/sortseq.cpp > sortseq.dep touch sortseq.dep.stamp wasastringtoquery.dep.stamp : ../query/wasastringtoquery.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../query/wasastringtoquery.cpp > wasastringtoquery.dep touch wasastringtoquery.dep.stamp wasatorcl.dep.stamp : ../query/wasatorcl.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../query/wasatorcl.cpp > wasatorcl.dep touch wasatorcl.dep.stamp rcldb.dep.stamp : ../rcldb/rcldb.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../rcldb/rcldb.cpp > rcldb.dep touch rcldb.dep.stamp rcldoc.dep.stamp : ../rcldb/rcldoc.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../rcldb/rcldoc.cpp > rcldoc.dep touch rcldoc.dep.stamp rclquery.dep.stamp : ../rcldb/rclquery.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../rcldb/rclquery.cpp > rclquery.dep touch rclquery.dep.stamp searchdata.dep.stamp : ../rcldb/searchdata.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../rcldb/searchdata.cpp > searchdata.dep touch searchdata.dep.stamp stemdb.dep.stamp : ../rcldb/stemdb.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../rcldb/stemdb.cpp > stemdb.dep touch stemdb.dep.stamp stoplist.dep.stamp : ../rcldb/stoplist.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../rcldb/stoplist.cpp > stoplist.dep touch stoplist.dep.stamp base64.dep.stamp : ../utils/base64.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/base64.cpp > base64.dep touch base64.dep.stamp circache.dep.stamp : ../utils/circache.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/circache.cpp > circache.dep touch circache.dep.stamp closefrom.dep.stamp : ../utils/closefrom.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/closefrom.cpp > closefrom.dep touch closefrom.dep.stamp conftree.dep.stamp : ../utils/conftree.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/conftree.cpp > conftree.dep touch conftree.dep.stamp copyfile.dep.stamp : ../utils/copyfile.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/copyfile.cpp > copyfile.dep touch copyfile.dep.stamp debuglog.dep.stamp : ../utils/debuglog.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/debuglog.cpp > debuglog.dep touch debuglog.dep.stamp ecrontab.dep.stamp : ../utils/ecrontab.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/ecrontab.cpp > ecrontab.dep touch ecrontab.dep.stamp execmd.dep.stamp : ../utils/execmd.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/execmd.cpp > execmd.dep touch execmd.dep.stamp fstreewalk.dep.stamp : ../utils/fstreewalk.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/fstreewalk.cpp > fstreewalk.dep touch fstreewalk.dep.stamp idfile.dep.stamp : ../utils/idfile.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/idfile.cpp > idfile.dep touch idfile.dep.stamp fileudi.dep.stamp : ../utils/fileudi.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/fileudi.cpp > fileudi.dep touch fileudi.dep.stamp md5.dep.stamp : ../utils/md5.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/md5.cpp > md5.dep touch md5.dep.stamp mimeparse.dep.stamp : ../utils/mimeparse.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/mimeparse.cpp > mimeparse.dep touch mimeparse.dep.stamp netcon.dep.stamp : ../utils/netcon.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/netcon.cpp > netcon.dep touch netcon.dep.stamp pathut.dep.stamp : ../utils/pathut.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/pathut.cpp > pathut.dep touch pathut.dep.stamp pxattr.dep.stamp : ../utils/pxattr.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/pxattr.cpp > pxattr.dep touch pxattr.dep.stamp rclionice.dep.stamp : ../utils/rclionice.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/rclionice.cpp > rclionice.dep touch rclionice.dep.stamp readfile.dep.stamp : ../utils/readfile.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/readfile.cpp > readfile.dep touch readfile.dep.stamp smallut.dep.stamp : ../utils/smallut.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/smallut.cpp > smallut.dep touch smallut.dep.stamp transcode.dep.stamp : ../utils/transcode.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/transcode.cpp > transcode.dep touch transcode.dep.stamp wipedir.dep.stamp : ../utils/wipedir.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/wipedir.cpp > wipedir.dep touch wipedir.dep.stamp x11mon.dep.stamp : ../utils/x11mon.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../utils/x11mon.cpp > x11mon.dep touch x11mon.dep.stamp include rclaspell.dep include beaglequeuecache.dep include cstr.dep include rclconfig.dep include rclinit.dep include textsplit.dep include unacpp.dep include beaglequeue.dep include fsindexer.dep include indexer.dep include mimetype.dep include subtreelist.dep include htmlparse.dep include myhtmlparse.dep include mimehandler.dep include internfile.dep include mh_exec.dep include mh_execm.dep include mh_html.dep include mh_mail.dep include mh_mbox.dep include mh_text.dep include txtdcode.dep include docseq.dep include docseqdb.dep include docseqhist.dep include filtseq.dep include dynconf.dep include plaintorich.dep include recollq.dep include reslistpager.dep include sortseq.dep include wasastringtoquery.dep include wasatorcl.dep include rcldb.dep include rcldoc.dep include rclquery.dep include searchdata.dep include stemdb.dep include stoplist.dep include base64.dep include circache.dep include closefrom.dep include conftree.dep include copyfile.dep include debuglog.dep include ecrontab.dep include execmd.dep include fstreewalk.dep include idfile.dep include fileudi.dep include md5.dep include mimeparse.dep include netcon.dep include pathut.dep include pxattr.dep include rclionice.dep include readfile.dep include smallut.dep include transcode.dep include wipedir.dep include x11mon.dep mime-parsefull.dep.stamp : ../bincimapmime/mime-parsefull.cc $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../bincimapmime/mime-parsefull.cc > mime-parsefull.dep touch mime-parsefull.dep.stamp mime-parseonlyheader.dep.stamp : ../bincimapmime/mime-parseonlyheader.cc $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../bincimapmime/mime-parseonlyheader.cc > mime-parseonlyheader.dep touch mime-parseonlyheader.dep.stamp mime-printbody.dep.stamp : ../bincimapmime/mime-printbody.cc $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../bincimapmime/mime-printbody.cc > mime-printbody.dep touch mime-printbody.dep.stamp mime.dep.stamp : ../bincimapmime/mime.cc $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../bincimapmime/mime.cc > mime.dep touch mime.dep.stamp convert.dep.stamp : ../bincimapmime/convert.cc $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../bincimapmime/convert.cc > convert.dep touch convert.dep.stamp iodevice.dep.stamp : ../bincimapmime/iodevice.cc $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../bincimapmime/iodevice.cc > iodevice.dep touch iodevice.dep.stamp iofactory.dep.stamp : ../bincimapmime/iofactory.cc $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../bincimapmime/iofactory.cc > iofactory.dep touch iofactory.dep.stamp include mime-parsefull.dep include mime-parseonlyheader.dep include mime-printbody.dep include mime.dep include convert.dep include iodevice.dep include iofactory.dep recoll-1.17.3/kde/kioslave/000755 001750 000000 00000000000 11740755063 016054 5ustar00dockeswheel000000 000000 recoll-1.17.3/kde/kioslave/kio_recoll/000755 001750 000000 00000000000 11740755063 020176 5ustar00dockeswheel000000 000000 recoll-1.17.3/kde/kioslave/kio_recoll/00README.txt000644 001750 000000 00000006513 11740755063 022041 0ustar00dockeswheel000000 000000 Recoll KIO slave ================ An experiment with a recoll KIO slave. Caveat: I am only currently testing this with a production, but very recent, version of KDE 4.1, and I don't intend to really support older versions. The most usable aspects work under KDE 4.0 though. As a reference, my test system is an up to date (2009-01) Kubuntu 8.10. Usage ===== Depending on the protocol name used, the search results will be returned either as HTML pages (looking quite like a normal Recoll result list), or as directory entries. The HTML mode only works with Konqueror, not Dolphin. The directory mode is available with both browsers, and also application open dialog (ie Kate). The HTML mode is much more usable than the directory mode at this point More detailed help/explanations can be found a document accessible from the slave: To try things out, after building and installing, enter "recoll:/" in a Konqueror URL entry. Depending on the KDE version, this will bring you either to an HTML search form, or to a directory listing, where you should READ THE HELP FILE. Building and installing: ======================= Only tested with KDE 4.1 and later. The main Recoll installation shares its prefix with the KIO slave, which needs to use the KDE one. This means that, if KDE lives in /usr, Recoll must be configured with --prefix=/usr, not /usr/local. Else you'll have run-time problems, the slave will not be able to find the Recoll configuration. !!*Notice: You cannot share a build directory between recoll and kio_recoll because they use different configure options for the main lib, but build it in the same place. The main lib "configure" is run at "cmake" time for kio_recoll, the build is done at "make" time. Recipe: - Make sure the KDE4 core devel packages and cmake are installed. - Extract the Recoll source. - IF Recoll is not installed yet: configure recoll with --prefix=/usr (or wherever KDE lives), build and install Recoll. - In the Recoll source, go to kde/kioslave/recoll, then build and install the kio slave: mkdir builddir cd builddir cmake .. -DCMAKE_INSTALL_PREFIX=/usr make sudo make install - You should have a look at where "make install" copies things, because misconfigured distribution, generating wrong targets, are frequent. Especially, you should check that kio_recoll.so is copied to the right place, meaning among the output of "kde4-config --path module". As an additional check, there should be many other kio_[xxx].so in there. Same for the protocol file, check that it's not alone in its directory (really, this sounds strange, but, to this point, I've seen more systems with broken cmake/KDE configs than correct ones). You need to build/update the index with recollindex, the KIO slave doesn't deal with indexing for now. Misc build problems: =================== KUBUNTU 8.10 (updated to 2008-27-11) ------------------------------------ cmake generates a bad dependancy on /build/buildd/kde4libs-4.1.2/obj-i486-linux-gnu/lib/libkdecore.so inside CMakeFiles/kio_recoll.dir/build.make Found no way to fix this. You need to edit the line and replace the /build/[...]/lib with /usr/lib. This manifests itself with the following error message: make[2]: *** No rule to make target `/build/buildd/kde4libs-4.1.2/obj-i486-linux-gnu/lib/libkdecore.so', needed by `lib/kio_recoll.so'. Stop. recoll-1.17.3/kde/kioslave/kio_recoll/CMakeLists.txt000644 001750 000000 00000004325 11740755063 022742 0ustar00dockeswheel000000 000000 cmake_minimum_required(VERSION 2.6) project(kio_recoll) find_package(KDE4 REQUIRED) add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) add_definitions(-DKDE_DEFAULT_DEBUG_AREA=7130 -DRECOLL_DATADIR=\\"${CMAKE_INSTALL_PREFIX}/share/recoll\\" -DLIBDIR=\\"${CMAKE_INSTALL_PREFIX}/lib\\" -DHAVE_CONFIG_H ) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${KDE4_ENABLE_EXCEPTIONS}") set(rcltop ${CMAKE_CURRENT_SOURCE_DIR}/../../../) # Execute recoll configuration to create autoconfig.h and version.h and # generate a PIC lib execute_process(COMMAND ${rcltop}/configure --disable-qtgui --disable-x11mon --enable-pic --prefix=${CMAKE_INSTALL_PREFIX} --mandir=${CMAKE_INSTALL_PREFIX}/share/man WORKING_DIRECTORY ${rcltop} ) link_directories(${rcltop}/lib ${CMAKE_INSTALL_PREFIX}/lib) include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${KDE4_INCLUDES} ${rcltop}/aspell ${rcltop}/bincimapmime ${rcltop}/common ${rcltop}/index ${rcltop}/internfile ${rcltop}/query ${rcltop}/rcldb ${rcltop}/unac ${rcltop}/utils ${rcltop}/qtgui ) set(kio_recoll_SRCS kio_recoll.cpp htmlif.cpp dirif.cpp ${rcltop}/qtgui/guiutils.cpp) CHECK_LIBRARY_EXISTS(dl dlopen "" DLOPEN_IN_LIBDL) IF(DLOPEN_IN_LIBDL) LIST(APPEND EXTRA_LIBS dl) ENDIF(DLOPEN_IN_LIBDL) CHECK_LIBRARY_EXISTS(pthread pthread_sigmask "" PTHREAD_IN_LIBPTHREAD) IF(PTHREAD_IN_LIBPTHREAD) LIST(APPEND EXTRA_LIBS pthread) ENDIF(PTHREAD_IN_LIBPTHREAD) kde4_add_plugin(kio_recoll ${kio_recoll_SRCS}) add_custom_target(rcllib COMMAND make WORKING_DIRECTORY ${rcltop}/lib ) add_dependencies(kio_recoll rcllib) target_link_libraries(kio_recoll rcl xapian z ${EXTRA_LIBS} ${KDE4_KIO_LIBS}) install(TARGETS kio_recoll DESTINATION ${PLUGIN_INSTALL_DIR}) IF ("${KDE_VERSION_MAJOR}.${KDE_VERSION_MINOR}" GREATER 4.0) install(FILES recoll.protocol recollf.protocol DESTINATION ${SERVICES_INSTALL_DIR}) ELSE ("${KDE_VERSION_MAJOR}.${KDE_VERSION_MINOR}" GREATER 4.0) install(FILES recollnolist.protocol DESTINATION ${SERVICES_INSTALL_DIR} RENAME recoll.protocol) ENDIF ("${KDE_VERSION_MAJOR}.${KDE_VERSION_MINOR}" GREATER 4.0) install(FILES data/welcome.html data/help.html DESTINATION ${DATA_INSTALL_DIR}/kio_recoll) recoll-1.17.3/kde/kioslave/kio_recoll/Makefile.kde3000644 001750 000000 00000003445 11740755063 022471 0ustar00dockeswheel000000 000000 depth=../../.. include $(depth)/mk/sysconf # Need to set this by hand until we decide how to autoconf this without # bringing 2mbytes of kde config files. # May also need to adjust stuff such as the --rpath's below # KDE_INCLUDES=/usr/include/kde QT_INCLUDES=/usr/include/qt3 all: kio_recoll.so DEPS_CXXFLAGS = -MT pop3.lo -MD -MP -MF .deps/pop3.Tpo INC_CXXFLAGS = -I. \ -I$(KDE_INCLUDES) -I$(QT_INCLUDES) \ -I$(depth)/common -I$(depth)/query -I$(depth)/utils \ -I$(depth)/qtgui -I$(depth)/rcldb PIC_CXXFLAGS = -fPIC -DPIC DEBUG_CXXFLAGS = -DNDEBUG -DNO_DEBUG -O2 -O LANG_CXXFLAGS = -fno-exceptions -fno-check-new -fno-common QT_CXXFLAGS = -DQT_CLEAN_NAMESPACE -DQT_NO_ASCII_CAST -DQT_NO_STL \ -DQT_NO_COMPAT -DQT_NO_TRANSLATION -DQT_THREAD_SUPPORT SYS_CXXFLAGS = -D_GNU_SOURCE THREAD_CXXFLAGS = -D_THREAD_SAFE -pthread -D_THREAD_SAFE -pthread # -rpath=/usr/lib:/usr/local/lib \ LDFLAGS = \ -Wl,--rpath -Wl,/usr/local/lib \ -Wl,--rpath -Wl,/usr/X11R6/lib \ -Wl,-export-dynamic -Wl,-soname -Wl,kio_recoll.so THREAD_LDFLAGS = -pthread kio_recoll.so : kio_recoll.o libpic c++ -shared $(LDFLAGS) $(THREAD_LDFLAGS) \ -Wl,--no-undefined \ kio_recoll.o piclib/librcl.a \ $(LIBXAPIAN) $(LIBICONV) \ -L/opt/kde3/lib -L/usr/local/lib -L/usr/X11R6/lib -lkio -lkdecore \ -L/usr/lib/qt3/lib -lqt-mt \ -L/usr/lib -lstdc++ -lm -lc \ -o kio_recoll.so kio_recoll.o : kio_recoll.cpp kio_recoll.h $(CXX) -c -pipe kio_recoll.cpp $(INC_CXXFLAGS) $(PIC_CXXFLAGS) \ $(DEBUG_CXXFLAGS) $(LANG_CXXFLAGS) $(QT_CXXFLAGS) $(SYS_CXXFLAGS) \ $(THREAD_CXXFLAGS) \ -o kio_recoll.o libpic: cd piclib;test -f Makefile || depth=$(depth)/.. sh $(depth)/../lib/mkMake cd piclib;$(MAKE) CXXFLAGS="$(CXXFLAGS) $(PIC_CXXFLAGS)" \ CFLAGS="$(CFLAGS) $(PIC_CXXFLAGS)" .PHONY: all libpic recoll-1.17.3/kde/kioslave/kio_recoll/cleancmakestuff.sh000644 001750 000000 00000000451 11740755063 023665 0ustar00dockeswheel000000 000000 #!/bin/sh rm -rf CMakeCache.txt CMakeFiles CTestTestfile.cmake \ cmake_install.cmake CMakeTmp cmake_uninstall.cmake \ CPackConfig.cmake CPackSourceConfig.cmake DartTestfile.txt \ install_manifest.txt kio_recoll_automoc.cpp \ kio_recoll_automoc.cpp.files kio_recoll.so lib Makefile recoll-1.17.3/kde/kioslave/kio_recoll/data/000755 001750 000000 00000000000 11740755063 021107 5ustar00dockeswheel000000 000000 recoll-1.17.3/kde/kioslave/kio_recoll/dirif.cpp000644 001750 000000 00000022744 11740755063 022010 0ustar00dockeswheel000000 000000 /* Copyright (C) 2008 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. */ /* * A lot of code in this file was copied from kio_beagle 0.4.0, * which is a GPL program. The authors listed are: * Debajyoti Bera * * KDE4 port: * Stephan Binner */ #include "autoconfig.h" #include #if KDE_IS_VERSION(4,1,0) // Couldn't get listDir() to work with kde 4.0, konqueror keeps // crashing because of kdirmodel, couldn't find a workaround (not // saying it's impossible)... #include #include #include #include #include #include "kio_recoll.h" #include "pathut.h" using namespace KIO; static const QString resultBaseName("recollResult"); // Check if the input URL is of the form that konqueror builds by // appending one of our result file names to the directory name (which // is the search string). If it is, extract return the result document // number. Possibly restart the search if the search string does not // match the current one bool RecollProtocol::isRecollResult(const KUrl &url, int *num, QString *q) { *num = -1; kDebug() << "url" << url; // Basic checks if (!url.host().isEmpty() || url.path().isEmpty() || (url.protocol().compare("recoll") && url.protocol().compare("recollf"))) return false; QString path = url.path(); if (!path.startsWith("/")) return false; // Look for the last '/' and check if it is followed by // resultBaseName (riiiight...) int slashpos = path.lastIndexOf("/"); if (slashpos == -1 || slashpos == 0 || slashpos == path.length() -1) return false; slashpos++; //kDebug() << "Comparing " << path.mid(slashpos, resultBaseName.length()) << // "and " << resultBaseName; if (path.mid(slashpos, resultBaseName.length()).compare(resultBaseName)) return false; // Extract the result number QString snum = path.mid(slashpos + resultBaseName.length()); sscanf(snum.toAscii(), "%d", num); if (*num == -1) return false; //kDebug() << "URL analysis ok, num:" << *num; // We do have something that ressembles a recoll result locator. Check if // this matches the current search, else have to run the requested one *q = path.mid(1, slashpos-2); return true; } // Translate rcldoc result into directory entry static const UDSEntry resultToUDSEntry(const Rcl::Doc& doc, int num) { UDSEntry entry; KUrl url(doc.url.c_str()); // kDebug() << doc.url.c_str(); entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, url.fileName()); char cnum[30];sprintf(cnum, "%04d", num); entry.insert(KIO::UDSEntry::UDS_NAME, resultBaseName + cnum); if (!doc.mimetype.compare("application/x-fsdirectory")) { entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "inode/directory"); entry.insert( KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); } else { entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, doc.mimetype.c_str()); entry.insert( KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); } entry.insert(KIO::UDSEntry::UDS_LOCAL_PATH, url.path()); // For local files, supply the usual file stat information struct stat info; if (lstat(url.path().toAscii(), &info) >= 0) { entry.insert( KIO::UDSEntry::UDS_SIZE, info.st_size); entry.insert( KIO::UDSEntry::UDS_ACCESS, info.st_mode); entry.insert( KIO::UDSEntry::UDS_MODIFICATION_TIME, info.st_mtime); entry.insert( KIO::UDSEntry::UDS_ACCESS_TIME, info.st_atime); entry.insert( KIO::UDSEntry::UDS_CREATION_TIME, info.st_ctime); } entry.insert(KIO::UDSEntry::UDS_TARGET_URL, doc.url.c_str()); return entry; } // From kio_beagle static void createRootEntry(KIO::UDSEntry& entry) { entry.clear(); entry.insert( KIO::UDSEntry::UDS_NAME, "."); entry.insert( KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); entry.insert( KIO::UDSEntry::UDS_ACCESS, 0700); entry.insert( KIO::UDSEntry::UDS_MIME_TYPE, "inode/directory"); } // Points to html query screen static void createGoHomeEntry(KIO::UDSEntry& entry) { entry.clear(); entry.insert(KIO::UDSEntry::UDS_NAME, "search.html"); entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, "Recoll search (click me)"); entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); entry.insert(KIO::UDSEntry::UDS_TARGET_URL, "recoll:///search.html"); entry.insert(KIO::UDSEntry::UDS_ACCESS, 0500); entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "text/html"); entry.insert(KIO::UDSEntry::UDS_ICON_NAME, "recoll"); } // Points to help file static void createGoHelpEntry(KIO::UDSEntry& entry) { QString location = KStandardDirs::locate("data", "kio_recoll/help.html"); entry.clear(); entry.insert(KIO::UDSEntry::UDS_NAME, "help"); entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, "Recoll help (click me first)"); entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); entry.insert(KIO::UDSEntry::UDS_TARGET_URL, QString("file://") + location); entry.insert(KIO::UDSEntry::UDS_ACCESS, 0500); entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "text/html"); entry.insert(KIO::UDSEntry::UDS_ICON_NAME, "help"); } void RecollProtocol::stat(const KUrl & url) { kDebug() << url << endl ; UrlIngester ingest(this, url); KIO::UDSEntry entry; entry.insert(KIO::UDSEntry::UDS_TARGET_URL, url.url()); UrlIngester::RootEntryType rettp; QueryDesc qd; int num; if (ingest.isRootEntry(&rettp)) { switch(rettp) { case UrlIngester::UIRET_ROOT: createRootEntry(entry); break; case UrlIngester::UIRET_HELP: createGoHelpEntry(entry); break; case UrlIngester::UIRET_SEARCH: createGoHomeEntry(entry); break; default: error(ERR_DOES_NOT_EXIST, ""); break; } } else if (ingest.isResult(&qd, &num)) { if (syncSearch(qd)) { Rcl::Doc doc; if (num >= 0 && !m_source.isNull() && m_source->getDoc(num, doc)) { entry = resultToUDSEntry(doc, num); } else { error(ERR_DOES_NOT_EXIST, ""); } } else { // hopefully syncSearch() set the error? } } else if (ingest.isQuery(&qd)) { // ie "recoll:/some string" or "recoll:/some string/" // // We have a problem here. We'd like to let the user enter // either form and get an html or a dir contents result, // depending on the ending /. Otoh this makes the name space // inconsistent, because /toto can't be a file (the html // result page) while /toto/ would be a directory ? or can it // // Another approach would be to use different protocol names // to avoid any possibility of mixups if (m_alwaysdir || ingest.alwaysDir() || ingest.endSlashQuery()) { kDebug() << "Directory type"; entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); entry.insert(KIO::UDSEntry::UDS_ACCESS, 0700); entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "inode/directory"); entry.insert(KIO::UDSEntry::UDS_NAME, qd.query); entry.insert( KIO::UDSEntry::UDS_MODIFICATION_TIME, time(0)); entry.insert( KIO::UDSEntry::UDS_CREATION_TIME, time(0)); } } statEntry(entry); finished(); } void RecollProtocol::listDir(const KUrl& url) { kDebug() << url << endl; UrlIngester ingest(this, url); UrlIngester::RootEntryType rettp; QueryDesc qd; if (ingest.isRootEntry(&rettp)) { switch(rettp) { case UrlIngester::UIRET_ROOT: { kDebug() << "list /" << endl; UDSEntryList entries; KIO::UDSEntry entry; createRootEntry(entry); entries.append(entry); createGoHomeEntry(entry); entries.append(entry); createGoHelpEntry(entry); entries.append(entry); listEntries(entries); finished(); } return; default: error(ERR_CANNOT_ENTER_DIRECTORY, ""); return; } } else if (ingest.isQuery(&qd)) { // At this point, it seems that when the request is from // konqueror autocompletion it comes with a / at the end, // which offers an opportunity to not perform it. if (ingest.endSlashQuery()) { kDebug() << "Ends With /" << endl; error(ERR_SLAVE_DEFINED, "Autocompletion search aborted"); return; } if (!syncSearch(qd)) { // syncSearch did the error thing return; } // Fallthrough to actually listing the directory } else { kDebug() << "Cant grok input url"; error(ERR_CANNOT_ENTER_DIRECTORY, ""); return; } static int numentries = -1; if (numentries == -1) { if (o_rclconfig) o_rclconfig->getConfParam("kio_max_direntries", &numentries); if (numentries == -1) numentries = 100; } vector page; int pagelen = m_source->getSeqSlice(0, numentries, page); if (pagelen < 0) { error(ERR_SLAVE_DEFINED, "Internal error"); return; } UDSEntryList entries; for (int i = 0; i < pagelen; i++) { entries.append(resultToUDSEntry(page[i].doc, i)); } listEntries(entries); finished(); } #else // <--- KDE 4.1+ #include #include "kio_recoll.h" bool RecollProtocol::isRecollResult(const KUrl &, int *, QString *) { return false; } #endif recoll-1.17.3/kde/kioslave/kio_recoll/htmlif.cpp000644 001750 000000 00000020167 11740755063 022173 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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 #include #include using namespace std; #include #include #include "rclconfig.h" #include "rcldb.h" #include "rclinit.h" #include "pathut.h" #include "searchdata.h" #include "rclquery.h" #include "wasastringtoquery.h" #include "wasatorcl.h" #include "kio_recoll.h" #include "docseqdb.h" #include "readfile.h" #include "smallut.h" #include "plaintorich.h" #include "internfile.h" #include "wipedir.h" using namespace KIO; bool RecollKioPager::append(const string& data) { if (!m_parent) return false; m_parent->data(QByteArray(data.c_str())); return true; } #include string RecollProtocol::makeQueryUrl(int page, bool isdet) { ostringstream str; str << "recoll://search/query?q=" << url_encode((const char*)m_query.query.toUtf8()) << "&qtp=" << (const char*)m_query.opt.toUtf8(); if (page >= 0) str << "&p=" << page; if (isdet) str << "&det=1"; return str.str(); } string RecollKioPager::detailsLink() { string chunk = string("makeQueryUrl(m_parent->m_pager.pageNumber(), true) + "\">" + "(show query)" + ""; return chunk; } static string parformat; const string& RecollKioPager::parFormat() { // Need to escape the % inside the query url string qurl = m_parent->makeQueryUrl(-1, false), escurl; for (string::size_type pos = 0; pos < qurl.length(); pos++) { switch(qurl.at(pos)) { case '%': escurl += "%%"; break; default: escurl += qurl.at(pos); } } ostringstream str; str << "" "%R %S " "Preview  " << "Open " << "%T
" "%M %D   %U  %i
" "%A %K"; return parformat = str.str(); } string RecollKioPager::pageTop() { string pt = "

m_query.query.toUtf8())); pt += "\">New Search"; return pt; // Would be nice to have but doesnt work because the query may be executed // by another kio instance which has no idea of the current page o #if 0 && KDE_IS_VERSION(4,1,0) "    m_query.query.toUtf8())) + "/\">Directory view (you may need to reload the page)" #endif } string RecollKioPager::nextUrl() { int pagenum = pageNumber(); if (pagenum < 0) pagenum = 0; else pagenum++; return m_parent->makeQueryUrl(pagenum); } string RecollKioPager::prevUrl() { int pagenum = pageNumber(); if (pagenum <= 0) pagenum = 0; else pagenum--; return m_parent->makeQueryUrl(pagenum); } static string welcomedata; void RecollProtocol::searchPage() { mimeType("text/html"); if (welcomedata.empty()) { QString location = KStandardDirs::locate("data", "kio_recoll/welcome.html"); string reason; if (location.isEmpty() || !file_to_string((const char *)location.toUtf8(), welcomedata, &reason)) { welcomedata = "Recoll Error" "

Could not locate Recoll welcome.html file: "; welcomedata += reason; welcomedata += "

"; } } string catgq; #if 0 // Catg filtering. A bit complicated to do because of the // stateless thing (one more thing to compare to check if same // query) right now. Would be easy by adding to the query // language, but not too useful in this case, so scrap it for now. list cats; if (o_rclconfig->getMimeCategories(cats) && !cats.empty()) { catgq = "

Filter on types: " "All"; for (list::iterator it = cats.begin(); it != cats.end();it++) { catgq += "\n" + *it ; } } #endif string tmp; map subs; subs['Q'] = (const char *)m_query.query.toUtf8(); subs['C'] = catgq; subs['S'] = ""; pcSubst(welcomedata, tmp, subs); data(tmp.c_str()); } void RecollProtocol::queryDetails() { mimeType("text/html"); QByteArray array; QTextStream os(&array, QIODevice::WriteOnly); os << "" << endl; os << "" << endl; os << "" << "Recoll query details" << "\n" << endl; os << "" << endl; os << "

Query details:

" << endl; os << "

" << m_pager.queryDescription().c_str() <<"

"<< endl; os << "

Return to results" << endl; os << "" << endl; data(array); } class PlainToRichKio : public PlainToRich { public: PlainToRichKio(const string& nm) : PlainToRich() , m_name(nm) { } virtual ~PlainToRichKio() {} virtual string header() { if (m_inputhtml) { return snull; } else { return string("" "") + m_name + string("

");
	}
    }
    virtual string startMatch() {return string("");}
    virtual string endMatch() {return string("");}
    const string &m_name;
};

void RecollProtocol::showPreview(const Rcl::Doc& idoc)
{
    TempDir tmpdir;
    if (!tmpdir.ok()) {
	error(KIO::ERR_SLAVE_DEFINED, "Cannot create temp directory");
	return;
    }

    FileInterner interner(idoc, o_rclconfig, tmpdir, 
                          FileInterner::FIF_forPreview);
    Rcl::Doc fdoc;
    string ipath = idoc.ipath;
    if (!interner.internfile(fdoc, ipath)) {
	error(KIO::ERR_SLAVE_DEFINED, "Cannot convert file to internal format");
	return;
    }
    if (!interner.get_html().empty()) {
	fdoc.text = interner.get_html();
	fdoc.mimetype = "text/html";
    }

    mimeType("text/html");

    string fname =  path_getsimple(fdoc.url).c_str();
    PlainToRichKio ptr(fname);
    ptr.set_inputhtml(!fdoc.mimetype.compare("text/html"));
    list otextlist;
    HiliteData hdata;
    if (!m_source.isNull())
	m_source->getTerms(hdata.terms, hdata.groups, hdata.gslks);
    ptr.plaintorich(fdoc.text, otextlist, hdata);

    QByteArray array;
    QTextStream os(&array, QIODevice::WriteOnly);
    for (list::iterator it = otextlist.begin(); 
	 it != otextlist.end(); it++) {
	os << (*it).c_str();
    }
    os << "" << endl;
    data(array);
}

void RecollProtocol::htmlDoSearch(const QueryDesc& qd)
{
    kDebug() << "q" << qd.query << "option" << qd.opt << "page" << qd.page <<
	"isdet" << qd.isDetReq << endl;
 
    mimeType("text/html");

    if (!syncSearch(qd))
	return;
    // syncSearch/doSearch do the setDocSource when needed
    if (m_pager.pageNumber() < 0) {
	m_pager.resultPageNext();
    }
    if (qd.isDetReq) {
	queryDetails();
	return;
    }

    // Check / adjust page number
    if (qd.page > m_pager.pageNumber()) {
	int npages = qd.page - m_pager.pageNumber();
	for (int i = 0; i < npages; i++)
	    m_pager.resultPageNext();
    } else if (qd.page < m_pager.pageNumber()) {
	int npages = m_pager.pageNumber() - qd.page;
	for (int i = 0; i < npages; i++) 
	    m_pager.resultPageBack();
    }
    // Display
    m_pager.displayPage(o_rclconfig);
}
recoll-1.17.3/kde/kioslave/kio_recoll/kio_recoll.cpp000644 001750 000000 00000025212 11740755063 023026 0ustar00dockeswheel000000 000000 /* Copyright (C) 2005 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  

#include 
using namespace std;

#include 
#include 
#include 
#include 

#include 
#include 
#include 

#include "rclconfig.h"
#include "rcldb.h"
#include "rclinit.h"
#include "pathut.h"
#include "searchdata.h"
#include "rclquery.h"
#include "wasastringtoquery.h"
#include "wasatorcl.h"
#include "kio_recoll.h"
#include "docseqdb.h"
#include "readfile.h"
#include "smallut.h"
#include "textsplit.h"
#include "guiutils.h"

using namespace KIO;

RclConfig *RecollProtocol::o_rclconfig;

RecollProtocol::RecollProtocol(const QByteArray &pool, const QByteArray &app) 
    : SlaveBase("recoll", pool, app), m_initok(false), m_rcldb(0),
      m_alwaysdir(false)
{
    kDebug() << endl;
    if (o_rclconfig == 0) {
	o_rclconfig = recollinit(0, 0, m_reason);
	if (!o_rclconfig || !o_rclconfig->ok()) {
	    m_reason = string("Configuration problem: ") + m_reason;
	    return;
	}
    }
    if (o_rclconfig->getDbDir().empty()) {
	// Note: this will have to be replaced by a call to a
	// configuration building dialog for initial configuration? Or
	// do we assume that the QT GUO is always used for this ?
	m_reason = "No db directory in configuration ??";
	return;
    }
    rwSettings(false);

    m_rcldb = new Rcl::Db(o_rclconfig);
    if (!m_rcldb) {
	m_reason = "Could not build database object. (out of memory ?)";
	return;
    }

    // Decide if we allow switching between html and file manager
    // presentation by using an end slash or not. Can also be done dynamically 
    // by switching proto names.
    const char *cp = getenv("RECOLL_KIO_ALWAYS_DIR");
    if (cp) {
	m_alwaysdir = stringToBool(cp);
    } else {
	o_rclconfig->getConfParam("kio_always_dir", &m_alwaysdir);
    }

    m_pager.setParent(this);
    m_initok = true;
    return;
}

// There should be an object counter somewhere to delete the config when done.
// Doesn't seem needed in the kio context.
RecollProtocol::~RecollProtocol()
{
    kDebug();
    delete m_rcldb;
}

bool RecollProtocol::maybeOpenDb(string &reason)
{
    if (!m_rcldb) {
	reason = "Internal error: initialization error";
	return false;
    }
    if (!m_rcldb->isopen() && !m_rcldb->open(Rcl::Db::DbRO)) {
	reason = "Could not open database in " + o_rclconfig->getDbDir();
	return false;
    }
    return true;
}

// This is never called afaik
void RecollProtocol::mimetype(const KUrl &url)
{
    kDebug() << url << endl;
    mimeType("text/html");
    finished();
}

UrlIngester::UrlIngester(RecollProtocol *p, const KUrl& url)
    : m_parent(p), m_slashend(false), m_alwaysdir(false),
      m_retType(UIRET_NONE), m_resnum(0), m_type(UIMT_NONE)
{
    kDebug() << "Url" << url;
    m_alwaysdir = !url.protocol().compare("recollf");
    QString path = url.path();
    if (url.host().isEmpty()) {
	if (path.isEmpty() || !path.compare("/")) {
	    m_type = UIMT_ROOTENTRY;
	    m_retType = UIRET_ROOT;
	    return;
	} else if (!path.compare("/help.html")) {
	    m_type = UIMT_ROOTENTRY;
	    m_retType = UIRET_HELP;
	    return;
	} else if (!path.compare("/search.html")) {
	    m_type = UIMT_ROOTENTRY;
	    m_retType = UIRET_SEARCH;
	    // Retrieve the query value for preloading the form
	    m_query.query = url.queryItem("q");
	    return;
	} else if (m_parent->isRecollResult(url, &m_resnum, &m_query.query)) {
	    m_type = UIMT_QUERYRESULT;
	    m_query.opt = "l";
	    m_query.page = 0;
	} else {
	    // Have to think this is some search string
	    m_type = UIMT_QUERY;
	    m_query.query = url.path();
	    m_query.opt = "l";
	    m_query.page = 0;
	}
    } else {
	// Non empty host, url must be something like :
	//      //search/query?q=query¶m=value...
	kDebug() << "host" << url.host() << "path" << url.path();
	if (url.host().compare("search") || url.path().compare("/query")) {
	    return;
	}
	m_type = UIMT_QUERY;
	// Decode the forms' arguments
	m_query.query = url.queryItem("q");

	m_query.opt = url.queryItem("qtp");
	if (m_query.opt.isEmpty()) {
	    m_query.opt = "l";
	} 
	QString p = url.queryItem("p");
	if (p.isEmpty()) {
	    m_query.page = 0;
	} else {
	    sscanf(p.toAscii(), "%d", &m_query.page);
	}
	p = url.queryItem("det");
	m_query.isDetReq = !p.isEmpty();
	
	p = url.queryItem("cmd");
	if (!p.isEmpty() && !p.compare("pv")) {
	    p = url.queryItem("dn");
	    if (!p.isEmpty()) {
		// Preview and no docnum ??
		m_resnum = atoi((const char *)p.toUtf8());
		// Result in page is 1+
		m_resnum--;
		m_type = UIMT_PREVIEW;
	    }
	}
    }
    if (m_query.query.startsWith("/"))
	m_query.query.remove(0,1);
    if (m_query.query.endsWith("/")) {
	kDebug() << "Ends with /";
	m_slashend = true;
	m_query.query.chop(1);
    } else {
	m_slashend = false;
    }
    return;
}

bool RecollProtocol::syncSearch(const QueryDesc &qd)
{
    kDebug();
    if (!m_initok || !maybeOpenDb(m_reason)) {
	string reason = "RecollProtocol::listDir: Init error:" + m_reason;
	error(KIO::ERR_SLAVE_DEFINED, reason.c_str());
	return false;
    }
    if (qd.sameQuery(m_query)) {
	return true;
    }
    // doSearch() calls error() if appropriate.
    return doSearch(qd);
}

// This is used by the html interface, but also by the directory one
// when doing file copies for exemple. This is the central dispatcher
// for requests, it has to know a little about both models.
void RecollProtocol::get(const KUrl& url)
{
    kDebug() << url << endl;

    if (!m_initok || !maybeOpenDb(m_reason)) {
	string reason = "Recoll: init error: " + m_reason;
	error(KIO::ERR_SLAVE_DEFINED, reason.c_str());
	return;
    }

    UrlIngester ingest(this, url);
    UrlIngester::RootEntryType rettp;
    QueryDesc qd;
    int resnum;
    if (ingest.isRootEntry(&rettp)) {
	switch(rettp) {
	case UrlIngester::UIRET_HELP: 
	    {
		QString location = 
		    KStandardDirs::locate("data", "kio_recoll/help.html");
		redirection(location);
	    }
	    goto out;
	default:
	    searchPage();
	    goto out;
	}
    } else if (ingest.isResult(&qd, &resnum)) {
	// Url matched one generated by konqueror/Dolphin out of a
	// search directory listing: ie: 
        // recoll:/some search string/recollResultxx
	//
	// This happens when the user drags/drop the result to another
	// app, or with the "open-with" right-click. Does not happen
	// if the entry itself is clicked (the UDS_URL is apparently
	// used in this case
	//
	// Redirect to the result document URL
	if (!syncSearch(qd)) {
	    return;
	}
	Rcl::Doc doc;
	if (resnum >= 0 && !m_source.isNull() && m_source->getDoc(resnum, doc)) {
	    mimeType(doc.mimetype.c_str());
	    redirection(KUrl::fromLocalFile((const char *)(doc.url.c_str()+7)));
	    goto out;
	}
    } else if (ingest.isPreview(&qd, &resnum)) {
	if (!syncSearch(qd)) {
	    return;
	}
	Rcl::Doc doc;
	if (resnum >= 0 && !m_source.isNull() && m_source->getDoc(resnum, doc)) {
	    showPreview(doc);
	    goto out;
	}
    } else if (ingest.isQuery(&qd)) {
#if 0 
// Do we need this ?
	if (host.isEmpty()) {
	    char cpage[20];sprintf(cpage, "%d", page);
	    QString nurl = QString::fromAscii("recoll://search/query?q=") +
		query + "&qtp=" + opt + "&p=" + cpage;
	    redirection(KUrl(nurl));
	    goto out;
	}
#endif
	// htmlDoSearch does the search syncing (needs to know about changes).
	htmlDoSearch(qd);
	goto out;
    }

    error(KIO::ERR_SLAVE_DEFINED, "Unrecognized URL or internal error");
 out:
    finished();
}

// Execute Recoll search, and set the docsource
bool RecollProtocol::doSearch(const QueryDesc& qd)
{
    kDebug() << "query" << qd.query << "opt" << qd.opt;
    m_query = qd;

    char opt = qd.opt.isEmpty() ? 'l' : qd.opt.toUtf8().at(0);
    string qs = (const char *)qd.query.toUtf8();
    Rcl::SearchData *sd = 0;
    if (opt != 'l') {
	Rcl::SearchDataClause *clp = 0;
	if (opt == 'f') {
	    clp = new Rcl::SearchDataClauseFilename(qs);
	} else {
	    // If there is no white space inside the query, then the user
	    // certainly means it as a phrase.
	    bool isreallyaphrase = false;
	    if (!TextSplit::hasVisibleWhite(qs))
		isreallyaphrase = true;
	    clp = isreallyaphrase ? 
		new Rcl::SearchDataClauseDist(Rcl::SCLT_PHRASE, qs, 0) :
		new Rcl::SearchDataClauseSimple(opt == 'o' ?
						Rcl::SCLT_OR : Rcl::SCLT_AND, 
						qs);
	}
	sd = new Rcl::SearchData(Rcl::SCLT_OR);
	if (sd && clp)
	    sd->addClause(clp);
    } else {
	sd = wasaStringToRcl(o_rclconfig, qs, m_reason);
    }
    if (!sd) {
	m_reason = "Internal Error: cant build search";
	error(KIO::ERR_SLAVE_DEFINED, m_reason.c_str());
	return false;
    }

    RefCntr sdata(sd);
    sdata->setStemlang("english");
    RefCntrquery(new Rcl::Query(m_rcldb));
    query->setCollapseDuplicates(prefs.collapseDuplicates);
    if (!query->setQuery(sdata)) {
	m_reason = "Query execute failed. Invalid query or syntax error?";
	error(KIO::ERR_SLAVE_DEFINED, m_reason.c_str());
	return false;
    }

    DocSequenceDb *src = 
	new DocSequenceDb(RefCntr(query), "Query results", sdata);
    if (src == 0) {
	error(KIO::ERR_SLAVE_DEFINED, "Can't build result sequence");
	return false;
    }
    m_source = RefCntr(src);
    // Reset pager in all cases. Costs nothing, stays at page -1 initially
    // htmldosearch will fetch the first page if needed.
    m_pager.setDocSource(m_source);
    return true;
}

// Note: KDE_EXPORT is actually needed on Unix when building with
// cmake. Says something like __attribute__(visibility(defautl))
// (cmake apparently sets all symbols to not exported)
extern "C" {KDE_EXPORT int kdemain(int argc, char **argv);}

int kdemain(int argc, char **argv)
{
#ifdef KDE_VERSION_3
    KInstance instance("kio_recoll");
#else
    KComponentData instance("kio_recoll");
#endif
    kDebug() << "*** starting kio_recoll " << endl;

    if (argc != 4)  {
	kDebug() << "Usage: kio_recoll proto dom-socket1 dom-socket2\n" << endl;
	exit(-1);
    }

    RecollProtocol slave(argv[2], argv[3]);
    slave.dispatchLoop();

    kDebug() << "kio_recoll Done" << endl;
    return 0;
}
recoll-1.17.3/kde/kioslave/kio_recoll/kio_recoll.h000644 001750 000000 00000014104 11740755063 022471 0ustar00dockeswheel000000 000000 #ifndef _RECOLL_H
#define _RECOLL_H
/* Copyright (C) 2005 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 
using std::string;

#include 
#include 

#include 
#include 
#include 
#include 

#include "rclconfig.h"
#include "rcldb.h"
#include "reslistpager.h"
#include "docseq.h"
#include "refcntr.h"

class RecollProtocol;

/** Specialize the recoll html pager for the kind of links we use etc. */
class RecollKioPager : public ResListPager {
public:
    RecollKioPager() : m_parent(0) {}
    void setParent(RecollProtocol *proto) {m_parent = proto;}

    virtual bool append(const string& data);
    virtual bool append(const string& data, int, const Rcl::Doc&)
    {return append(data);}
    virtual string detailsLink();
    virtual const string &parFormat();
    virtual string nextUrl();
    virtual string prevUrl();
    virtual string pageTop();

private:
    RecollProtocol *m_parent;
};

class QueryDesc {
public:
    QueryDesc() : opt("l"), page(0), isDetReq(false) {}
    QString query;
    QString opt;
    int page;
    bool isDetReq;
    bool sameQuery(const QueryDesc& o) const {
	return !opt.compare(o.opt) && !query.compare(o.query);
    }
};

// Our virtual tree is a bit complicated. We need a class to analyse an URL
// and tell what we should do with it
class UrlIngester {
public:
    UrlIngester(RecollProtocol *p, const KUrl& url);
    enum RootEntryType {UIRET_NONE, UIRET_ROOT, UIRET_HELP, UIRET_SEARCH};
    bool isRootEntry(RootEntryType *tp) {
	if (m_type != UIMT_ROOTENTRY) return false;
	*tp = m_retType;
	return true;
    }
    bool isQuery(QueryDesc *q) {
	if (m_type != UIMT_QUERY) return false;
	*q = m_query;
	return true;
    }
    bool isResult(QueryDesc *q, int *num) {
	if (m_type != UIMT_QUERYRESULT) return false;
	*q = m_query;
	*num = m_resnum;
	return true;
    }
    bool isPreview(QueryDesc *q, int *num) {
	if (m_type != UIMT_PREVIEW) return false;
	*q = m_query;
	*num = m_resnum;
	return true;
    }
    bool endSlashQuery() {return m_slashend;}
    bool alwaysDir() {return m_alwaysdir;}

private:
    RecollProtocol *m_parent;
    QueryDesc       m_query;
    bool            m_slashend;
    bool            m_alwaysdir;
    RootEntryType   m_retType;
    int             m_resnum;
    enum MyType {UIMT_NONE, UIMT_ROOTENTRY, UIMT_QUERY, UIMT_QUERYRESULT,
		 UIMT_PREVIEW};
    MyType           m_type;
};


/**
 * A KIO slave to execute and display Recoll searches.
 *
 * Things are made a little complicated because KIO slaves can't hope
 * that their internal state will remain consistent with their user
 * application state: slaves die, are restarted, reused, at random
 * between requests. 
 * In our case, this means that any request has to be processed
 * without reference to the last operation performed. Ie, if the
 * search parameters are not those from the last request, the search
 * must be restarted anew. This happens for example with different
 * searches in 2 konqueror screens: typically only one kio_slave will
 * be used.
 * The fact that we check if the search is the same as the last one,
 * to avoid restarting is an optimization, not the base mechanism
 * (contrary to what was initially assumed, and may have left a few
 * crumbs around).
 *
 * We have two modes of operation, one based on html forms and result
 * pages, which can potentially be developped to the full Recoll
 * functionality, and one based on a directory listing model, which
 * will always be more limited, but may be useful in some cases to
 * allow easy copying of files etc. Which one is in use is decided by
 * the form of the URL. 
 */
class RecollProtocol : public KIO::SlaveBase {
 public:
    RecollProtocol(const QByteArray &pool, const QByteArray &app );
    virtual ~RecollProtocol();
    virtual void mimetype(const KUrl& url);
    virtual void get(const KUrl& url);
    // The directory mode is not available with KDE 4.0, I could find
    // no way to avoid crashing kdirmodel
#if KDE_IS_VERSION(4,1,0)
    virtual void stat(const KUrl & url);
    virtual void listDir(const KUrl& url);
#endif

    static RclConfig  *o_rclconfig;

    friend class RecollKioPager;
    friend class UrlIngester;

 private:
    bool maybeOpenDb(string& reason);
    bool URLToQuery(const KUrl &url, QString& q, QString& opt, int *page=0);
    bool doSearch(const QueryDesc& qd);

    void searchPage();
    void queryDetails();
    string makeQueryUrl(int page, bool isdet = false);
    bool syncSearch(const QueryDesc& qd);
    void htmlDoSearch(const QueryDesc& qd);
    void showPreview(const Rcl::Doc& doc);
    bool isRecollResult(const KUrl &url, int *num, QString* q);

    bool        m_initok;
    Rcl::Db    *m_rcldb;
    string      m_reason;
    bool        m_alwaysdir;
    // Search state: because of how the KIO slaves are used / reused,
    // we can't be sure that the next request will be for the same
    // search, and we need to check and restart one if the data
    // changes. This is very wasteful but hopefully won't happen too
    // much in actual use. One possible workaround for some scenarios
    // (one slave several konqueror windows) would be to have a small
    // cache of recent searches kept open.
    RecollKioPager m_pager;
    RefCntr m_source;
    // Note: page here is not used, current page always comes from m_pager.
    QueryDesc      m_query;
};

extern "C" {int kdemain(int, char**);}

#endif // _RECOLL_H
recoll-1.17.3/kde/kioslave/kio_recoll/kio_recoll.la000755 001750 000000 00000002206 11740755063 022641 0ustar00dockeswheel000000 000000 # kio_recoll.la - a libtool library file
# Generated by ltmain.sh - GNU libtool 1.5a (1.1240 2003/06/26 06:55:19)
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='kio_recoll.so'

# Names of this library.
library_names='kio_recoll.so kio_recoll.so kio_recoll.so'

# The name of the static archive.
old_library=''

# Libraries that this one depends upon.
dependency_libs=' -R/usr/local/lib -R/usr/X11R6/lib -L/usr/X11R6/lib -L/usr/local/lib /usr/local/lib/libkio.la /usr/local/lib/libkdeui.la /usr/local/lib/libkdesu.la /usr/local/lib/libkwalletclient.la /usr/local/lib/libkdecore.la /usr/local/lib/libDCOP.la -lutil -lart_lgpl_2 -lidn /usr/local/lib/libkdefx.la -lqt-mt -lpng -lXext -lX11 -lSM -lICE -lXrender -lz /usr/local/lib/libfam.la -ljpeg'

# Version information for kio_recoll.
current=0
age=0
revision=0

# Is this an already installed library?
installed=yes

# Should we warn recoll portability when linking against -modules?
shouldnotlink=yes

# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''

# Directory that this library needs to be installed in:
libdir='/usr/lib/kde3'
recoll-1.17.3/kde/kioslave/kio_recoll/notes.txt000644 001750 000000 00000015360 11740755063 022074 0ustar00dockeswheel000000 000000 Recoll KIO Slave notes/todoes/etc.

Goal: access Recoll search from other applications. 

We want to allow URLs like recoll:/?? to be used inside
Konqueror/Dolphin and open dialogs, to start a search with results
displayed/used inside the application.


Todoes
======


Implementation notes:
====================

- There are two main ways to do this: 
  - a-la kio_beagle, using listDir() to list entries pointing to the
    different operations or objects (help, status, search result
    entries, bookmarks, whatever...). The nice thing is that the
    results really look like file object in a directory (probably,
    didn't try it actually), no need for look and feel, it's provided by
    KDE 

  - Or a la strigi: all interactions are through html pages and get()
    operations.  Much simpler, but does not allow file management
    operations (except by drag/drop from the result list), and can't
    use it inside other application's Open dialogs.

Recoll is currently doing both things on KDE4.1 (only html for KDE4.0). 


Virtual tree:
=============

recoll: 
recoll:/
recoll:/help.html
recoll:/search.html
    Purely synthetic top level entries. Yes, given the following, this means
    that you can't search for 'help.html' directly (but you can do it through 
    the html interface). These have to exist in the top level directory

recoll:/some search string
recoll:/some search string/
 We have a 'mode' determined by the protocol name:
  	 recoll -> mixed
	 recollf -> file manager
  - html mode: these redirect to recoll://search/query?q="some search string"
  - file manager mode: do the search and display results.
  - mixed mode: what mode is entered depends on ending /

recoll://search/query?q=...
  html mode search  

recoll:/some search string/recollResultxyz
xyz is the index in result list.

When generating a directory, with use bogus names for the result
entries (the displayed ones are from UDS_DISPLAY_NAME and are the real
names). When doing drag/drop or "open with" Konqueror/Dolphin builds
an url by concatenating the current directory name and the UDS_NAME,
instead of using UDS_TARGET_URL as when the entry is clicked. This
forces us to use identifying names including the result number, which
has many ennoying side effects (such as the target app not knowing the
real file path...


KIO notes:
=========

- Slaves are reused seemingly at random. Even with connection-oriented
  ones (ie ftp), you can have 2 konqueror windows on different hosts
  with only one slave which will have to close/reopen the connection at
  each switch.
   For slaves with really expensive internal state, this is very wasteful.

- Use cases for father_url+name or target_url are ill defined.
- Need a way to block autocompletion queries !
- No way to display the target URL in konqueror

Todoes
======
- Improve the html interface to support more functions
 - Category filtering
 - Sorting

- Find a way to use the html form to enter the query and get the
  results as a directory ?  - Would it be possible to use a redirect
  to switch to the directory-oriented results for a query from the
  html form ? 
  -> No, even a redirect to a form that would initially trigger a
     listDir() triggers a get() when performed from a get()

KDE misc notes
==================
Debug areas: /usr/share/kde4/config/kdebug.areas
kdebugdialog [--fullmode] pour configurer
./.kde/share/config/kdebugrc
Output to ~/.xession-errors by default. How to change ?

kio_recoll misc notes:
===========================
Probleme quand l'url se termine par un / et qu'on edite le mot,
konqueror lance une recherche a chaque lettre.

Apparemment c'est l'entree "listing" du .protocol qui decide si le plugin
est traité plutot comme un dirlister ou comme un htmlgetter. Curieusement,
le changement ne s'opere pas toujours immediatement quand on change le
fichier .proto, y compris apres avoir tue tous les process kde (changement
à la deuxieme execution de konqueror sur kde4.0). Sur kde4.0 il faut que le
.proto soit sans entree "listing"

Problemes de gestion de l'etat
===============================
Les KIO slaves ne sont pas associes a une fenetre ! ils sont
reutilises au hasard, et leur etat n'a aucune raison de correspondre a
celui de l'affichage. On peut tres bien avoir 1 fenetre 2 kio ou 1 kio
deux fenetres, et le next d'un search peut arriver au kio qui a
l'autre search, donc n'importenaouak. Il faudrait que l'etat soit
partage et accede par un identifiant uniquement determine par l'url de
la fenetre.

Meme pour une fenetre unique, au bout d'un moment le kio timeout et exite.

En fait les slaves ne peuvent pas stocker d'etat du tout. Donc:
 - soit un serveur central auquel ils parlent
 - soit ils relancent dynamiquement les recherches si pas de match
C'est vrai aussi bien pour les dirlists que pour la version html. 

J'ai essaye de mettre une boucle timeout callback callspecial() mais
ca ne sert a rien, c'est gere dans le process kio_slave, ca ne
maintient pas l'association avec un konqueror.

KDE_FORK_SLAVES sort of solves the problem in a limited way: 
 - It applies to an application instance, not a KIO slave type, so it
   affects other KIO usages.  
 - If the application has 2 sessions with the same KIO there are no 
   warranties that 1 kio per session will be used ?



Old KDE3 notes, 
===============

kio_recoll has not been checked or worked under KDE3 for eons, no
reason to believe it works.

- Not using libtool. Probably should. compilation flags in the Makefile
  were copy-pasted from a kdebase compilation tree on FreeBSD (kio/man).
- You MUST install a kio_recoll.la in lib/kde3 along with kio_recoll.so,
  else kdeinit won't be able to load the lib (probably uses the libltdl
  thingy?). The one in this directory was duplicated/adjusted from
  kio_man.la. The contents don't seem too critical, just needs to exist.
- If you want to try, compile, then install kio_recoll.la kio_recoll.so
  wherever kde keeps its plugins (ie: lib/kde3), and recoll.protocol in the
  services directory (share/services ? look for other .protocol file).
- I saw after doing the build/config mockup that kdevelop can generate a
  kio_slave project. This might be the next thing to do. otoh would need to
  separate the kio from the main source to avoid having to distribute 2megs
  of kde build config files.



Connected mode
==============
Tried to add bogus connection status to see if this would prevent switching between apps/slaves, doesnt... checked that's the same for kio_ftp

void RecollProtocol::openConnection() 
{
    kDebug();
    connected();
}
void RecollProtocol::closeConnection() 
{
    kDebug();
}
void RecollProtocol::setHost(const QString& host, quint16, 
			     const QString&, const QString&)
{
    kDebug() << host;
}
void RecollProtocol::slave_status()
{
    kDebug();
    slaveStatus("search", true);
}
+    connected(); call in maybeopendb()
recoll-1.17.3/kde/kioslave/kio_recoll/recoll.protocol000644 001750 000000 00000000256 11740755063 023244 0ustar00dockeswheel000000 000000 [Protocol]
exec=kio_recoll
protocol=recoll
input=none
output=filesystem
listing=Name,Type, URL
reading=true
defaultMimeType=text/html
Icon=recoll
Class=:local
URIMode=rawuri
recoll-1.17.3/kde/kioslave/kio_recoll/recollf.protocol000644 001750 000000 00000000257 11740755063 023413 0ustar00dockeswheel000000 000000 [Protocol]
exec=kio_recoll
protocol=recollf
input=none
output=filesystem
listing=Name,Type, URL
reading=true
defaultMimeType=text/html
Icon=recoll
Class=:local
URIMode=rawuri
recoll-1.17.3/kde/kioslave/kio_recoll/recollnolist.protocol000644 001750 000000 00000000300 11740755063 024463 0ustar00dockeswheel000000 000000 [Protocol]
exec=kio_recoll
protocol=recoll
input=none
output=filesystem
# Version for kde4.0: no "listing" entry
reading=true
defaultMimeType=text/html
Icon=recoll
Class=:local
URIMode=rawuri
recoll-1.17.3/kde/kioslave/kio_recoll/data/help.html000644 001750 000000 00000007516 11740755063 022736 0ustar00dockeswheel000000 000000 

  
  Recoll Kio Slave


  Recoll search
  

Recoll kio slave

Use this module to perform Recoll searches from any program with a KIO interface.

The module can work in two modes:

  • Html interface, close to a simplified QT Recoll interface.
  • File manager interface, Only with KDE 4.1 and newer, which presents results as directory entries

The module is still in its infancy. You will undoubtedly obtain strange effects from time to time. If you have any remarks or ideas about improving kio_recoll, or observe an interesting and reproducible sequence, please report it.

kio_recoll is primarily designed and tested with konqueror, and you will undoubtedly get even more surprising effects with other tools.

The Html interface is currently much more usable. The directory interface is extremely quirky.

The module is particularly unhelpful with search hits inside email folders, which Konqueror has no way to access.

HTML interface

This works more or less like the Recoll QT GUI, much simplified. The Recoll manual describes the queries that can be performed.

Most pages in the interface should quite self-explanatory.

You normally enter this interface by entering "recoll:" or "recoll:/" in the Konqueror URL entry, and following the "search" link. You can also directly enter "recoll:/search.html".
In most circumstances, entering a link like recoll:/john smith will also yield an HTML result list.

Compared to QT Recoll, the nice point is that you can click or drag/drop the icons to access the results in the standard desktop way.

File manager interface

The path part of the URI is taken as a Recoll query language string and executed. The results are displayed as directory entries.

There are several ways to enter this interface:

  • Using "recollf" as protocol name instead of "recoll". This is probably the easiest option inside open dialogs.
  • Using an URL ending with a '/', ie:
    recoll:/red apples ext:html/
  • Users who will want to use the file manager view most of the time can set the RECOLL_KIO_ALWAYS_DIR environment variable or the kio_always_dir recoll.conf variable to 1. The HTML interface will then only be accessible through the search link in the top "recoll:" view.

No search result details (samples, relevance etc.) are available, but this interface allows multiple selections and copies, usage inside any KDE open dialog, etc.

To avoid swamping the interface with thousands of results, the result count is limited to 100 by default. You can change this value by setting the kio_max_direntries parameter in your recoll configuration file (typically ~/.recoll/recoll.conf)

Because of limitations in the current KIO slave usage, the actual entry names are not those displayed but synthetic ones like "recollResultxxx". This has unfortunate side-effects when dragging/dropping the entries to some other application, or when using an open dialog (the opened file doesn't have the correct path to the original file).

Recoll Search

recoll-1.17.3/kde/kioslave/kio_recoll/data/searchable.html000644 001750 000000 00000001450 11740755063 024066 0ustar00dockeswheel000000 000000 Recoll searchable HTML

A Recoll-searchable HTML page

This is a text sample in which links have been inserted for words, such as system installation, which can be searched for in the whole document set by using recoll

Also a little bit of javascript magic can make all words searchable (try double-clicking any word).

recoll-1.17.3/kde/kioslave/kio_recoll/data/welcome.html000644 001750 000000 00000001452 11740755063 023432 0ustar00dockeswheel000000 000000 Recoll Search

Recoll search

Query type:
Query language
All terms
Any term
File name
Enter search string:

recoll-1.17.3/internfile/Filter.h000644 001750 000000 00000016047 11740755063 017241 0ustar00dockeswheel000000 000000 /* * 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 Library 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 _DIJON_FILTER_H #define _DIJON_FILTER_H #include #include #include namespace Dijon { class Filter; /** Provides the list of MIME types supported by the filter(s). * The character string is allocated with new[]. * This function is exported by dynamically loaded filter libraries. */ typedef bool (get_filter_types_func)(std::set &); /** Returns what data should be passed to the filter(s). * Output is cast from Filter::DataInput to int for convenience. * This function is exported by dynamically loaded filter libraries. * The aim is to let the client application know before-hand whether * it should load documents or not. */ typedef bool (check_filter_data_input_func)(int); /** Returns a Filter that handles the given MIME type. * The Filter object is allocated with new. * This function is exported by dynamically loaded filter libraries * and serves as a factory for Filter objects, so that the client * application doesn't have to know which Filter sub-types handle * which MIME types. */ typedef Filter *(get_filter_func)(const std::string &); /// Filter interface. class Filter { public: /// Builds an empty filter. Filter(const std::string &mime_type) : m_mimeType(mime_type) {} /// Destroys the filter. virtual ~Filter() {} // Enumerations. /** What data a filter supports as input. * It can be either the whole document data, its file name, or its URI. */ typedef enum { DOCUMENT_DATA=0, DOCUMENT_STRING, DOCUMENT_FILE_NAME, DOCUMENT_URI } DataInput; /** Input properties supported by the filter. * * - DEFAULT_CHARSET is the source encoding that should be used * for reading/transcoding the original data if there is no * other way to determine it (ie: for text/plain files) * - OPERATING_MODE can be set to either view or index. * - DJF_UDI Unique document identifier. This can be useful if the * filter wants to manage a persistent cache. */ typedef enum { DEFAULT_CHARSET=0, OPERATING_MODE, DJF_UDI } Properties; // Information. /// Returns the MIME type handled by the filter. std::string get_mime_type(void) const { return m_mimeType; } /// Returns what data the filter requires as input. virtual bool is_data_input_ok(DataInput input) const = 0; // Initialization. /** Sets a property, prior to calling set_document_XXX(). * Returns false if the property is not supported. */ virtual bool set_property(Properties prop_name, const std::string &prop_value) = 0; /** (Re)initializes the filter with the given data. * Caller should ensure the given pointer is valid until the * Filter object is destroyed, as some filters may not need to * do a deep copy of the data. * Call next_document() to position the filter onto the first document. * Returns false if this input is not supported or an error occured. */ virtual bool set_document_data(const char *data_ptr, unsigned int data_length) = 0; /** (Re)initializes the filter with the given data. * Call next_document() to position the filter onto the first document. * Returns false if this input is not supported or an error occured. */ virtual bool set_document_string(const std::string &data_str) = 0; /** (Re)initializes the filter with the given file. * Call next_document() to position the filter onto the first document. * Returns false if this input is not supported or an error occured. */ virtual bool set_document_file(const std::string &file_path) = 0; /** (Re)initializes the filter with the given URI. * Call next_document() to position the filter onto the first document. * Returns false if this input is not supported or an error occured. */ virtual bool set_document_uri(const std::string &uri) = 0; /** Set the document size meta_data element. This is the size of the immediate containing file (ie, a .doc, a .odt), not the size of, ie, a containing archive or .gz nor the size of the extracted text. This is set externally, because the surrounding code quite often has a better idea about it (having created a temp file, etc.), and this saves more stat() calls The value is stored inside metaData, docsize key */ virtual void set_docsize(size_t size) = 0; // Going from one nested document to the next. /** Returns true if there are nested documents left to extract. * Returns false if the end of the parent document was reached * or an error occured. */ virtual bool has_documents(void) const = 0; /** Moves to the next nested document. * Returns false if there are none left. */ virtual bool next_document(void) = 0; /** Skips to the nested document with the given ipath. * Returns false if no such document exists. */ virtual bool skip_to_document(const std::string &ipath) = 0; // Accessing documents' contents. /// Returns the message for the most recent error that has occured. virtual std::string get_error(void) const = 0; /** Returns a dictionary of metadata extracted from the current document. * Metadata fields may include one or more of the following : * content, title, ipath, mimetype, language, charset, author, creator, * publisher, modificationdate, creationdate, size * Special considerations apply : * - content may contain binary data, watch out ! * - ipath is an internal path to the nested document that can be * later passed to skip_to_document(). It may be empty if the parent * document's type doesn't allow embedding, in which case the filter * should only return one document. * - mimetype should be text/plain if the document could be handled * internally, empty if unknown. If any other value, it is expected * that the client application can pass the nested document's content * to another filter that supports this particular type. */ virtual const std::map &get_meta_data(void) const { return m_metaData; } virtual void clear() {m_metaData.clear();} virtual bool is_unknown() {return false;} protected: /// The MIME type handled by the filter. std::string m_mimeType; /// Metadata dictionary. std::map m_metaData; private: /// Filter objects cannot be copied. Filter(const Filter &other); /// Filter objects cannot be copied. Filter& operator=(const Filter& other); }; } #endif // _DIJON_FILTER_H recoll-1.17.3/internfile/Makefile000644 001750 000000 00000001505 11740755063 017274 0ustar00dockeswheel000000 000000 # @(#$Id: Makefile,v 1.4 2008-11-24 15:47:40 dockes Exp $ (C) 2005 J.F.Dockes depth = .. include $(depth)/mk/sysconf # Only test executables get build in here PROGS = mh_mbox internfile all: $(BIGLIB) $(PROGS) $(BIGLIB): force cd $(depth)/lib;$(MAKE) force: INTERNFILE_OBJS= trinternfile.o $(BIGLIB) internfile : $(INTERNFILE_OBJS) $(CXX) $(ALL_CXXFLAGS) -o internfile $(INTERNFILE_OBJS) \ $(LIBICONV) $(LIBSYS) trinternfile.o : internfile.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_INTERNFILE -c -o trinternfile.o \ internfile.cpp MH_MBOX_OBJS= trmh_mbox.o $(BIGLIB) mh_mbox : $(MH_MBOX_OBJS) $(CXX) $(ALL_CXXFLAGS) -o mh_mbox $(MH_MBOX_OBJS) \ $(LIBICONV) $(LIBSYS) trmh_mbox.o : mh_mbox.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_MH_MBOX -c -o trmh_mbox.o \ mh_mbox.cpp clean: rm -f *.o $(PROGS) recoll-1.17.3/internfile/htmlparse.cpp000644 001750 000000 00000024657 11740755063 020354 0ustar00dockeswheel000000 000000 /* This file was copied/updated from xapian-omega-1.0.1 to 1.2.6 and modified */ /* htmlparse.cc: simple HTML parser for omega indexer * * Copyright 1999,2000,2001 BrightStation PLC * Copyright 2001 Ananova Ltd * Copyright 2002,2006,2007,2008,2009,2010,2011 Olly Betts * * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ #include using std::find; using std::find_if; #include "htmlparse.h" #include #include #include inline void lowercase_string(string &str) { for (string::iterator i = str.begin(); i != str.end(); ++i) { *i = tolower(static_cast(*i)); } } map HtmlParser::named_ents; inline static bool p_notdigit(char c) { return !isdigit(static_cast(c)); } inline static bool p_notxdigit(char c) { return !isxdigit(static_cast(c)); } inline static bool p_notalnum(char c) { return !isalnum(static_cast(c)); } inline static bool p_notwhitespace(char c) { return !isspace(static_cast(c)); } inline static bool p_nottag(char c) { return !isalnum(static_cast(c)) && c != '.' && c != '-' && c != ':'; // ':' for XML namespaces. } inline static bool p_whitespacegt(char c) { return isspace(static_cast(c)) || c == '>'; } inline static bool p_whitespaceeqgt(char c) { return isspace(static_cast(c)) || c == '=' || c == '>'; } bool HtmlParser::get_parameter(const string & param, string & value) const { map::const_iterator i = parameters.find(param); if (i == parameters.end()) return false; value = i->second; return true; } HtmlParser::HtmlParser() { // RECOLL: no need to initialize these entities, we use those from // myhtmlparse #if 0 static const struct ent { const char *n; unsigned int v; } ents[] = { #include "namedentities.h" { NULL, 0 } }; if (named_ents.empty()) { const struct ent *i = ents; while (i->n) { named_ents[string(i->n)] = i->v; ++i; } } #endif } void HtmlParser::decode_entities(string &s) { // Not used for recoll. Kept here to minimize the amount of // diffs. Almost the same code in myhtmlparse except that the // entity table directly holds the utf-8 strings instead of the // unicode positions (one less conversion). #if 0 // We need a const_iterator version of s.end() - otherwise the // find() and find_if() templates don't work... string::const_iterator amp = s.begin(), s_end = s.end(); while ((amp = find(amp, s_end, '&')) != s_end) { unsigned int val = 0; string::const_iterator end, p = amp + 1; if (p != s_end && *p == '#') { p++; if (p != s_end && (*p == 'x' || *p == 'X')) { // hex p++; end = find_if(p, s_end, p_notxdigit); sscanf(s.substr(p - s.begin(), end - p).c_str(), "%x", &val); } else { // number end = find_if(p, s_end, p_notdigit); val = atoi(s.substr(p - s.begin(), end - p).c_str()); } } else { end = find_if(p, s_end, p_notalnum); string code = s.substr(p - s.begin(), end - p); map::const_iterator i; i = named_ents.find(code); if (i != named_ents.end()) val = i->second; } if (end < s_end && *end == ';') end++; if (val) { string::size_type amp_pos = amp - s.begin(); if (val < 0x80) { s.replace(amp_pos, end - amp, 1u, char(val)); } else { // Convert unicode value val to UTF-8. char seq[4]; unsigned len = Xapian::Unicode::nonascii_to_utf8(val, seq); s.replace(amp_pos, end - amp, seq, len); } s_end = s.end(); // We've modified the string, so the iterators are no longer // valid... amp = s.begin() + amp_pos + 1; } else { amp = end; } } #endif } void HtmlParser::parse_html(const string &body) { in_script = false; parameters.clear(); string::const_iterator start = body.begin(); while (true) { // Skip through until we find an HTML tag, a comment, or the end of // document. Ignore isolated occurrences of `<' which don't start // a tag or comment. string::const_iterator p = start; while (true) { p = find(p, body.end(), '<'); if (p == body.end()) break; unsigned char ch = *(p + 1); // Tag, closing tag, or comment (or SGML declaration). if ((!in_script && isalpha(ch)) || ch == '/' || ch == '!') break; if (ch == '?') { // PHP code or XML declaration. // XML declaration is only valid at the start of the first line. // FIXME: need to deal with BOMs... if (p != body.begin() || body.size() < 20) break; // XML declaration looks something like this: // if (p[2] != 'x' || p[3] != 'm' || p[4] != 'l') break; if (strchr(" \t\r\n", p[5]) == NULL) break; string::const_iterator decl_end = find(p + 6, body.end(), '?'); if (decl_end == body.end()) break; // Default charset for XML is UTF-8. charset = "utf-8"; string decl(p + 6, decl_end); size_t enc = decl.find("encoding"); if (enc == string::npos) break; enc = decl.find_first_not_of(" \t\r\n", enc + 8); if (enc == string::npos || enc == decl.size()) break; if (decl[enc] != '=') break; enc = decl.find_first_not_of(" \t\r\n", enc + 1); if (enc == string::npos || enc == decl.size()) break; if (decl[enc] != '"' && decl[enc] != '\'') break; char quote = decl[enc++]; size_t enc_end = decl.find(quote, enc); if (enc != string::npos) charset = decl.substr(enc, enc_end - enc); break; } p++; } // Process text up to start of tag. if (p > start || p == body.end()) { string text = body.substr(start - body.begin(), p - start); decode_entities(text); process_text(text); } if (p == body.end()) { do_eof(); break; } start = p + 1; if (start == body.end()) break; if (*start == '!') { if (++start == body.end()) break; if (++start == body.end()) break; // comment or SGML declaration if (*(start - 1) == '-' && *start == '-') { ++start; string::const_iterator close = find(start, body.end(), '>'); // An unterminated comment swallows rest of document // (like Netscape, but unlike MSIE IIRC) if (close == body.end()) break; p = close; // look for --> while (p != body.end() && (*(p - 1) != '-' || *(p - 2) != '-')) p = find(p + 1, body.end(), '>'); if (p != body.end()) { // Check for htdig's "ignore this bit" comments. if (p - start == 15 && string(start, p - 2) == "htdig_noindex") { string::size_type i; i = body.find("", p + 1 - body.begin()); if (i == string::npos) break; start = body.begin() + i + 21; continue; } // If we found --> skip to there. start = p; } else { // Otherwise skip to the first > we found (as Netscape does). start = close; } } else { // just an SGML declaration, perhaps giving the DTD - ignore it start = find(start - 1, body.end(), '>'); if (start == body.end()) break; } ++start; } else if (*start == '?') { if (++start == body.end()) break; // PHP - swallow until ?> or EOF start = find(start + 1, body.end(), '>'); // look for ?> while (start != body.end() && *(start - 1) != '?') start = find(start + 1, body.end(), '>'); // unterminated PHP swallows rest of document (rather arbitrarily // but it avoids polluting the database when things go wrong) if (start != body.end()) ++start; } else { // opening or closing tag int closing = 0; if (*start == '/') { closing = 1; start = find_if(start + 1, body.end(), p_notwhitespace); } p = start; start = find_if(start, body.end(), p_nottag); string tag = body.substr(p - body.begin(), start - p); // convert tagname to lowercase lowercase_string(tag); if (closing) { if (!closing_tag(tag)) return; if (in_script && tag == "script") in_script = false; /* ignore any bogus parameters on closing tags */ p = find(start, body.end(), '>'); if (p == body.end()) break; start = p + 1; } else { bool empty_element = false; // FIXME: parse parameters lazily. while (start < body.end() && *start != '>') { string name, value; p = find_if(start, body.end(), p_whitespaceeqgt); size_t name_len = p - start; if (name_len == 1) { if (*start == '/' && p < body.end() && *p == '>') { // E.g. start = p; empty_element = true; break; } } name.assign(body, start - body.begin(), name_len); p = find_if(p, body.end(), p_notwhitespace); start = p; if (start != body.end() && *start == '=') { start = find_if(start + 1, body.end(), p_notwhitespace); p = body.end(); int quote = *start; if (quote == '"' || quote == '\'') { start++; p = find(start, body.end(), quote); } if (p == body.end()) { // unquoted or no closing quote p = find_if(start, body.end(), p_whitespacegt); } value.assign(body, start - body.begin(), p - start); start = find_if(p, body.end(), p_notwhitespace); if (!name.empty()) { // convert parameter name to lowercase lowercase_string(name); // in case of multiple entries, use the first // (as Netscape does) parameters.insert(make_pair(name, value)); } } } #if 0 cout << "<" << tag; map::const_iterator x; for (x = parameters.begin(); x != parameters.end(); x++) { cout << " " << x->first << "=\"" << x->second << "\""; } cout << ">\n"; #endif if (!opening_tag(tag)) return; parameters.clear(); if (empty_element) { if (!closing_tag(tag)) return; } // In .... -------------------------------------------------------------- 3.3. Searching on the command line There are several ways to obtain search results as a text stream, without a graphical interface: * By passing option -t 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 -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. 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 -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. 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 roughly 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. Example: Beatles, author:balzac, dc:title:grandet The colon, if present, means "contains". Xesam defines other relations, which are not supported for now. 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. Do not enter explicit parenthesis, they are not supported for now. An element preceded by a - specifies a term that should not appear. Pure negative queries are forbidden. 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. Modifiers can be set on a phrase clause, for example to specify a proximity search (unordered). See the modifier section. Recoll 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. * ext specifies the file name extension (Ex: ext:html) 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 out of the specified directory, only after release 1.15.8. A tilde inside the value will be expanded to the home directory. dir is not a regular field and only one value makes sense in a query (you can't use dir:dir1 OR dir:dir2). Relative paths make sense, for example, dir:share/doc would match either /usr/share/doc or /usr/local/share/doc * 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 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. 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. The document filters 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.4.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: * l can be used to turn off stemming (mostly makes sense with p because stemming is off by default for phrases). * 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 * 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.5. 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.5.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: * * 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 before using wildcards. * 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. * 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.5.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. -------------------------------------------------------------- 3.6. Desktop integration Being independant of the desktop type has its drawbacks: Recoll desktop integration is minimal. Here follow a few things that may help. -------------------------------------------------------------- 3.6.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.6.2. The KDE Kicker Recoll applet 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 filters for new types of documents. The processing of metadata attributes for documents (fields) is highly configurable. -------------------------------------------------------------- 4.1. Writing a document filter Recoll filters are executable programs which translate from a specific format (ie: openoffice, acrobat, etc.) to the Recoll indexing input format, which may be text/plain or text/html. As of Recoll 1.13, there are two kinds of filters: * Simple filters (the old ones) run once and exit. They can be bare programs like antiword, or shell-scripts using other programs. They are very simple to write, just having to write the text to the standard output. * Multiple filters, new in 1.13, run as long as their master process (ie: recollindex) is active. They can process multiple files (sparing the process startup time which can be very significant), or multiple documents per file (ie: 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 these new filters are written in Python, using a common module to handle the protocol. The following will just describe the simple filters. If you can program and want to write one of the other kind, it shouldn't be too difficult to make sense of one of the existing modules. For example, look at rclzip which uses Zip file paths as internal identifiers (ipath), and rclinfo, which uses an integer index. -------------------------------------------------------------- 4.1.1. Simple filters Recoll simple filters 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 filter. In some cases the output of the translating program is completely appropriate, and no intermediate shell-script is needed. Filters are called with a single argument which is the source file name. They should output the result to stdout. When writing a filter, 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 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 filter if the operation is for indexing or previewing. Some filters 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 filters, for example rclps for a starting point. Don't forget to make your filter executable before testing ! -------------------------------------------------------------- 4.1.2. Telling Recoll about the filter There are two elements that link a file to the filter which should process it: the association of file to mime type and the association of a mime type with a filter. 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 filters 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 filter. This is determined by the execm keyword. -------------------------------------------------------------- 4.1.3. Filter 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. "&" should be transformed into "&", "<" should be transformed into "<". This is not always properly done by translating programs which output HTML, and of course nerver by those which output plain text. 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 also make use of other header fields if they are present: title, description, keywords. Filters also have the possibility to "invent" field names. This should be output as meta tags: See the following section for details about configuring how field data is processed by the indexer. -------------------------------------------------------------- 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 filters as meta fields in the HTML header section, 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 filters, 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. You can find more information in the section about the fields file, or in comments inside the file. -------------------------------------------------------------- 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 Python interface is not built by default and can be found in the source package, under python/recoll. In order to build the module, you should first build or re-build the Recoll library using position-independant objects: cd recoll-xxx/ configure --enable-pic make There is no significant disadvantage in using PIC objects for the main Recoll executables, so you can use the --enable-pic option for the main build too. The python/recoll/ directory contains the usual setup.py script which you can then use to build and install the module: cd recoll-xxx/python/recoll python setup.py build python setup.py install -------------------------------------------------------------- 4.3.2.2. Interface manual NAME recoll - This is an interface to the Recoll full text indexer. FILE /usr/local/lib/python2.5/site-packages/recoll.so CLASSES Db Doc Query SearchData class Db(__builtin__.object) | Db([confdir=None], [extra_dbs=None], [writable = False]) | | A Db object holds a connection to a Recoll index. Use the connect() | function to create one. | confdir specifies a Recoll configuration directory (default: | $RECOLL_CONFDIR or ~/.recoll). | extra_dbs is a list of external databases (xapian directories) | writable decides if we can index new data through this connection | | Methods defined here: | | | addOrUpdate(...) | addOrUpdate(udi, doc, parent_udi=None) -> None | Add or update index data for a given document | The udi string must define a unique id for the document. It is not | interpreted inside Recoll | doc is a Doc object | if parent_udi is set, this is a unique identifier for the | top-level container (ie mbox file) | | delete(...) | delete(udi) -> Bool. | Purge index from all data for udi. If udi matches a container | document, purge all subdocs (docs with a parent_udi matching udi). | | makeDocAbstract(...) | makeDocAbstract(Doc, Query) -> string | Build and return 'keyword-in-context' abstract for document | and query. | | needUpdate(...) | needUpdate(udi, sig) -> Bool. | Check if the index is up to date for the document defined by udi, | having the current signature sig. | | purge(...) | purge() -> Bool. | Delete all documents that were not touched during the just finished | indexing pass (since open-for-write). These are the documents for | the needUpdate() call was not performed, indicating that they no | longer exist in the primary storage system. | | query(...) | query() -> Query. Return a new, blank query object for this index. | | setAbstractParams(...) | setAbstractParams(maxchars, contextwords). | Set the parameters used to build 'keyword-in-context' abstracts | | ---------------------------------------------------------------------- | Data and other attributes defined here: | class Doc(__builtin__.object) | Doc() | | 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 no useful methods but | 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 | Predefined attributes (index/query/both): | text (index): document plain text | url (both) | fbytes (both) optional) file size in bytes | filename (both) | fmtime (both) optional file modification date. Unix time printed | as string | dbytes (both) document text bytes | dmtime (both) document creation/modification date | ipath (both) value private to the app.: internal access path | inside file | mtype (both) mime type for original document | mtime (query) dmtime if set else fmtime | origcharset (both) charset the text was converted from | size (query) dbytes if set, else fbytes | sig (both) app-defined file modification signature. | For up to date checks | relevancyrating (query) | abstract (both) | author (both) | title (both) | keywords (both) | | Methods defined here: | | | ---------------------------------------------------------------------- | Data and other attributes defined here: | class Query(__builtin__.object) | Recoll Query objects are used to execute index searches. | They must be created by the Db.query() method. | | Methods defined here: | | | execute(...) | execute(query_string, stemming=1|0) | | Starts a search for query_string, a Recoll search language string | (mostly Xesam-compatible). | The query can be a simple list of terms (and'ed by default), or more | complicated with field specs etc. See the Recoll manual. | | executesd(...) | executesd(SearchData) | | Starts a search for the query defined by the SearchData object. | | fetchone(...) | fetchone(None) -> Doc | | Fetches the next Doc object in the current search results. | | sortby(...) | sortby(field=fieldname, ascending=true) | Sort results by 'fieldname', in ascending or descending order. | Only one field can be used, no subsorts for now. | Must be called before executing the search | | ---------------------------------------------------------------------- | Data descriptors defined here: | | next | Next index to be fetched from results. Normally increments after | each fetchone() call, but can be set/reset before the call effect | seeking. Starts at 0 | | ---------------------------------------------------------------------- | Data and other attributes defined here: | class SearchData(__builtin__.object) | SearchData() | | A SearchData object describes a query. It has a number of global | parameters and a chain of search clauses. | | Methods defined here: | | | addclause(...) | addclause(type='and'|'or'|'excl'|'phrase'|'near'|'sub', | qstring=string, slack=int, field=string, stemming=1|0, | subSearch=SearchData) | Adds a simple clause to the SearchData And/Or chain, or a subquery | defined by another SearchData object | | ---------------------------------------------------------------------- | Data and other attributes defined here: | FUNCTIONS connect(...) connect([confdir=None], [extra_dbs=None], [writable = False]) -> Db. Connects to a Recoll database and returns a Db object. confdir specifies a Recoll configuration directory (the default is built like for any Recoll program). extra_dbs is a list of external databases (xapian directories) writable decides if we can index new data through this connection -------------------------------------------------------------- 4.3.2.3. 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. #!/usr/bin/env python import recoll db = recoll.connect() db.setAbstractParams(maxchars=80, contextwords=2) query = db.query() nres = query.execute("some user question") print "Result count: ", nres if nres > 5: nres = 5 while query.next >= 0 and query.next < nres: doc = query.fetchone() print query.next for k in ("title", "size"): print k, ":", getattr(doc, k).encode('utf-8') abs = db.makeDocAbstract(doc, query).encode('utf-8') print abs print -------------------------------------------------------------- Chapter 5. Installation and configuration 5.1. Installing a binary copy There are three types of binary Recoll installations: * Through your system normal software distribution framework (ie, Debian/Ubuntu apt, FreeBSD ports, etc.). * From a package downloaded from the Recoll web site. * From a prebuilt tree downloaded from the Recoll web site. In all cases, the strict software dependancies (ie on Xapian or iconv) will be automatically satisfied, you should not have to worry about them. You will only 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.1.1. Installing through a package system If you use a BSD-type port system or a prebuilt package (DEB, RPM, manually or through the system software configuration utility), just follow the usual procedure for your system. -------------------------------------------------------------- 5.1.2. Installing a prebuilt Recoll The unpackaged binary versions on the Recoll web site are just compressed tar files of a build tree, where only the useful parts were kept (executables and sample configuration). The executable binary files are built with a static link to libxapian and libiconv, to make installation easier (no dependencies). After extracting the tar file, you can proceed with installation as if you had built the package from source (that is, just type make install). The binary trees are built for installation to /usr/local. -------------------------------------------------------------- 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 filters 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 the Recoll helper applications page 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 the Recoll helper applications page 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 filter 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 the Xpdf or Poppler packages. * Postscript files need pstotext. The original version has an issue with shell character in file names, which is corrected in recent packages. See the the Recoll helper applications page 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 need catdoc. * 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 standard version, has much trouble with non-western character sets. Check the Recoll helper applications page. * TeX files need untex or detex. Check the Recoll helper applications page 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: Recoll releases before 1.13 used the id3info command from the id3lib package to extract mp3 tag information, metaflac (standard flac tools) for flac files, and ogginfo (vorbis tools) for ogg files. Releases 1.14 and later use a single Python filter based on mutagen for all audio file types. * 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. * chm: files in microsoft help format need Python and the pychm module (which needs chmlib). * 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. * 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 filter, 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 filters need iconv and the standard sed and awk. -------------------------------------------------------------- 5.3. Building from source 5.3.1. Prerequisites C++ compiler. Up to Recoll version 1.13.04, its absence can manifest itself by strange messages about a missing iconv_open. 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. Development files for Qt . Development files for X11 and zlib. Check the Recoll download page for up to date version information. You will most probably be able to find a binary package for Qt for your system. You may have to compile Xapian but this is not difficult (if you are using FreeBSD, there is a port). You may also need libiconv. Recoll currently uses version 1.9 (this should not be critical). On Linux systems, the iconv interface is part of libc and you should not need to do anything special. -------------------------------------------------------------- 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. Depending on the Qt 3 configuration on your system, you may have to set the QTDIR and QMAKESPECS variables in your environment: * QTDIR should point to the directory above the one that holds the qt include files (ie: if qt.h is /usr/local/qt/include/qt.h, QTDIR should be /usr/local/qt). * QMAKESPECS should be set to the name of one of the Qt mkspecs sub-directories (ie: linux-g++). On many Linux systems, QTDIR is set by the login scripts, and QMAKESPECS is not needed because there is a default link in mkspecs/. Neither QTDIR nor QMAKESPECS should be needed with Qt 4, configuration details are entirely determined by qmake (which is quite often installed as qmake-qt4). Configure options: * --without-aspell will disable the code for phonetic matching of search terms. * --with-fam or --with-inotify will enable the code for real time indexing. Inotify support is enabled by default on recent Linux systems. * --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. * --enable-xattr will enable code to fetch data from file extended attributes. This is only useful is some application stores data in there, and also needs some simple configuration (see comments in the fields configuration file). * --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). * --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. * --disable-qtgui Disable the Qt interface. Will allow building the indexer and the command line search program in absence of a Qt environment. * --disable-x11mon Disable X11 connection monitoring inside recollindex. Together with --disable-qtgui, this allows building recoll without Qt and X11. * 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.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 define the parameters for one index. The configuration files can be edited by hand or through the Indexing 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. 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. 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: * 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. -------------------------------------------------------------- 5.4.1. Main configuration file 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.1.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 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 recoll_noindex variable in mimemap for an alternative approach which indexes the file names. 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 and FNM_LEADING_DIR flags. 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). 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. 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). 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 use the 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 mimemap file). This can be useful for files with suffix-less names, but it will also cause the indexing of many bogus "text" files. processbeaglequeue 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. beaglequeuedir 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. -------------------------------------------------------------- 5.4.1.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. 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. 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 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. -------------------------------------------------------------- 5.4.1.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 Beagle 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 Beagle web browser plugin indexing code, and defines the maximum size for the web page cache. Default: 40 MB. 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 depends on average document size. The default value is 10. -------------------------------------------------------------- 5.4.1.4. Miscellaneous parameters: 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. 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. filtermaxseconds Maximum filter execution time, after which it is aborted. Some postscript programs just loop... filtersdir 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 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. 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. -------------------------------------------------------------- 5.4.2. 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 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 filter-specific sections Some filters may need specific configuration for handling fields. Only the email message filter 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 filter 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 = [mail] # Extract the X-My-Tag mail header, and use it internally with the # mailmytag field name x-my-tag = mailmytag -------------------------------------------------------------- 5.4.3. 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. mimemap also has a recoll_noindex variable which is a list of suffixes. Matching files will be skipped (which avoids unnecessary decompressions or file executions). This is partially redundant with skippedNames in the main configuration file, with a few differences: it will not affect directories, it cannot be made dependant on the file-system location (it is a configuration-wide parameter), and the file names will still be indexed (not even the file names are indexed for patterns in skippedNames. recoll_noindex is used mostly for things known to be unindexable by a given Recoll version. Having it there avoids cluttering the more user-oriented and locally customized skippedNames. -------------------------------------------------------------- 5.4.4. 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.5. 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 user preferences dialog. If Use desktop preferences to choose document editor is checked in the Recoll GUI user preferences, all mimeview entries will be ignored except the one labelled application/x-all (which is set to use xdg-open by default). 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. Please note that these 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). * %F. Original file name. Same as %f except if a temporary file is used. * %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. * %M. Mime type * %U, %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.6. Examples of configuration adjustments 5.4.6.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: * 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 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.6.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): * 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 filter 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 a filter. -------------------------------------------------------------- recoll-1.17.3/doc/user/index.html000644 001750 000000 00000020742 11754152276 017223 0ustar00dockeswheel000000 000000 Recoll user manual

Recoll user manual

Jean-Francois Dockes

This document introduces full text search notions and describes the installation and use of the Recoll application. It currently describes Recoll 1.17.


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.2. Index storage
2.2.1. Xapian index formats
2.2.2. Security aspects
2.3. Indexing configuration
2.3.1. The indexing configuration GUI
2.4. Using Beagle WEB browser plugins
2.5. Periodic indexing
2.5.1. Running indexing
2.5.2. Using cron to automate indexing
2.6. Real time indexing
2.6.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. The preview window
3.1.5. Complex/advanced search
3.1.6. The term explorer tool
3.1.7. Multiple databases
3.1.8. Document history
3.1.9. Sorting search results and collapsing duplicates
3.1.10. Search tips, shortcuts
3.1.11. 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. The query language
3.4.1. Modifiers
3.5. Anchored searches and wildcards
3.5.1. More about wildcards
3.5.2. Anchored searches
3.6. Desktop integration
3.6.1. Hotkeying recoll
3.6.2. The KDE Kicker Recoll applet
4. Programming interface
4.1. Writing a document filter
4.1.1. Simple filters
4.1.2. Telling Recoll about the filter
4.1.3. Filter HTML output
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.1.1. Installing through a package system
5.1.2. Installing a prebuilt Recoll
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. Main configuration file
5.4.2. The fields file
5.4.3. The mimemap file
5.4.4. The mimeconf file
5.4.5. The mimeview file
5.4.6. Examples of configuration adjustments
recoll-1.17.3/doc/user/rcl.introduction.html000644 001750 000000 00000006655 11754152276 021423 0ustar00dockeswheel000000 000000 Introduction

Chapter 1. Introduction

Table of Contents
1.1. Giving it a try
1.2. Full text search
1.3. Recoll overview

1.1. Giving it a try

If you do not like reading manuals (who does?) and would like to give Recoll a try, just install the application and start the recoll graphical user interface (GUI), which will ask 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.

Also be aware that you may need to install the appropriate supporting applications for document types that need them (for example antiword for ms-word files).

recoll-1.17.3/doc/user/rcl.introduction.search.html000644 001750 000000 00000010273 11754152276 022656 0ustar00dockeswheel000000 000000 Full text search

1.2. Full text search

Recoll is a full text search application. Full text search applications let you find your data by content rather than by external attributes (like a file name). More specifically, they will let you specify words (terms) that should or should not appear in the text you are looking for, and 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 those terms are prominent, in a similar way to Internet search engines.

A search application tries 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, not for a specific form or spelling. These different forms may include plurals, different tenses for a verb, or terms derived from the same root or stem (example: floor, floors, floored, flooring...). Search applications usually expand queries to all such related terms (words that reduce to the same stem) and also provide a way to disable this expansion if you are actually searching for a specific form.

Stemming, by itself, does not accommodate for misspellings or phonetic searches. Recoll supports these features through a specific tool (the term explorer) which will let you explore the set of index terms along different modes.

recoll-1.17.3/doc/user/rcl.introduction.recoll.html000644 001750 000000 00000015451 11754152276 022674 0ustar00dockeswheel000000 000000 Recoll overview

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. Recoll provides the mechanisms and interface to get data into and out of the system.

In practice, Xapian works by remembering where terms appear in your document files. The acquisition process is called indexing.

The resulting 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 with different character sets, encodings, and languages into the same index. It has input filters for many document types.

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 stemmer module for most common languages where stemming makes sense. 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 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. 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, awaiting the addition of an automatic language recognition module to Recoll, it is much less cumbersome than separating your documents according to what language they are written in.

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

The indexing process is started automatically the first time you execute the recoll GUI. Indexing can also be performed by executing the recollindex command.

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 a Ubuntu Unity Lens module.

recoll-1.17.3/doc/user/rcl.indexing.html000644 001750 000000 00000015465 11754152276 020506 0ustar00dockeswheel000000 000000 Indexing

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. 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).

Recoll indexing can be performed with two different methods:

  • 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.

  • 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.

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 in turn be themselves compound ones. Such hierarchies can go quite deep, and Recoll can process, for example, an ms-word 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.

Without further configuration, Recoll will index all appropriate files from your home directory, with a reasonable set of defaults.

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. See the section about using multiple databases for more information on multiple configurations and indexes.

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.

recoll-1.17.3/doc/user/rcl.indexing.storage.html000644 001750 000000 00000015647 11754152276 022153 0ustar00dockeswheel000000 000000 Index storage

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):

  • 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 that you wish to make searchable.

  • You can also specify a different 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 document set size, 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.

Unfortunately, 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.

recoll-1.17.3/doc/user/rcl.indexing.config.html000644 001750 000000 00000013304 11754152276 021740 0ustar00dockeswheel000000 000000 Indexing configuration

2.3. Indexing 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 using the dialogs in the recoll GUI.

You can also use multiple indexes defined by separate configurations, typically to separate personal and shared indexes, or to take advantage of the organization of your data to improve search precision.

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

2.3.1. The indexing configuration GUI

Most parameters for a given indexing 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->Indexing Configuration menu entry. It is divided in three tabs, Global parameters, Local parameters, and Beagle web history, which is explained in the next section.

The first tab allows setting global variables, like the lists of top directories, skipped paths, or stemming languages.

The second 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 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...

recoll-1.17.3/doc/user/rcl.indexing.beaglequeue.html000644 001750 000000 00000007507 11754152276 022767 0ustar00dockeswheel000000 000000 Using Beagle WEB browser plugins

2.4. Using Beagle WEB browser plugins

Beagle is (was?) a concurrent desktop indexer, built on Lucene and the Mono project (C#), for which a number of add-on browser plugins were written. These work by copying visited web pages to an indexing queue directory, which the indexer then processes. Especially, there is a Firefox extension.

If, for any reason, you so happen to prefer Recoll to Beagle, you can still use the Firefox plugin, which is written in Javascript and completely independant of C#, Beagle, Lucene..., and set Recoll to process the Beagle queue directory. This supposes that Beagle is not running, else both programs will fight for the same files.

This feature can be enabled in the GUI indexing configuration panel, or by editing the configuration file (set processbeaglequeue to 1).

There are more recent instructions about how to find and install the Firefox extension on the Recoll wiki.

Unfortunately, it seems that the plugin does not work anymore with recent Firefox versions (tried with 10.0). This is not the trival installation version check issue, explicit manual indexing requests still work, but automatic indexing on page load does not.

recoll-1.17.3/doc/user/rcl.indexing.periodic.html000644 001750 000000 00000015507 11754152276 022300 0ustar00dockeswheel000000 000000 Periodic indexing

2.5. Periodic indexing

2.5.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 are still up to date will not need to be reindexed).

recollindex has a number of other options which are described in its man page.

Of special interest 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 .

recollindex -i will not descend into directory parameters, but just add them as index entries. It is up to the external file selection method to build the complete file list.

2.5.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.

recoll-1.17.3/doc/user/rcl.indexing.monitor.html000644 001750 000000 00000014002 11754152276 022156 0ustar00dockeswheel000000 000000 Real time indexing

2.6. 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 discarded. 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.

2.6.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.

recoll-1.17.3/doc/user/rcl.search.html000644 001750 000000 00000154434 11754152276 020146 0ustar00dockeswheel000000 000000 Searching

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:

  • 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 and location in the file system.

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).

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.

File name will specifically look for file names. The entry will be split at white space characters, and each fragment will be separately expanded, then the search will be for file names matching all fragments (this is new in 1.15, older releases did an OR of the whole thing which did not make sense). Things to know:

  • The search is case- and accent-insensitive.

  • Fragments without any wild card character and not capitalized will be prepended and appended with '*' (ie: etc -> *etc*, but Etc -> etc). Of course it does not make sense to have multiple fragments if one of them is capitalized (as this one will require an exact match).

  • If you want to search for a pattern including white space, use double quotes (ie: "admin note*").

  • If you have a big index (many files), excessively generic fragments may result in inefficient searches.

  • As an example, inst recoll would match recollinstall.in (and quite a few others...).

The point of having a separate file name search is that wild card expansion can be performed more efficiently on a relatively small subset of the index (allowing wild cards on the left of terms without excessive penality).

All search modes allow wildcards inside terms (*, ?, []). You may want to have a look at the section about wildcards for more information about this.

You can search for exact phrases (adjacent words in a given order) by enclosing the input inside double quotes. Ex: "virtual reality".

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.

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 (the old sort tool is gone after release 1.15, because the new result table has much better capability).

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 attempt to start an external viewer. The viewer for each document type can be configured through the user preferences dialog, or by editing the mimeview configuration file. You can also check the Use desktop preferences option in the user preferences dialog to use the desktop defaults for all documents. This is probably the best option if you are using a well configured Gnome or KDE desktop.

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. 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

  • Copy File Name

  • Copy Url

  • Save to File

  • Find similar

  • Preview Parent document

  • Open Parent document

The Preview and Open entries do the same thing as the corresponding links.

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 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.

The Parent document entries will appear for documents which are not actually files but are part of, or attached to, a higher level document. This entry is mainly useful for email attachments and permits viewing the message to which the document is attached. Note that the entry will also appear for an email which is part of an mbox folder file, but that you can't actually visualize the folder (there will be an error dialog if you try). Recoll is unfortunately not yet smart enough to disable the entry in this case. In other cases, the Open option makes sense, for example to start a chm viewer on the parent document for a help page.

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. 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).

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.

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.

You can print the current preview window contents by typing Ctrl-P (Ctrl + P) in the window text.

3.1.5. 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.

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.5.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:

  • 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.

3.1.5.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

  • 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.

3.1.6. 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 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 200 results for wildcards and regular expressions.

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.7. Multiple databases

Multiple Recoll databases or 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 recollindex program instance can only update one specific index.

A recoll program instance is also associated with a specific index, which is the one to be updated by its indexing thread, 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. Of course, 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.

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

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.

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.8. 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.9. 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 Query configuration dialog, and is off by default.

3.1.10. Search tips, shortcuts

3.1.10.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.10.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.10.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.

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.

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.

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.11. Customizing the search interface

You can customize some aspects of the search interface by using the Query 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.

  • 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.

  • Use <PRE> tags instead of <BR> to display plain text as HTML in preview: 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.

  • Use desktop preferences to choose document editor: if this is checked, the xdg-open utility will be used to open files when you click the Open link in the result list, instead of the application defined in mimeview. xdg-open will in term use your desktop preferences to choose an appropriate application.

  • Choose editor applications this will let you choose the command started by the Open links inside the result list, for specific document types.

  • Display category filter as toolbar... this will let you choose if the document categories are displayed as a list or a set of buttons.

  • 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 and Start with sort dialog open: If you use these dialogs all the time, checking these entries will get them 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 Recoll 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 Recoll tries to build document abstracts when displaying the result list. Abstracts are constructed by taking context from the document information, around the search terms. This can slow down result list display significantly for big documents, and you may want to turn it off.

  • 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,

3.1.11.1. The result list format

The result list presentation can be exhaustively customized by adjusting two elements:

  • The paragraph format

  • Html code inside the header section

These can be edited from the Result list tab of the Query configuration.

Newer versions of Recoll (from 1.17) use a WebKit HTML object by default (this may be disabled at build time), and 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.

No more detail will be given about the header part (only useful with the WebKit build), if there are restrictions to what you can do, they are beyond this author's HTML/CSS/Javascript abilities... There are a few examples on the page about customising the result list on the Recoll web site.

3.1.11.1.1. The paragraph format

This is an arbitrary HTML string where the following printf-like % substitutions will be performed:

  • %A. Abstract

  • %D. Date

  • %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.

  • %K. Keywords (if any)

  • %L. Precooked Preview and Edit links

  • %M. Mime type

  • %N. result Number inside the result page

  • %R. Relevance percentage

  • %S. Size information

  • %T. Title or Filename if not set.

  • %t. Title or Filename if not set.

  • %U. Url

The format of the Preview and Edit links is <a href="P%N"> and <a href="E%N"> where docnum (%N) expands to the document number inside the result page).

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. For example, you could look at the fields for the document types of interest (use the right-click menu inside the preview window), and add what you want to the list of stored fields. A candidate example would be the recipient field which is generated by the message filters.

The default value for the paragraph format string is:

<img src="%I" align="left">%R %S %L &nbsp;&nbsp;<b>%T</b><br>
%M&nbsp;%D&nbsp;&nbsp;&nbsp;<i>%U</i>&nbsp;%i<br>
%A %K
        
You may, for example, try the following for a more web-like experience:
<u><b><a href="P%N">%T</a></b></u><br>
%A<font color=#008000>%U - %S</font> - %L
        
Or the clean looking:
<img src="%I" align="left">%L <font color="#900000">%R</font>
  <b>%T</b><br>%S 
<font color="#808080"><i>%U</i></font>
<table bgcolor="#e0e0e0">
<tr><td><div>%A</div></td></tr>
</table>%K
        
Note that the P%N link in the above paragraph makes the title a preview link.

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.

recoll-1.17.3/doc/user/rcl.searchkio.html000644 001750 000000 00000011353 11754152276 020641 0ustar00dockeswheel000000 000000 Searching with the KDE KIO slave

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 <a href="recoll:/..."> 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()">
recoll-1.17.3/doc/user/rcl.search.commandline.html000644 001750 000000 00000013547 11754152276 022432 0ustar00dockeswheel000000 000000 Searching on the command line

3.3. Searching on the command line

There are several ways to obtain search results as a text stream, without a graphical interface:

  • By passing option -t 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 -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.

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>
    -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....
recoll-1.17.3/doc/user/rcl.search.lang.html000644 001750 000000 00000031320 11754152276 021052 0ustar00dockeswheel000000 000000 The query language

3.4. 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 roughly 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. Example: Beatles, author:balzac, dc:title:grandet

The colon, if present, means "contains". Xesam defines other relations, which are not supported for now.

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. Do not enter explicit parenthesis, they are not supported for now.

An element preceded by a - specifies a term that should not appear. Pure negative queries are forbidden.

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.

Modifiers can be set on a phrase clause, for example to specify a proximity search (unordered). See the modifier section.

Recoll 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.

  • ext specifies the file name extension (Ex: ext:html)

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 out of the specified directory, only after release 1.15.8. A tilde inside the value will be expanded to the home directory. dir is not a regular field and only one value makes sense in a query (you can't use dir:dir1 OR dir:dir2). Relative paths make sense, for example, dir:share/doc would match either /usr/share/doc or /usr/local/share/doc

  • 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 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.

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.

The document filters 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.4.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:

  • l can be used to turn off stemming (mostly makes sense with p because stemming is off by default for phrases).

  • 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

  • A weight can be specified for a query element by specifying a decimal value at the start of the modifiers. Example: "Important"2.5.

recoll-1.17.3/doc/user/rcl.search.anchorwild.html000644 001750 000000 00000013103 11754152276 022262 0ustar00dockeswheel000000 000000 Anchored searches and wildcards

3.5. 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.5.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:

  • * 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 before using wildcards.

  • 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.

  • 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.5.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.

recoll-1.17.3/doc/user/rcl.search.desktop.html000644 001750 000000 00000010520 11754152276 021601 0ustar00dockeswheel000000 000000 Desktop integration

3.6. Desktop integration

Being independant of the desktop type has its drawbacks: Recoll desktop integration is minimal. Here follow a few things that may help.

3.6.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.6.2. The KDE Kicker Recoll applet

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.

recoll-1.17.3/doc/user/rcl.program.html000644 001750 000000 00000024552 11754152276 020345 0ustar00dockeswheel000000 000000 Programming interface

Chapter 4. Programming interface

Table of Contents
4.1. Writing a document filter
4.2. Field data processing
4.3. API

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 filters for new types of documents.

The processing of metadata attributes for documents (fields) is highly configurable.

4.1. Writing a document filter

Recoll filters are executable programs which translate from a specific format (ie: openoffice, acrobat, etc.) to the Recoll indexing input format, which may be text/plain or text/html.

As of Recoll 1.13, there are two kinds of filters:

  • Simple filters (the old ones) run once and exit. They can be bare programs like antiword, or shell-scripts using other programs. They are very simple to write, just having to write the text to the standard output.

  • Multiple filters, new in 1.13, run as long as their master process (ie: recollindex) is active. They can process multiple files (sparing the process startup time which can be very significant), or multiple documents per file (ie: 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 these new filters are written in Python, using a common module to handle the protocol.

The following will just describe the simple filters. If you can program and want to write one of the other kind, it shouldn't be too difficult to make sense of one of the existing modules. For example, look at rclzip which uses Zip file paths as internal identifiers (ipath), and rclinfo, which uses an integer index.

4.1.1. Simple filters

Recoll simple filters 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 filter. In some cases the output of the translating program is completely appropriate, and no intermediate shell-script is needed.

Filters are called with a single argument which is the source file name. They should output the result to stdout.

When writing a filter, 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 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 filter if the operation is for indexing or previewing. Some filters 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 filters, for example rclps for a starting point.

Don't forget to make your filter executable before testing !

4.1.2. Telling Recoll about the filter

There are two elements that link a file to the filter which should process it: the association of file to mime type and the association of a mime type with a filter.

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 filters 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 filter. This is determined by the execm keyword.

4.1.3. Filter 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. "&" 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 nerver by those which output plain text.

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 also make use of other header fields if they are present: title, description, keywords.

Filters also have the possibility to "invent" field names. This should be output as meta tags:

<meta name="somefield" content="Some textual data" />

See the following section for details about configuring how field data is processed by the indexer.

recoll-1.17.3/doc/user/rcl.program.fields.html000644 001750 000000 00000007521 11754152276 021607 0ustar00dockeswheel000000 000000 Field data processing

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 filters as meta fields in the HTML header section, 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 filters, 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.

You can find more information in the section about the fields file, or in comments inside the file.

recoll-1.17.3/doc/user/rcl.program.api.html000644 001750 000000 00000035522 11754152276 021114 0ustar00dockeswheel000000 000000 API

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 Python interface is not built by default and can be found in the source package, under python/recoll.

In order to build the module, you should first build or re-build the Recoll library using position-independant objects:

  cd recoll-xxx/
  configure --enable-pic
  make
There is no significant disadvantage in using PIC objects for the main Recoll executables, so you can use the --enable-pic option for the main build too.

The python/recoll/ directory contains the usual setup.py script which you can then use to build and install the module:

  cd recoll-xxx/python/recoll
  python setup.py build
  python setup.py install

4.3.2.2. Interface manual

NAME
    recoll - This is an interface to the Recoll full text indexer.

FILE
    /usr/local/lib/python2.5/site-packages/recoll.so

CLASSES
        Db
        Doc
        Query
        SearchData
    
    class Db(__builtin__.object)
     |  Db([confdir=None], [extra_dbs=None], [writable = False])
     |  
     |  A Db object holds a connection to a Recoll index. Use the connect()
     |  function to create one.
     |  confdir specifies a Recoll configuration directory (default: 
     |   $RECOLL_CONFDIR or ~/.recoll).
     |  extra_dbs is a list of external databases (xapian directories)
     |  writable decides if we can index new data through this connection
     |  
     |  Methods defined here:
     |  
     |  
     |  addOrUpdate(...)
     |      addOrUpdate(udi, doc, parent_udi=None) -> None
     |      Add or update index data for a given document
     |      The udi string must define a unique id for the document. It is not
     |      interpreted inside Recoll
     |      doc is a Doc object
     |      if parent_udi is set, this is a unique identifier for the
     |      top-level container (ie mbox file)
     |  
     |  delete(...)
     |      delete(udi) -> Bool.
     |      Purge index from all data for udi. If udi matches a container
     |      document, purge all subdocs (docs with a parent_udi matching udi).
     |  
     |  makeDocAbstract(...)
     |      makeDocAbstract(Doc, Query) -> string
     |      Build and return 'keyword-in-context' abstract for document
     |      and query.
     |  
     |  needUpdate(...)
     |      needUpdate(udi, sig) -> Bool.
     |      Check if the index is up to date for the document defined by udi,
     |      having the current signature sig.
     |  
     |  purge(...)
     |      purge() -> Bool.
     |      Delete all documents that were not touched during the just finished
     |      indexing pass (since open-for-write). These are the documents for
     |      the needUpdate() call was not performed, indicating that they no
     |      longer exist in the primary storage system.
     |  
     |  query(...)
     |      query() -> Query. Return a new, blank query object for this index.
     |  
     |  setAbstractParams(...)
     |      setAbstractParams(maxchars, contextwords).
     |      Set the parameters used to build 'keyword-in-context' abstracts
     |  
     |  ----------------------------------------------------------------------
     |  Data and other attributes defined here:
     |  
    
    class Doc(__builtin__.object)
     |  Doc()
     |  
     |  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 no useful methods but
     |  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
     |  Predefined attributes (index/query/both):
     |   text (index): document plain text
     |   url (both)
     |   fbytes (both) optional) file size in bytes
     |   filename (both)
     |   fmtime (both) optional file modification date. Unix time printed 
     |      as string
     |   dbytes (both) document text bytes
     |   dmtime (both) document creation/modification date
     |   ipath (both) value private to the app.: internal access path
     |      inside file
     |   mtype (both) mime type for original document
     |   mtime (query) dmtime if set else fmtime
     |   origcharset (both) charset the text was converted from
     |   size (query) dbytes if set, else fbytes
     |   sig (both) app-defined file modification signature. 
     |      For up to date checks
     |   relevancyrating (query)
     |   abstract (both)
     |   author (both)
     |   title (both)
     |   keywords (both)
     |  
     |  Methods defined here:
     |  
     |  
     |  ----------------------------------------------------------------------
     |  Data and other attributes defined here:
     |  
    
    class Query(__builtin__.object)
     |  Recoll Query objects are used to execute index searches. 
     |  They must be created by the Db.query() method.
     |  
     |  Methods defined here:
     |  
     |  
     |  execute(...)
     |      execute(query_string, stemming=1|0)
     |      
     |      Starts a search for query_string, a Recoll search language string
     |      (mostly Xesam-compatible).
     |      The query can be a simple list of terms (and'ed by default), or more
     |      complicated with field specs etc. See the Recoll manual.
     |  
     |  executesd(...)
     |      executesd(SearchData)
     |      
     |      Starts a search for the query defined by the SearchData object.
     |  
     |  fetchone(...)
     |      fetchone(None) -> Doc
     |      
     |      Fetches the next Doc object in the current search results.
     |  
     |  sortby(...)
     |      sortby(field=fieldname, ascending=true)
     |      Sort results by 'fieldname', in ascending or descending order.
     |      Only one field can be used, no subsorts for now.
     |      Must be called before executing the search
     |  
     |  ----------------------------------------------------------------------
     |  Data descriptors defined here:
     |  
     |  next
     |      Next index to be fetched from results. Normally increments after
     |      each fetchone() call, but can be set/reset before the call effect
     |      seeking. Starts at 0
     |  
     |  ----------------------------------------------------------------------
     |  Data and other attributes defined here:
     |  
    
    class SearchData(__builtin__.object)
     |  SearchData()
     |  
     |  A SearchData object describes a query. It has a number of global
     |  parameters and a chain of search clauses.
     |  
     |  Methods defined here:
     |  
     |  
     |  addclause(...)
     |      addclause(type='and'|'or'|'excl'|'phrase'|'near'|'sub',
     |                qstring=string, slack=int, field=string, stemming=1|0,
     |                subSearch=SearchData)
     |      Adds a simple clause to the SearchData And/Or chain, or a subquery
     |      defined by another SearchData object
     |  
     |  ----------------------------------------------------------------------
     |  Data and other attributes defined here:
     |  

FUNCTIONS
    connect(...)
        connect([confdir=None], [extra_dbs=None], [writable = False])
                 -> Db.
        
        Connects to a Recoll database and returns a Db object.
        confdir specifies a Recoll configuration directory
        (the default is built like for any Recoll program).
        extra_dbs is a list of external databases (xapian directories)
        writable decides if we can index new data through this connection

4.3.2.3. 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.

#!/usr/bin/env python
import recoll

db = recoll.connect()
db.setAbstractParams(maxchars=80, contextwords=2)

query = db.query()
nres = query.execute("some user question")
print "Result count: ", nres
if nres > 5:
    nres = 5
while query.next >= 0 and query.next < nres: 
    doc = query.fetchone()
    print query.next
    for k in ("title", "size"):
        print k, ":", getattr(doc, k).encode('utf-8')
    abs = db.makeDocAbstract(doc, query).encode('utf-8')
    print abs
    print

recoll-1.17.3/doc/user/rcl.install.html000644 001750 000000 00000011775 11754152276 020347 0ustar00dockeswheel000000 000000 Installation and configuration

Chapter 5. Installation and configuration

5.1. Installing a binary copy

There are three types of binary Recoll installations:

  • Through your system normal software distribution framework (ie, Debian/Ubuntu apt, FreeBSD ports, etc.).

  • From a package downloaded from the Recoll web site.

  • From a prebuilt tree downloaded from the Recoll web site.

In all cases, the strict software dependancies (ie on Xapian or iconv) will be automatically satisfied, you should not have to worry about them.

You will only 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.1.1. Installing through a package system

If you use a BSD-type port system or a prebuilt package (DEB, RPM, manually or through the system software configuration utility), just follow the usual procedure for your system.

5.1.2. Installing a prebuilt Recoll

The unpackaged binary versions on the Recoll web site are just compressed tar files of a build tree, where only the useful parts were kept (executables and sample configuration).

The executable binary files are built with a static link to libxapian and libiconv, to make installation easier (no dependencies).

After extracting the tar file, you can proceed with installation as if you had built the package from source (that is, just type make install). The binary trees are built for installation to /usr/local.

recoll-1.17.3/doc/user/rcl.install.external.html000644 001750 000000 00000020505 11754152276 022157 0ustar00dockeswheel000000 000000 Supporting packages

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 filters 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 the Recoll helper applications page 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 the Recoll helper applications page 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 filter 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 the Xpdf or Poppler packages.

  • Postscript files need pstotext. The original version has an issue with shell character in file names, which is corrected in recent packages. See the the Recoll helper applications page 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 need catdoc.

  • 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 standard version, has much trouble with non-western character sets. Check the Recoll helper applications page.

  • TeX files need untex or detex. Check the Recoll helper applications page 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: Recoll releases before 1.13 used the id3info command from the id3lib package to extract mp3 tag information, metaflac (standard flac tools) for flac files, and ogginfo (vorbis tools) for ogg files. Releases 1.14 and later use a single Python filter based on mutagen for all audio file types.

  • 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.

  • chm: files in microsoft help format need Python and the pychm module (which needs chmlib).

  • 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.

  • 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 filter, 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 filters need iconv and the standard sed and awk.

recoll-1.17.3/doc/user/rcl.install.building.html000644 001750 000000 00000023356 11754152276 022141 0ustar00dockeswheel000000 000000 Building from source

5.3. Building from source

5.3.1. Prerequisites

C++ compiler. Up to Recoll version 1.13.04, its absence can manifest itself by strange messages about a missing iconv_open.

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.

Development files for Qt .

Development files for X11 and zlib.

Check the Recoll download page for up to date version information.

You will most probably be able to find a binary package for Qt for your system. You may have to compile Xapian but this is not difficult (if you are using FreeBSD, there is a port).

You may also need libiconv. Recoll currently uses version 1.9 (this should not be critical). On Linux systems, the iconv interface is part of libc and you should not need to do anything special.

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.

Depending on the Qt 3 configuration on your system, you may have to set the QTDIR and QMAKESPECS variables in your environment:

  • QTDIR should point to the directory above the one that holds the qt include files (ie: if qt.h is /usr/local/qt/include/qt.h, QTDIR should be /usr/local/qt).

  • QMAKESPECS should be set to the name of one of the Qt mkspecs sub-directories (ie: linux-g++).

On many Linux systems, QTDIR is set by the login scripts, and QMAKESPECS is not needed because there is a default link in mkspecs/.

Neither QTDIR nor QMAKESPECS should be needed with Qt 4, configuration details are entirely determined by qmake (which is quite often installed as qmake-qt4).

Configure options:

  • --without-aspell will disable the code for phonetic matching of search terms.

  • --with-fam or --with-inotify will enable the code for real time indexing. Inotify support is enabled by default on recent Linux systems.

  • --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.

  • --enable-xattr will enable code to fetch data from file extended attributes. This is only useful is some application stores data in there, and also needs some simple configuration (see comments in the fields configuration file).

  • --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).

  • --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.

  • --disable-qtgui Disable the Qt interface. Will allow building the indexer and the command line search program in absence of a Qt environment.

  • --disable-x11mon Disable X11 connection monitoring inside recollindex. Together with --disable-qtgui, this allows building recoll without Qt and X11.

  • 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.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.

recoll-1.17.3/doc/user/rcl.install.config.html000644 001750 000000 00000112146 11754152276 021605 0ustar00dockeswheel000000 000000 Configuration overview

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 define the parameters for one index.

The configuration files can be edited by hand or through the Indexing 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.

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.

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:

  • 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.

5.4.1. Main configuration file

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.1.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 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 recoll_noindex variable in mimemap for an alternative approach which indexes the file names.

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 and FNM_LEADING_DIR flags. 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).

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.

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).

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 use the 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 mimemap file). This can be useful for files with suffix-less names, but it will also cause the indexing of many bogus "text" files.

processbeaglequeue

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.

beaglequeuedir

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.

5.4.1.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.

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 =  åå Åå ää Ää öö Öö
            

Note that the translation is not limited to a single character, you could very well have something like üue in the list.

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 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.

5.4.1.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 Beagle 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 Beagle web browser plugin indexing code, and defines the maximum size for the web page cache. Default: 40 MB.

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 depends on average document size. The default value is 10.

5.4.1.4. Miscellaneous parameters:

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.

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.

filtermaxseconds

Maximum filter execution time, after which it is aborted. Some postscript programs just loop...

filtersdir

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 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.

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.

5.4.2. 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 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

filter-specific sections

Some filters may need specific configuration for handling fields. Only the email message filter 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 filter 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 = 

[mail]
# Extract the X-My-Tag mail header, and use it internally with the
# mailmytag field name
x-my-tag = mailmytag

5.4.3. 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.

mimemap also has a recoll_noindex variable which is a list of suffixes. Matching files will be skipped (which avoids unnecessary decompressions or file executions). This is partially redundant with skippedNames in the main configuration file, with a few differences: it will not affect directories, it cannot be made dependant on the file-system location (it is a configuration-wide parameter), and the file names will still be indexed (not even the file names are indexed for patterns in skippedNames. recoll_noindex is used mostly for things known to be unindexable by a given Recoll version. Having it there avoids cluttering the more user-oriented and locally customized skippedNames.

5.4.4. 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.5. 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 user preferences dialog.

If Use desktop preferences to choose document editor is checked in the Recoll GUI user preferences, all mimeview entries will be ignored except the one labelled application/x-all (which is set to use xdg-open by default).

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.

Please note that these 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).

  • %F. Original file name. Same as %f except if a temporary file is used.

  • %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.

  • %M. Mime type

  • %U, %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.6. Examples of configuration adjustments

5.4.6.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:

  • 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 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.6.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):

  • 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 filter 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 a filter.

recoll-1.17.3/doc/user/HTML.manifest000644 001750 000000 00000001025 11754152276 017513 0ustar00dockeswheel000000 000000 index.html rcl.introduction.html rcl.introduction.search.html rcl.introduction.recoll.html rcl.indexing.html rcl.indexing.storage.html rcl.indexing.config.html rcl.indexing.beaglequeue.html rcl.indexing.periodic.html rcl.indexing.monitor.html rcl.search.html rcl.searchkio.html rcl.search.commandline.html rcl.search.lang.html rcl.search.anchorwild.html rcl.search.desktop.html rcl.program.html rcl.program.fields.html rcl.program.api.html rcl.install.html rcl.install.external.html rcl.install.building.html rcl.install.config.html recoll-1.17.3/doc/prog/Doxyfile000644 001750 000000 00000141331 11740755063 016721 0ustar00dockeswheel000000 000000 # 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 recoll-1.17.3/doc/prog/Makefile000644 001750 000000 00000000077 11740755063 016654 0ustar00dockeswheel000000 000000 documentation: doxygen Doxyfile clean: rm -f docprog_html/* recoll-1.17.3/doc/prog/filters.txt000644 001750 000000 00000002752 11740755063 017427 0ustar00dockeswheel000000 000000 /*!@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. */ recoll-1.17.3/doc/prog/top.txt000644 001750 000000 00000001260 11740755063 016552 0ustar00dockeswheel000000 000000 /*!@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 */ recoll-1.17.3/doc/man/recoll.1000644 001750 000000 00000003150 11740755063 016355 0ustar00dockeswheel000000 000000 .\" $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 ] .SH DESCRIPTION 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. .SH SEE ALSO .PP recollindex(1) recollq(1) recoll.conf(5) recoll-1.17.3/doc/man/recoll.conf.5000644 001750 000000 00000020331 11740755063 017305 0ustar00dockeswheel000000 000000 .\" $Id: recoll.conf.5,v 1.5 2007-07-13 10:18:49 dockes Exp $ (C) 2005 J.F.Dockes\$ .TH RECOLL.CONF 5 "8 January 2006" .SH NAME recoll.conf \- main personal configuration file for Recoll .SH DESCRIPTION This file defines the indexation 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 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 indexaction 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 "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 "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. daemSkippedPaths can be used to define a specific value for the real time indexing monitor. .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 "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 "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 "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 "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 "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 "guesscharset = " boolean Try to guess the character set of files if no internal value is available (ie: for plain text files). This does not work well in general, and should probably not be used. .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 indexation of many bogus "text" files. .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 "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 indexation, or for all files inside the selected subtrees, independent of mime type. .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 "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. .SH SEE ALSO .PP recollindex(1) recoll(1) recoll-1.17.3/doc/man/recollindex.1000644 001750 000000 00000010524 11740755063 017410 0ustar00dockeswheel000000 000000 .\" $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 ] [ .B \-m ] [ .B \-w ] [ .B \-D ] [ .B \-x ] .br .B recollindex [ .B \-c ] .B \-i [ .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 .SH DESCRIPTION The .B recollindex utility allows you to perform indexing operations for the Recoll text search system. .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. .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. .PP .B recollindex \-l will list the names of available language stemmers. .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 .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). .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. .SH SEE ALSO .PP recoll(1) recoll.conf(5) recoll-1.17.3/doc/man/recollq.1000644 001750 000000 00000006240 11740755063 016541 0ustar00dockeswheel000000 000000 .\" $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) recoll-1.17.3/desktop/hotrecoll.py000755 001750 000000 00000004207 11740755063 017520 0ustar00dockeswheel000000 000000 #!/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() recoll-1.17.3/desktop/recoll-searchgui.desktop000644 001750 000000 00000000314 11740755063 021766 0ustar00dockeswheel000000 000000 [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 recoll-1.17.3/desktop/recoll.png000644 001750 000000 00000000711 11740755063 017132 0ustar00dockeswheel000000 000000 ‰PNG  IHDR00Ø`nÐ pHYs  šœtIME× §štEXtCommentCreated with The GIMPïd%n?IDATXÃcœr3}õÙ~ÿ-\²×t$¯iKá’µßKôÕg\²kÂqI11 2@‰ƒ™ƒþÿl!4Ø¢Œq4ʆZѰà)¾¸¾þz-Æ‹'ÊðèýÊÍÆ€[/Œ/špš¯Åx:ªá’Õºú\ëÊ3\²Õðx&dåÙ‘íG ÆÑ‚q4ʆf”1î[ëƒKîÓÑ«¿í¡M±ÿ h ¦k²Ìר_u\ÓÁÙ.þù\öã6kœZ?ë k›úÿh.#à ÆÁ–Ë]” ºtih4Ê/ÏpÀ%÷ŽKðŒœ.Yå7÷•ßÜÃ%ûPAø+7žæ/9|1vÉǸ$ù޾£÷š¶$ž6µ(îA•Ñ~ÙhWz4ÊF£l #ùÃÂÚ’xš¿1,<šËFsÙh”FUçyIÁÙÖIEND®B`‚recoll-1.17.3/desktop/recoll.xcf000644 001750 000000 00000007361 11740755063 017136 0ustar00dockeswheel000000 000000 gimp xcf file€€BBS gimp-commentCreated with The GIMPgimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) º€€ Backgroundÿ     i€€倀¯Á Ó”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è ”è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è” è”v%”v%”v%”v%”v%”v%”v%”v%”v%”v%”v%”v ”Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚ Ù‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù ‚Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv Ùf3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3 f3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f 3fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ f ”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è” è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”è ”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è” Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚Ù ‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù‚ Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚Ù f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3f 3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f3 f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3f”v%”v%”v%”v%”v%”v%”v%”v%”v%”v%”v%”v%”v%”v ”è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è” è”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è ”Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv%Ùv Ù‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù ‚Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚ ÙfÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ%fÛ f3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f 3f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3 f ”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è” è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”%è”è ”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è%”è” Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚Ù ‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù%‚Ù‚ Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚%Ù‚Ù f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3f 3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f%3f3 f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3%f3f@@recoll-1.17.3/desktop/recollindex.desktop000644 001750 000000 00000000540 11740755063 021047 0ustar00dockeswheel000000 000000 [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 recoll-1.17.3/desktop/unity-lens-recoll/000755 001750 000000 00000000000 11740755063 020532 5ustar00dockeswheel000000 000000 recoll-1.17.3/desktop/xdg-utils-1.0.1/000755 001750 000000 00000000000 11740755063 017520 5ustar00dockeswheel000000 000000 recoll-1.17.3/desktop/xdg-utils-1.0.1/LICENSE000644 001750 000000 00000002077 11740755063 020533 0ustar00dockeswheel000000 000000 # # 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. recoll-1.17.3/desktop/xdg-utils-1.0.1/scripts/000755 001750 000000 00000000000 11740755063 021207 5ustar00dockeswheel000000 000000 recoll-1.17.3/desktop/xdg-utils-1.0.1/scripts/xdg-desktop-menu000755 001750 000000 00000114214 11740755063 024333 0ustar00dockeswheel000000 000000 #!/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 recoll-1.17.3/desktop/xdg-utils-1.0.1/scripts/xdg-icon-resource000755 001750 000000 00000057114 11740755063 024502 0ustar00dockeswheel000000 000000 #!/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 recoll-1.17.3/desktop/xdg-utils-1.0.1/scripts/xdg-open000755 001750 000000 00000023623 11740755063 022664 0ustar00dockeswheel000000 000000 #!/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 recoll-1.17.3/desktop/unity-lens-recoll/AUTHORS000644 001750 000000 00000000142 11740755063 021577 0ustar00dockeswheel000000 000000 Original bliss apps lens Mikkel Kamstrup Erlandsen Recoll version: J.F. Dockes recoll-1.17.3/desktop/unity-lens-recoll/COPYING000644 001750 000000 00000104374 11740755063 021576 0ustar00dockeswheel000000 000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. 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 them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. 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 state 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 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program 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, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU 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 Lesser General Public License instead of this License. But first, please read . recoll-1.17.3/desktop/unity-lens-recoll/ChangeLog000644 001750 000000 00000007142 11740755063 022310 0ustar00dockeswheel000000 000000 changeset: 2631:ea84aedd25e0 parent: 2628:d1665b3a0e57 user: Jean-Francois Dockes date: Fri Mar 23 11:33:27 2012 +0100 files: src/desktop/unity-lens-recoll/bin/unity-recoll-daemon.in src/desktop/unity-lens-recoll/recollscope/rclsearch.py description: unity-lens-recoll with category filtering usable changeset: 2626:adb6eff2a9f6 user: Jean-Francois Dockes date: Fri Mar 23 08:58:34 2012 +0100 files: src/desktop/unity-lens-recoll/data/recollbg24.png description: none changeset: 2622:10162119234f user: Jean-Francois Dockes date: Fri Mar 23 07:29:53 2012 +0100 files: src/desktop/unity-lens-recoll/bin/unity-recoll-daemon.in src/desktop/unity-lens-recoll/recollscope/rclsearch.py description: removed debug traces changeset: 2621:859ec39916ec user: Jean-Francois Dockes date: Thu Mar 22 19:13:04 2012 +0100 files: src/desktop/unity-lens-recoll/Makefile.am src/desktop/unity-lens-recoll/Makefile.in src/desktop/unity-lens-recoll/README src/desktop/unity-lens-recoll/bin/unity-recoll-daemon.in src/desktop/unity-lens-recoll/data/recoll-lens.svg src/desktop/unity-lens-recoll/data/recoll.lens.in src/desktop/unity-lens-recoll/recollscope/rclsearch.py description: changed icon. Added filter code, but wont display changeset: 2620:44f1d9457b8c user: Jean-Francois Dockes date: Thu Mar 22 13:54:14 2012 +0100 files: src/desktop/unity-lens-recoll/bin/unity-recoll-daemon.in src/desktop/unity-lens-recoll/recollscope/rclsearch.py description: usable. Needs new svg icon changeset: 2619:8ae983a1c2b7 user: Jean-Francois Dockes date: Thu Mar 22 08:34:57 2012 +0100 files: src/desktop/unity-lens-recoll/Makefile.am src/desktop/unity-lens-recoll/Makefile.in src/desktop/unity-lens-recoll/bin/unity-recoll-daemon.in src/desktop/unity-lens-recoll/configure src/desktop/unity-lens-recoll/configure.ac src/desktop/unity-lens-recoll/data/recoll.lens.in src/desktop/unity-lens-recoll/data/unity-lens-recoll.menu.in src/desktop/unity-lens-recoll/data/unity-lens-recoll.service.in src/desktop/unity-lens-recoll/recoll/__init__.py src/desktop/unity-lens-recoll/recoll/rclsearch.py src/desktop/unity-lens-recoll/recollscope/__init__.py src/desktop/unity-lens-recoll/recollscope/rclsearch.py description: 1st raw version installable and searching changeset: 2618:35b76344948e parent: -1:000000000000 user: Jean-Francois Dockes date: Wed Mar 21 18:44:23 2012 +0100 files: src/desktop/unity-lens-recoll/AUTHORS src/desktop/unity-lens-recoll/COPYING src/desktop/unity-lens-recoll/ChangeLog src/desktop/unity-lens-recoll/INSTALL src/desktop/unity-lens-recoll/Makefile.am src/desktop/unity-lens-recoll/Makefile.in src/desktop/unity-lens-recoll/NEWS src/desktop/unity-lens-recoll/README src/desktop/unity-lens-recoll/acinclude.m4 src/desktop/unity-lens-recoll/aclocal.m4 src/desktop/unity-lens-recoll/bin/unity-recoll-daemon.in src/desktop/unity-lens-recoll/configure src/desktop/unity-lens-recoll/configure.ac src/desktop/unity-lens-recoll/data/recoll-lens.svg src/desktop/unity-lens-recoll/data/recoll.lens.in src/desktop/unity-lens-recoll/data/unity-lens-recoll.menu.in src/desktop/unity-lens-recoll/data/unity-lens-recoll.service.in src/desktop/unity-lens-recoll/install-sh src/desktop/unity-lens-recoll/missing src/desktop/unity-lens-recoll/py-compile src/desktop/unity-lens-recoll/recoll/__init__.py src/desktop/unity-lens-recoll/recoll/rclsearch.py description: initial version after renaming bliss things recoll-1.17.3/desktop/unity-lens-recoll/INSTALL000644 001750 000000 00000036332 11740755063 021572 0ustar00dockeswheel000000 000000 Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. recoll-1.17.3/desktop/unity-lens-recoll/Makefile.am000644 001750 000000 00000002674 11740755063 022577 0ustar00dockeswheel000000 000000 NULL = EXTRA_DIST = \ bin/unity-recoll-daemon.in \ data/recoll.lens.in \ data/recollbg24.png \ data/unity-lens-recoll.service.in \ $(docs_DATA) \ $(NULL) DISTCLEANFILES = DISTCHECK_CONFIGURE_FLAGS = ###################################################### # Documents ###################################################### docsdir = $(datadir)/doc/unity-lens-recoll docs_DATA = \ AUTHORS \ ChangeLog \ NEWS \ README \ $(NULL) ###################################################### # Lens code ###################################################### lensdir = $(datadir)/unity-lens-recoll/recollscope lens_PYTHON = \ recollscope/__init__.py \ recollscope/rclsearch.py \ $(NULL) daemondir = $(datadir)/unity-lens-recoll/ daemon_SCRIPTS = \ bin/unity-recoll-daemon \ $(NULL) ###################################################### # Unity .lens file ###################################################### dotlensdir = $(datadir)/unity/lenses/recoll dotlens_DATA = \ data/recoll.lens \ $(NULL) ###################################################### # Icons ###################################################### iconsdir = $(datadir)/unity-lens-recoll icons_DATA = \ data/recollbg24.png \ $(NULL) ###################################################### # DBus .service file ###################################################### dbusdir = $(datadir)/dbus-1/services dbus_DATA = \ data/unity-lens-recoll.service \ $(NULL) recoll-1.17.3/desktop/unity-lens-recoll/Makefile.in000644 001750 000000 00000056556 11740755063 022620 0ustar00dockeswheel000000 000000 # Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . DIST_COMMON = README $(am__configure_deps) $(lens_PYTHON) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/bin/unity-recoll-daemon.in \ $(top_srcdir)/configure $(top_srcdir)/data/recoll.lens.in \ $(top_srcdir)/data/unity-lens-recoll.service.in AUTHORS \ COPYING ChangeLog INSTALL NEWS install-sh missing py-compile ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = bin/unity-recoll-daemon data/recoll.lens \ data/unity-lens-recoll.service CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(daemondir)" "$(DESTDIR)$(lensdir)" \ "$(DESTDIR)$(dbusdir)" "$(DESTDIR)$(docsdir)" \ "$(DESTDIR)$(dotlensdir)" "$(DESTDIR)$(iconsdir)" SCRIPTS = $(daemon_SCRIPTS) SOURCES = DIST_SOURCES = py_compile = $(top_srcdir)/py-compile DATA = $(dbus_DATA) $(docs_DATA) $(dotlens_DATA) $(icons_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d "$(distdir)" \ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr "$(distdir)"; }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DATADIR = @DATADIR@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBEXECDIR = @LIBEXECDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PREFIX = @PREFIX@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ NULL = EXTRA_DIST = \ bin/unity-recoll-daemon.in \ data/recoll.lens.in \ data/recollbg24.png \ data/unity-lens-recoll.service.in \ $(docs_DATA) \ $(NULL) DISTCLEANFILES = DISTCHECK_CONFIGURE_FLAGS = ###################################################### # Documents ###################################################### docsdir = $(datadir)/doc/unity-lens-recoll docs_DATA = \ AUTHORS \ ChangeLog \ NEWS \ README \ $(NULL) ###################################################### # Lens code ###################################################### lensdir = $(datadir)/unity-lens-recoll/recollscope lens_PYTHON = \ recollscope/__init__.py \ recollscope/rclsearch.py \ $(NULL) daemondir = $(datadir)/unity-lens-recoll/ daemon_SCRIPTS = \ bin/unity-recoll-daemon \ $(NULL) ###################################################### # Unity .lens file ###################################################### dotlensdir = $(datadir)/unity/lenses/recoll dotlens_DATA = \ data/recoll.lens \ $(NULL) ###################################################### # Icons ###################################################### iconsdir = $(datadir)/unity-lens-recoll icons_DATA = \ data/recollbg24.png \ $(NULL) ###################################################### # DBus .service file ###################################################### dbusdir = $(datadir)/dbus-1/services dbus_DATA = \ data/unity-lens-recoll.service \ $(NULL) all: all-am .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): bin/unity-recoll-daemon: $(top_builddir)/config.status $(top_srcdir)/bin/unity-recoll-daemon.in cd $(top_builddir) && $(SHELL) ./config.status $@ data/recoll.lens: $(top_builddir)/config.status $(top_srcdir)/data/recoll.lens.in cd $(top_builddir) && $(SHELL) ./config.status $@ data/unity-lens-recoll.service: $(top_builddir)/config.status $(top_srcdir)/data/unity-lens-recoll.service.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-daemonSCRIPTS: $(daemon_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(daemondir)" || $(MKDIR_P) "$(DESTDIR)$(daemondir)" @list='$(daemon_SCRIPTS)'; test -n "$(daemondir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(daemondir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(daemondir)$$dir" || exit $$?; \ } \ ; done uninstall-daemonSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(daemon_SCRIPTS)'; test -n "$(daemondir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(daemondir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(daemondir)" && rm -f $$files install-lensPYTHON: $(lens_PYTHON) @$(NORMAL_INSTALL) test -z "$(lensdir)" || $(MKDIR_P) "$(DESTDIR)$(lensdir)" @list='$(lens_PYTHON)'; dlist=; list2=; test -n "$(lensdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ if test -f $$b$$p; then \ $(am__strip_dir) \ dlist="$$dlist $$f"; \ list2="$$list2 $$b$$p"; \ else :; fi; \ done; \ for file in $$list2; do echo $$file; done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(lensdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(lensdir)" || exit $$?; \ done || exit $$?; \ if test -n "$$dlist"; then \ if test -z "$(DESTDIR)"; then \ PYTHON=$(PYTHON) $(py_compile) --basedir "$(lensdir)" $$dlist; \ else \ PYTHON=$(PYTHON) $(py_compile) --destdir "$(DESTDIR)" --basedir "$(lensdir)" $$dlist; \ fi; \ else :; fi uninstall-lensPYTHON: @$(NORMAL_UNINSTALL) @list='$(lens_PYTHON)'; test -n "$(lensdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ filesc=`echo "$$files" | sed 's|$$|c|'`; \ fileso=`echo "$$files" | sed 's|$$|o|'`; \ echo " ( cd '$(DESTDIR)$(lensdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(lensdir)" && rm -f $$files || exit $$?; \ echo " ( cd '$(DESTDIR)$(lensdir)' && rm -f" $$filesc ")"; \ cd "$(DESTDIR)$(lensdir)" && rm -f $$filesc || exit $$?; \ echo " ( cd '$(DESTDIR)$(lensdir)' && rm -f" $$fileso ")"; \ cd "$(DESTDIR)$(lensdir)" && rm -f $$fileso install-dbusDATA: $(dbus_DATA) @$(NORMAL_INSTALL) test -z "$(dbusdir)" || $(MKDIR_P) "$(DESTDIR)$(dbusdir)" @list='$(dbus_DATA)'; test -n "$(dbusdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dbusdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dbusdir)" || exit $$?; \ done uninstall-dbusDATA: @$(NORMAL_UNINSTALL) @list='$(dbus_DATA)'; test -n "$(dbusdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(dbusdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(dbusdir)" && rm -f $$files install-docsDATA: $(docs_DATA) @$(NORMAL_INSTALL) test -z "$(docsdir)" || $(MKDIR_P) "$(DESTDIR)$(docsdir)" @list='$(docs_DATA)'; test -n "$(docsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docsdir)" || exit $$?; \ done uninstall-docsDATA: @$(NORMAL_UNINSTALL) @list='$(docs_DATA)'; test -n "$(docsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(docsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(docsdir)" && rm -f $$files install-dotlensDATA: $(dotlens_DATA) @$(NORMAL_INSTALL) test -z "$(dotlensdir)" || $(MKDIR_P) "$(DESTDIR)$(dotlensdir)" @list='$(dotlens_DATA)'; test -n "$(dotlensdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dotlensdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dotlensdir)" || exit $$?; \ done uninstall-dotlensDATA: @$(NORMAL_UNINSTALL) @list='$(dotlens_DATA)'; test -n "$(dotlensdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(dotlensdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(dotlensdir)" && rm -f $$files install-iconsDATA: $(icons_DATA) @$(NORMAL_INSTALL) test -z "$(iconsdir)" || $(MKDIR_P) "$(DESTDIR)$(iconsdir)" @list='$(icons_DATA)'; test -n "$(iconsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(iconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(iconsdir)" || exit $$?; \ done uninstall-iconsDATA: @$(NORMAL_UNINSTALL) @list='$(icons_DATA)'; test -n "$(iconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(iconsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(iconsdir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(daemondir)" "$(DESTDIR)$(lensdir)" "$(DESTDIR)$(dbusdir)" "$(DESTDIR)$(docsdir)" "$(DESTDIR)$(dotlensdir)" "$(DESTDIR)$(iconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-daemonSCRIPTS install-dbusDATA \ install-docsDATA install-dotlensDATA install-iconsDATA \ install-lensPYTHON install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-daemonSCRIPTS uninstall-dbusDATA \ uninstall-docsDATA uninstall-dotlensDATA uninstall-iconsDATA \ uninstall-lensPYTHON .MAKE: install-am install-strip .PHONY: all all-am am--refresh check check-am clean clean-generic dist \ dist-all dist-bzip2 dist-gzip dist-lzma dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-generic \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-daemonSCRIPTS \ install-data install-data-am install-dbusDATA install-docsDATA \ install-dotlensDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-iconsDATA \ install-info install-info-am install-lensPYTHON install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-daemonSCRIPTS uninstall-dbusDATA uninstall-docsDATA \ uninstall-dotlensDATA uninstall-iconsDATA uninstall-lensPYTHON # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: recoll-1.17.3/desktop/unity-lens-recoll/NEWS000644 001750 000000 00000000101 11740755063 021221 0ustar00dockeswheel000000 000000 2012-03-21: unity-lens-recoll cloned from unity-lens-bliss-0.1.3 recoll-1.17.3/desktop/unity-lens-recoll/README000644 001750 000000 00000002114 11754152170 021403 0ustar00dockeswheel000000 000000 ABOUT ----- unity-lens-recoll Work derived from: unity-lens-bliss, Copyright 2011, Canonical Ltd Authored by Mikkel Kamstrup Erlandsen Distribute under the terms of the GNU General Public License v3 Modifications by J.F. Dockes Copyright 2012, J.F. Dockes License as original work. unity-lens-bliss is is a very simple application launcher lens for Unity. Mostly meant to be used as a starting point for users wanting to write their own lens or customize this lens to their needs. unity-lens-recoll uses the starting point and replaces the search part with recoll queries. Install with: ./configure --prefix=/usr --sysconfdir=/etc && make && sudo make install RESOURCES --------- The source code is on bitbucket.org: http://bitbucket.org/medoc/recoll/src/ Look inside src/desktop/unity-lens-recoll Packages on the recoll PPA: https://launchpad.net/~recoll-backports/+archive/recoll-1.15-on Bugs should be reported on the bitbucket recoll issues tracker: https://bitbucket.org/medoc/recoll/issues recoll-1.17.3/desktop/unity-lens-recoll/acinclude.m4000644 001750 000000 00000001707 11740755063 022730 0ustar00dockeswheel000000 000000 dnl AS_AC_EXPAND(VAR, CONFIGURE_VAR) dnl dnl example dnl AS_AC_EXPAND(SYSCONFDIR, $sysconfdir) dnl will set SYSCONFDIR to /usr/local/etc if prefix=/usr/local AC_DEFUN([AS_AC_EXPAND], [ EXP_VAR=[$1] FROM_VAR=[$2] dnl first expand prefix and exec_prefix if necessary prefix_save=$prefix exec_prefix_save=$exec_prefix dnl if no prefix given, then use /usr/local, the default prefix if test "x$prefix" = "xNONE"; then prefix=$ac_default_prefix fi dnl if no exec_prefix given, then use prefix if test "x$exec_prefix" = "xNONE"; then exec_prefix=$prefix fi full_var="$FROM_VAR" dnl loop until it doesn't change anymore while true; do new_full_var="`eval echo $full_var`" if test "x$new_full_var"="x$full_var"; then break; fi full_var=$new_full_var done dnl clean up full_var=$new_full_var AC_SUBST([$1], "$full_var") dnl restore prefix and exec_prefix prefix=$prefix_save exec_prefix=$exec_prefix_save ]) recoll-1.17.3/desktop/unity-lens-recoll/aclocal.m4000644 001750 000000 00000073242 11740755063 022402 0ustar00dockeswheel000000 000000 # generated automatically by aclocal 1.11.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, [m4_warning([this file was generated for autoconf 2.68. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------------------------- # Adds support for distributing Python modules and packages. To # install modules, copy them to $(pythondir), using the python_PYTHON # automake variable. To install a package with the same name as the # automake package, install to $(pkgpythondir), or use the # pkgpython_PYTHON automake variable. # # The variables $(pyexecdir) and $(pkgpyexecdir) are provided as # locations to install python extension modules (shared libraries). # Another macro is required to find the appropriate flags to compile # extension modules. # # If your package is configured with a different prefix to python, # users will have to add the install directory to the PYTHONPATH # environment variable, or create a .pth file (see the python # documentation for details). # # If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will # cause an error if the version of python installed on the system # doesn't meet the requirement. MINIMUM-VERSION should consist of # numbers and dots only. AC_DEFUN([AM_PATH_PYTHON], [ dnl Find a Python interpreter. Python versions prior to 2.0 are not dnl supported. (2.0 was released on October 16, 2000). m4_define_default([_AM_PYTHON_INTERPRETER_LIST], [python python2 python3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 dnl python2.1 python2.0]) m4_if([$1],[],[ dnl No version check is needed. # Find any Python interpreter. if test -z "$PYTHON"; then AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) fi am_display_PYTHON=python ], [ dnl A version check is needed. if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. AC_MSG_CHECKING([whether $PYTHON version >= $1]) AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], [AC_MSG_RESULT(yes)], [AC_MSG_ERROR(too old)]) am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. AC_CACHE_CHECK([for a Python interpreter with version >= $1], [am_cv_pathless_PYTHON],[ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do test "$am_cv_pathless_PYTHON" = none && break AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) done]) # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) fi am_display_PYTHON=$am_cv_pathless_PYTHON fi ]) if test "$PYTHON" = :; then dnl Run any user-specified action, or abort. m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) else dnl Query Python for its version number. Getting [:3] seems to be dnl the best way to do this; it's what "site.py" does in the standard dnl library. AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) dnl Use the values of $prefix and $exec_prefix for the corresponding dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made dnl distinct variables so they can be overridden if need be. However, dnl general consensus is that you shouldn't need this ability. AC_SUBST([PYTHON_PREFIX], ['${prefix}']) AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) dnl At times (like when building shared libraries) you may want dnl to know which OS platform Python thinks this is. AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) dnl Set up 4 directories: dnl pythondir -- where to install python scripts. This is the dnl site-packages directory, not the python standard library dnl directory like in previous automake betas. This behavior dnl is more consistent with lispdir.m4 for example. dnl Query distutils for this directory. distutils does not exist in dnl Python 1.5, so we fall back to the hardcoded directory if it dnl doesn't work. AC_CACHE_CHECK([for $am_display_PYTHON script directory], [am_cv_python_pythondir], [if test "x$prefix" = xNONE then am_py_prefix=$ac_default_prefix else am_py_prefix=$prefix fi am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null || echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"` case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac ]) AC_SUBST([pythondir], [$am_cv_python_pythondir]) dnl pkgpythondir -- $PACKAGE directory under pythondir. Was dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is dnl more consistent with the rest of automake. AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) dnl pyexecdir -- directory for installing python extension modules dnl (shared libraries) dnl Query distutils for this directory. distutils does not exist in dnl Python 1.5, so we fall back to the hardcoded directory if it dnl doesn't work. AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], [am_cv_python_pyexecdir], [if test "x$exec_prefix" = xNONE then am_py_exec_prefix=$am_py_prefix else am_py_exec_prefix=$exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null || echo "$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages"` case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac ]) AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) dnl Run any user-specified action. $2 fi ]) # AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # --------------------------------------------------------------------------- # Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. # Run ACTION-IF-FALSE otherwise. # This test uses sys.hexversion instead of the string equivalent (first # word of sys.version), in order to cope with versions such as 2.2c1. # This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). AC_DEFUN([AM_PYTHON_CHECK_VERSION], [prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] sys.exit(sys.hexversion < minverhex)" AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([acinclude.m4]) recoll-1.17.3/desktop/unity-lens-recoll/bin/000755 001750 000000 00000000000 11740755063 021302 5ustar00dockeswheel000000 000000 recoll-1.17.3/desktop/unity-lens-recoll/configure000755 001750 000000 00000320335 11740755063 022447 0ustar00dockeswheel000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for unity-lens-recoll 0.1.1. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: https://www.recoll.org about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='unity-lens-recoll' PACKAGE_TARNAME='unity-lens-recoll' PACKAGE_VERSION='0.1.1' PACKAGE_STRING='unity-lens-recoll 0.1.1' PACKAGE_BUGREPORT='https://www.recoll.org' PACKAGE_URL='' ac_subst_vars='LTLIBOBJS LIBOBJS LIBEXECDIR DATADIR PREFIX pkgpyexecdir pyexecdir pkgpythondir pythondir PYTHON_PLATFORM PYTHON_EXEC_PREFIX PYTHON_PREFIX PYTHON_VERSION PYTHON am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures unity-lens-recoll 0.1.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/unity-lens-recoll] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of unity-lens-recoll 0.1.1:";; esac cat <<\_ACEOF Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF unity-lens-recoll configure 0.1.1 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by unity-lens-recoll $as_me 0.1.1, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='unity-lens-recoll' VERSION='0.1.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' # Find any Python interpreter. if test -z "$PYTHON"; then for ac_prog in python python2 python3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYTHON" && break done test -n "$PYTHON" || PYTHON=":" fi am_display_PYTHON=python if test "$PYTHON" = :; then as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 $as_echo_n "checking for $am_display_PYTHON version... " >&6; } if ${am_cv_python_version+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 $as_echo "$am_cv_python_version" >&6; } PYTHON_VERSION=$am_cv_python_version PYTHON_PREFIX='${prefix}' PYTHON_EXEC_PREFIX='${exec_prefix}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 $as_echo_n "checking for $am_display_PYTHON platform... " >&6; } if ${am_cv_python_platform+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 $as_echo "$am_cv_python_platform" >&6; } PYTHON_PLATFORM=$am_cv_python_platform { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5 $as_echo_n "checking for $am_display_PYTHON script directory... " >&6; } if ${am_cv_python_pythondir+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$prefix" = xNONE then am_py_prefix=$ac_default_prefix else am_py_prefix=$prefix fi am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null || echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"` case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 $as_echo "$am_cv_python_pythondir" >&6; } pythondir=$am_cv_python_pythondir pkgpythondir=\${pythondir}/$PACKAGE { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5 $as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; } if ${am_cv_python_pyexecdir+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$exec_prefix" = xNONE then am_py_exec_prefix=$am_py_prefix else am_py_exec_prefix=$exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null || echo "$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages"` case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 $as_echo "$am_cv_python_pyexecdir" >&6; } pyexecdir=$am_cv_python_pyexecdir pkgpyexecdir=\${pyexecdir}/$PACKAGE fi # Variables to escape in .in files EXP_VAR=PREFIX FROM_VAR=$prefix prefix_save=$prefix exec_prefix_save=$exec_prefix if test "x$prefix" = "xNONE"; then prefix=$ac_default_prefix fi if test "x$exec_prefix" = "xNONE"; then exec_prefix=$prefix fi full_var="$FROM_VAR" while true; do new_full_var="`eval echo $full_var`" if test "x$new_full_var"="x$full_var"; then break; fi full_var=$new_full_var done full_var=$new_full_var PREFIX="$full_var" prefix=$prefix_save exec_prefix=$exec_prefix_save EXP_VAR=DATADIR FROM_VAR=$datarootdir prefix_save=$prefix exec_prefix_save=$exec_prefix if test "x$prefix" = "xNONE"; then prefix=$ac_default_prefix fi if test "x$exec_prefix" = "xNONE"; then exec_prefix=$prefix fi full_var="$FROM_VAR" while true; do new_full_var="`eval echo $full_var`" if test "x$new_full_var"="x$full_var"; then break; fi full_var=$new_full_var done full_var=$new_full_var DATADIR="$full_var" prefix=$prefix_save exec_prefix=$exec_prefix_save EXP_VAR=LIBEXECDIR FROM_VAR=$libexecdir prefix_save=$prefix exec_prefix_save=$exec_prefix if test "x$prefix" = "xNONE"; then prefix=$ac_default_prefix fi if test "x$exec_prefix" = "xNONE"; then exec_prefix=$prefix fi full_var="$FROM_VAR" while true; do new_full_var="`eval echo $full_var`" if test "x$new_full_var"="x$full_var"; then break; fi full_var=$new_full_var done full_var=$new_full_var LIBEXECDIR="$full_var" prefix=$prefix_save exec_prefix=$exec_prefix_save ac_config_files="$ac_config_files bin/unity-recoll-daemon data/recoll.lens data/unity-lens-recoll.service Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by unity-lens-recoll $as_me 0.1.1, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ unity-lens-recoll config.status 0.1.1 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "bin/unity-recoll-daemon") CONFIG_FILES="$CONFIG_FILES bin/unity-recoll-daemon" ;; "data/recoll.lens") CONFIG_FILES="$CONFIG_FILES data/recoll.lens" ;; "data/unity-lens-recoll.service") CONFIG_FILES="$CONFIG_FILES data/unity-lens-recoll.service" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: unity-lens-recoll -------------------- Prefix : ${prefix} " >&5 $as_echo "$as_me: unity-lens-recoll -------------------- Prefix : ${prefix} " >&6;} recoll-1.17.3/desktop/unity-lens-recoll/configure.ac000644 001750 000000 00000001116 11740755063 023017 0ustar00dockeswheel000000 000000 # When releasing also remember to update the soname as instructed below AC_INIT(unity-lens-recoll, 0.1.1, https://www.recoll.org) AM_INIT_AUTOMAKE([subdir-objects]) AM_PATH_PYTHON AC_PREREQ(2.59) # Variables to escape in .in files AS_AC_EXPAND(PREFIX, $prefix) AC_SUBST(PREFIX) AS_AC_EXPAND(DATADIR, $datarootdir) AC_SUBST(DATADIR) AS_AC_EXPAND(LIBEXECDIR, $libexecdir) AC_SUBST(LIBEXECDIR) AC_OUTPUT([ bin/unity-recoll-daemon data/recoll.lens data/unity-lens-recoll.service Makefile ]) AC_MSG_NOTICE([ unity-lens-recoll -------------------- Prefix : ${prefix} ]) recoll-1.17.3/desktop/unity-lens-recoll/data/000755 001750 000000 00000000000 11740755063 021443 5ustar00dockeswheel000000 000000 recoll-1.17.3/desktop/unity-lens-recoll/install-sh000755 001750 000000 00000032537 11740755063 022550 0ustar00dockeswheel000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # 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 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: recoll-1.17.3/desktop/unity-lens-recoll/missing000755 001750 000000 00000026233 11740755063 022137 0ustar00dockeswheel000000 000000 #! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: recoll-1.17.3/desktop/unity-lens-recoll/mkdist.sh000644 001750 000000 00000001772 11740755063 022370 0ustar00dockeswheel000000 000000 #!/bin/sh fatal() { echo $* exit 1 } usage() { echo 'Usage: mkdist.sh ' exit 1 } VCCMD=hg TAR=/usr/bin/tar VRECOLL=`cat ../../VERSION` VLENS=`hg tip | egrep ^changeset: | awk '{print $2}' | awk -F: '{print $1}'` VERSION=${VRECOLL}.${VLENS} echo $VERSION targetdir=${targetdir-/tmp} checkmodified=${checkmodified-yes} editedfiles=`$VCCMD status . | egrep -v '^\?'` if test "$checkmodified" = "yes" -a ! -z "$editedfiles"; then fatal "Edited files exist: " $editedfiles fi releasename=recoll-lens-${VERSION} topdir=$targetdir/$releasename if test ! -d $topdir ; then mkdir $topdir || exit 1 else echo "Removing everything under $topdir Ok ? (y/n)" read rep if test $rep = 'y';then rm -rf $topdir/* fi fi # Clean up this dir and copy the dist-specific files make distclean yes | clean.O $TAR chfX - excludefile . | (cd $topdir;$TAR xf -) out=$releasename.tar.gz (cd $targetdir ; \ $TAR chf - $releasename | \ gzip > $out) echo "$targetdir/$out created" recoll-1.17.3/desktop/unity-lens-recoll/py-compile000755 001750 000000 00000010135 11740755063 022536 0ustar00dockeswheel000000 000000 #!/bin/sh # py-compile - Compile a Python program scriptversion=2009-04-28.21; # UTC # Copyright (C) 2000, 2001, 2003, 2004, 2005, 2008, 2009 Free Software # Foundation, Inc. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . if [ -z "$PYTHON" ]; then PYTHON=python fi basedir= destdir= files= while test $# -ne 0; do case "$1" in --basedir) basedir=$2 if test -z "$basedir"; then echo "$0: Missing argument to --basedir." 1>&2 exit 1 fi shift ;; --destdir) destdir=$2 if test -z "$destdir"; then echo "$0: Missing argument to --destdir." 1>&2 exit 1 fi shift ;; -h|--h*) cat <<\EOF Usage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..." Byte compile some python scripts FILES. Use --destdir to specify any leading directory path to the FILES that you don't want to include in the byte compiled file. Specify --basedir for any additional path information you do want to be shown in the byte compiled file. Example: py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py Report bugs to . EOF exit $? ;; -v|--v*) echo "py-compile $scriptversion" exit $? ;; *) files="$files $1" ;; esac shift done if test -z "$files"; then echo "$0: No files given. Try \`$0 --help' for more information." 1>&2 exit 1 fi # if basedir was given, then it should be prepended to filenames before # byte compilation. if [ -z "$basedir" ]; then pathtrans="path = file" else pathtrans="path = os.path.join('$basedir', file)" fi # if destdir was given, then it needs to be prepended to the filename to # byte compile but not go into the compiled file. if [ -z "$destdir" ]; then filetrans="filepath = path" else filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)" fi $PYTHON -c " import sys, os, py_compile files = '''$files''' sys.stdout.write('Byte-compiling python modules...\n') for file in files.split(): $pathtrans $filetrans if not os.path.exists(filepath) or not (len(filepath) >= 3 and filepath[-3:] == '.py'): continue sys.stdout.write(file) sys.stdout.flush() py_compile.compile(filepath, filepath + 'c', path) sys.stdout.write('\n')" || exit $? # this will fail for python < 1.5, but that doesn't matter ... $PYTHON -O -c " import sys, os, py_compile files = '''$files''' sys.stdout.write('Byte-compiling python modules (optimized versions) ...\n') for file in files.split(): $pathtrans $filetrans if not os.path.exists(filepath) or not (len(filepath) >= 3 and filepath[-3:] == '.py'): continue sys.stdout.write(file) sys.stdout.flush() py_compile.compile(filepath, filepath + 'o', path) sys.stdout.write('\n')" 2>/dev/null || : # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: recoll-1.17.3/desktop/unity-lens-recoll/recollscope/000755 001750 000000 00000000000 11740755063 023044 5ustar00dockeswheel000000 000000 recoll-1.17.3/desktop/unity-lens-recoll/recollscope/__init__.py000644 001750 000000 00000000000 11740755063 025143 0ustar00dockeswheel000000 000000 recoll-1.17.3/desktop/unity-lens-recoll/recollscope/rclsearch.py000755 001750 000000 00000026665 11754436630 025407 0ustar00dockeswheel000000 000000 import sys import subprocess import time import urllib import hashlib import os import locale from gi.repository import GLib, GObject, Gio from gi.repository import Dee from gi.repository import Unity import recoll BUS_PATH = "/org/recoll/unitylensrecoll/scope/main" # Thumbnails standard # 256x256 THMBDIRLARGE = "~/.thumbnails/large" # 128x128 THMBDIRNORMAL = "~/.thumbnails/normal" # Icon names for some recoll mime types which don't have standard icon by the # normal method SPEC_MIME_ICONS = {'application/x-fsdirectory' : 'gnome-fs-directory.svg', 'message/rfc822' : 'mail-read', 'application/x-recoll' : 'recoll'} # These category ids must match the order in which we add them to the lens CATEGORY_ALL = 0 # typing timeout: we don't want to start a search for every # char? Unity does batch on its side, but we may want more control ? # Or not ? I'm not sure this does any good on a moderate size index. # Set to 0 to not use it (default). Kept around because this still might be # useful with a very big index ? TYPING_TIMEOUT = 0 class Scope (Unity.Scope): def __init__ (self): Unity.Scope.__init__ (self, dbus_path=BUS_PATH) # Listen for changes and requests self.connect ("activate-uri", self.activate_uri) if Unity._version == "4.0": #print "Setting up for Unity 4.0" self.connect("notify::active-search", self._on_search_changed) self.connect("notify::active-global-search", self._on_global_search_changed) self.connect("filters-changed", self._on_search_changed); else: #print "Setting up for Unity 5.0+" self.connect ("search-changed", self._on_search_changed) self.connect ("filters-changed", self._on_filters_changed) self.last_connect_time = 0 self.timeout_id = None def _connect_db(self): #print "Connecting to db" self.db = None try: self.db = recoll.connect() self.db.setAbstractParams(maxchars=200, contextwords=4) except: return def get_search_string (self): search = self.props.active_search return search.props.search_string if search else None def get_global_search_string (self): search = self.props.active_global_search return search.props.search_string if search else None def search_finished (self): search = self.props.active_search if search: search.emit("finished") def global_search_finished (self): search = self.props.active_global_search if search: search.emit("finished") def reset (self): self._do_browse (self.props.results_model) self._do_browse (self.props.global_results_model) def _on_filters_changed (self, scope): #print "_on_filters_changed()" self.queue_search_changed(Unity.SearchType.DEFAULT) if Unity._version == "4.0": def _on_search_changed (self, scope, param_spec=None): search_string = self.get_search_string() results = scope.props.results_model #print "Search 4.0 changed to: '%s'" % search_string self._update_results_model (search_string, results) else: def _on_search_changed (self, scope, search, search_type, cancellable): search_string = search.props.search_string results = search.props.results_model #print "Search 5.0 changed to: '%s'" % search_string if search_string: self._update_results_model (search_string, results) else: search.props.results_model.clear() def _on_global_search_changed (self, scope, param_spec): search = self.get_global_search_string() results = scope.props.global_results_model #print "Global search changed to: '%s'" % search self._update_results_model (search, results) def _update_results_model (self, search_string, model): if search_string: self._do_search (search_string, model) else: self._do_browse (model) def _do_browse (self, model): if self.timeout_id is not None: GObject.source_remove(self.timeout_id) model.clear () if model is self.props.results_model: self.search_finished() else: self.global_search_finished() def _on_timeout(self, search_string, model): if self.timeout_id is not None: GObject.source_remove(self.timeout_id) self.timeout_id = None self._really_do_search(search_string, model) if model is self.props.results_model: self.search_finished() else: self.global_search_finished() def _do_search (self, search_string, model): if TYPING_TIMEOUT == 0: self._really_do_search(search_string, model) return True if self.timeout_id is not None: GObject.source_remove(self.timeout_id) self.timeout_id = \ GObject.timeout_add(TYPING_TIMEOUT, self._on_timeout, search_string, model) def _get_thumbnail_path(self, url): """Look for a thumbnail for the input url, according to the freedesktop thumbnail storage standard. The input 'url' always begins with file:// and is unencoded. We encode it properly and compute the path inside the thumbnail storage directory. We return the path only if the thumbnail does exist (no generation performed)""" path = url path = path.replace("file://", "", 1) try: path = "file://" + urllib.quote(path) except: #print "_get_thumbnail_path: quote failed" return None #print "_get_thumbnail: encoded path: [%s]" % (path,) thumbname = hashlib.md5(path).hexdigest() + ".png" #print "_get_thumbnail: thumbname: [%s]" % (thumbname,) tpath = os.path.join(os.path.expanduser(THMBDIRNORMAL), thumbname) if os.path.exists(tpath): return tpath tpath = os.path.join(os.path.expanduser(THMBDIRLARGE), thumbname) if os.path.exists(tpath): return tpath return None def _really_do_search(self, search_string, model): #print "really_do_search:", "[" + search_string + "]" model.clear () if search_string == "": return True current_time = time.time() if current_time - self.last_connect_time > 10: self._connect_db() self.last_connect_time = current_time if not self.db: model.append ("", "error", CATEGORY_ALL, "text/plain", "You need to use the recoll GUI to create the index first !", "", "") return fcat = self.get_filter("rclcat") for option in fcat.options: if option.props.active: search_string += " rclcat:" + option.props.id # Do the recoll thing try: query = self.db.query() nres = query.execute(search_string) except: return actual_results = 0 while query.next >= 0 and query.next < nres: try: doc = query.fetchone() except: break # Results with an ipath get a special mime type so that they # get opened by starting a recoll instance. thumbnail = None if doc.ipath != "": mimetype = "application/x-recoll" url = doc.url + "#" + doc.ipath else: mimetype = doc.mimetype url = doc.url # doc.url is a unicode string which is badly wrong. A # future version of the pyrecoll module will have a # separate method to retrieve the binary # version. Until this happens, try to encode # back. This won't work every time (ie: if the # original path could not be translated to unicode by # pyrecoll, or if the unicode can't be translated back # in the current locale) encoding = locale.nl_langinfo(locale.CODESET) thumbnail = \ self._get_thumbnail_path(url.encode(encoding, errors='replace')) #print "Recoll Lens: Using MIMETYPE", mimetype, " URL", url titleorfilename = doc.title if titleorfilename == "": titleorfilename = doc.filename iconname = None if thumbnail: iconname = thumbnail else: if SPEC_MIME_ICONS.has_key(doc.mimetype): iconname = SPEC_MIME_ICONS[doc.mimetype] else: icon = Gio.content_type_get_icon(doc.mimetype) if icon: iconname = icon.get_names()[0] #print "iconname:", iconname try: abstract = self.db.makeDocAbstract(doc, query).encode('utf-8') except: break model.append (url, iconname, CATEGORY_ALL, mimetype, titleorfilename, abstract, doc.url) actual_results += 1 if actual_results >= 20: break # If we return from here, the caller gets an error: # Warning: g_object_get_qdata: assertion `G_IS_OBJECT (object)' failed # Known bug, see: # https://bugs.launchpad.net/unity/+bug/893688 # Then, the default url activation takes place # which is not at all what we want. # First workaround: # In the recoll case, we just exit, the lens will be restarted. # In the regular case, we return, and activation works exactly once for # 2 calls on oneiric and mostly for precise... # New workaround, suggested somewhere on the net and kept: other # construction method def activate_uri (self, scope, uri): """Activation handler for uri""" #print "Activate: %s" % uri # Pass all uri without fragments to the desktop handler if uri.find("#") == -1: # Reset browsing state when an app is launched if Unity._version == "4.0": self.reset () ret = Unity.ActivationResponse(handled=Unity.HandledType.NOT_HANDLED, goto_uri=uri) return ret # Pass all others to recoll proc = subprocess.Popen(["recoll", uri]) #print "Subprocess returned, going back to unity" scope.props.results_model.clear(); scope.props.global_results_model.clear(); # Old workaround: #sys.exit(0) # New and better: # The goto_uri thing is a workaround suggested somewhere instead of # passing the string. Does fix the issue #return Unity.ActivationResponse.new(Unity.HandledType.HIDE_DASH,'' ret = Unity.ActivationResponse(handled=Unity.HandledType.HIDE_DASH, goto_uri='') return ret recoll-1.17.3/desktop/unity-lens-recoll/data/recoll.lens.in000644 001750 000000 00000000437 11740755063 024217 0ustar00dockeswheel000000 000000 [Lens] DBusName=org.recoll.UnityLensRecoll.Lens DBusPath=/org/recoll/unitylensrecoll/lens Name=Recoll Lens Icon=@DATADIR@/unity-lens-recoll/recollbg24.png Description=Search documents indexed by Recoll SearchHint=Type to search [Desktop Entry] X-Ubuntu-Gettext-Domain=unity-lens-recoll recoll-1.17.3/desktop/unity-lens-recoll/data/recollbg24.png000644 001750 000000 00000001060 11740755063 024105 0ustar00dockeswheel000000 000000 ‰PNG  IHDRoª¯sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIME܇ŒXi!iTXtCommentCreated with The GIMPm°—ƒIDAT8ËÍT±Š1MÂu~¥Í²–~Œ­Öþ¥Ø [˜¸`¡„ˆ!Ån2Ù\n¼óánª¥¤µæœcÁb±ˆ1æ³µÖZ‹)¾Ùlh/ƒÁ›_¯×½^ájµÚívhYY–Ãáð¦@& !`iŒ±m[$”“áÝÝÿ7Ùô÷Çûý>š}¹\N§vªµ:ÙMÓ܈èfpÎÇcÈív{½^јL&˜UJ}5ÙœsúÞt¬SJ!„_NököQ×uTÝ7fÓuiŒ‘R¢fkíh4Â^Œ1J)Ú½{G”-Äóù|.Ë·JÓ44ûƒýÉΰ³Ÿwš1ö 8.žêšIEND®B`‚recoll-1.17.3/desktop/unity-lens-recoll/data/unity-lens-recoll.service.in000644 001750 000000 00000000152 11740755063 027015 0ustar00dockeswheel000000 000000 [D-BUS Service] Name=org.recoll.UnityLensRecoll.Lens Exec=@DATADIR@/unity-lens-recoll/unity-recoll-daemon recoll-1.17.3/desktop/unity-lens-recoll/bin/unity-recoll-daemon.in000755 001750 000000 00000006505 11740755063 025532 0ustar00dockeswheel000000 000000 #! /usr/bin/python # Set Python path up to load from the source code dir if we're running out # of the source tree, otherwise point at the installed code import sys, os execpath = os.path.dirname(__file__) if os.path.isfile(os.path.join(execpath, "..", "configure.ac")): print "Running from source tree" sys.path.insert (0, os.path.join(execpath, "..")) else: sys.path.insert (0, os.path.join("@DATADIR@", "unity-lens-recoll")) del execpath import recollscope.rclsearch from gi.repository import GLib, GObject, Gio # NOTE: If we used the normal 'dbus' module for Python we'll get # slightly odd results because it uses a default connection # to the session bus that is different from the default connection # GDBus (hence libunity) will use. Meaning that the daemon name # will be owned by a connection different from the one all our # Dee + Unity magic is working on... # Still waiting for nice GDBus bindings to land: # http://www.piware.de/2011/01/na-zdravi-pygi/ # # The primary bus name we grab *must* match what we specify in our .lens file # BUS_NAME = "org.recoll.UnityLensRecoll.Lens" session_bus_connection = Gio.bus_get_sync (Gio.BusType.SESSION, None) session_bus = Gio.DBusProxy.new_sync (session_bus_connection, 0, None, 'org.freedesktop.DBus', '/org/freedesktop/DBus', 'org.freedesktop.DBus', None) result = session_bus.call_sync('RequestName', GLib.Variant ("(su)", (BUS_NAME, 0x4)), 0, -1, None) # Unpack variant response with signature "(u)". 1 means we got it. result = result.unpack()[0] if result != 1 : print >> sys.stderr, "Failed to own name %s. Bailing out." % BUS_NAME raise SystemExit (1) def create_lens (): # The path for the Lens *must* also match the one in our .lens file from gi.repository import Unity lens = Unity.Lens.new ("/org/recoll/unitylensrecoll/lens", "recoll") lens.props.search_hint = "Recoll search string" lens.props.visible = True; lens.props.search_in_global = False; # Populate categories cats = [] cats.append (Unity.Category.new ("Documents", Gio.ThemedIcon.new("document"), Unity.CategoryRenderer.HORIZONTAL_TILE)) lens.props.categories = cats # Populate filters filters = [] # We should get the categories from the config but the python # module currently has no code for this. CheckOption or RadioOption? filter = Unity.RadioOptionFilter.new("rclcat", "Category", Gio.ThemedIcon.new("input-keyboard-symbolic"), False) filter.add_option("text", "Text", None); filter.add_option("spreadsheet", "Spreadsheet", None); filter.add_option("presentation", "Presentation", None); filter.add_option("media", "Media", None); filter.add_option("message", "Message", None); filter.add_option("other", "Other", None); filters.append(filter) lens.props.filters = filters return lens lens = create_lens () lens.add_local_scope (recollscope.rclsearch.Scope()) # add more local scopes here (remote dbus scopes added automagically) lens.export () GObject.MainLoop().run() recoll-1.17.3/common/Makefile000644 001750 000000 00000002047 11740755063 016427 0ustar00dockeswheel000000 000000 # @(#$Id: Makefile,v 1.16 2008-12-17 14:26:49 dockes Exp $ (C) 2005 J.F.Dockes depth = .. include $(depth)/mk/sysconf # Only test executables get build in here PROGS = unacpp textsplit rclconfig all: $(BIGLIB) $(PROGS) $(BIGLIB): force cd $(depth)/lib;$(MAKE) force: UNACPP_OBJS= trunacpp.o $(BIGLIB) unacpp : $(UNACPP_OBJS) $(CXX) $(ALL_CXXFLAGS) -o unacpp $(UNACPP_OBJS) \ $(LIBICONV) trunacpp.o : unacpp.cpp unacpp.h $(CXX) $(ALL_CXXFLAGS) -DTEST_UNACPP -c -o trunacpp.o unacpp.cpp TEXTSPLIT_OBJS= trtextsplit.o $(BIGLIB) textsplit : $(TEXTSPLIT_OBJS) $(CXX) $(ALL_CXXFLAGS) -o textsplit $(TEXTSPLIT_OBJS) $(LIBICONV) trtextsplit.o : textsplit.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_TEXTSPLIT -c -o trtextsplit.o \ textsplit.cpp RCLCONFIG_OBJS= trrclconfig.o $(BIGLIB) rclconfig : $(RCLCONFIG_OBJS) $(CXX) $(ALL_CXXFLAGS) -o rclconfig $(RCLCONFIG_OBJS) \ $(LIBICONV) $(LIBSYS) trrclconfig.o : rclconfig.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_RCLCONFIG -c -o trrclconfig.o \ rclconfig.cpp clean: rm -f *.o $(PROGS) recoll-1.17.3/common/autoconfig.h.in000644 001750 000000 00000005610 11740755063 017702 0ustar00dockeswheel000000 000000 /* common/autoconfig.h.in. Generated from configure.ac by autoheader. */ /* 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 /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* 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 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_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 /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* 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 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 /* Use file extended attributes */ #undef RCL_USE_XATTR /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Enable using the system's 'file' command to id mime if we fail internally */ #undef USE_SYSTEM_FILE_COMMAND /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING #undef _FILE_OFFSET_BITS #undef _LARGE_FILES /* The __FreeBSD_kernel__ thing is for debian/kfreebsd. */ #if _FILE_OFFSET_BITS == 64 || defined(__APPLE__) || defined(__OpenBSD__) ||\ defined(__FreeBSD_kernel__) #define OFFTPC "%lld" #else #define OFFTPC "%ld" #endif recoll-1.17.3/common/beaglequeuecache.cpp000644 001750 000000 00000004756 11740755063 020754 0ustar00dockeswheel000000 000000 /* 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 (ccdir.at(0) != '/') ccdir = path_cat(cnf->getConfDir(), ccdir); int maxmbs = 40; cnf->getConfParam("webcachemaxmbs", &maxmbs); m_cache = new CirCache(ccdir); m_cache->create(off_t(maxmbs)*1000*1024, CirCache::CC_CRUNIQUE); } 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->get(udi, dict, data)) 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(); list names = cf.getNames(cstr_null); for (list::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; } recoll-1.17.3/common/beaglequeuecache.h000644 001750 000000 00000003066 11740755063 020412 0ustar00dockeswheel000000 000000 /* 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_ */ recoll-1.17.3/common/cstr.cpp000644 001750 000000 00000000132 11740755063 016437 0ustar00dockeswheel000000 000000 #include "cstr.h" #define RCLIN_CSTR_CPPFILE #undef _CSTR_H_INCLUDED_ #include "cstr.h" recoll-1.17.3/common/cstr.h000644 001750 000000 00000005412 11740755063 016112 0ustar00dockeswheel000000 000000 /* 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(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(minwilds, "*?["); DEF_CSTR(newline, "\n"); DEF_CSTR(null, ""); DEF_CSTR(plus, "+"); DEF_CSTR(textplain, "text/plain"); DEF_CSTR(url, "url"); // 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"); #endif /* _CSTR_H_INCLUDED_ */ recoll-1.17.3/common/rclconfig.cpp000644 001750 000000 00000106745 11740755063 017453 0ustar00dockeswheel000000 000000 /* 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 #include #include #include #include #include #include #include #include #include #ifdef __FreeBSD__ #include #endif #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" #ifndef NO_NAMESPACES using namespace std; #endif /* NO_NAMESPACES */ #ifndef MIN #define MIN(A,B) (((A)<(B)) ? (A) : (B)) #endif #ifndef MAX #define MAX(A,B) (((A)>(B)) ? (A) : (B)) #endif bool ParamStale::needrecompute() { LOGDEB2(("ParamStale:: needrecompute. parent gen %d mine %d\n", parent->m_keydirgen, savedkeydirgen)); if (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(RclConfig *rconf, ConfNull *cnf, const string& nm) { parent = rconf; conffile = cnf; paramname = nm; savedkeydirgen = -1; } void RclConfig::zeroMe() { m_ok = false; m_keydirgen = 0; m_conf = 0; mimemap = 0; mimeconf = 0; mimeview = 0; m_fields = 0; m_stopsuffixes = 0; m_maxsufflen = 0; m_stpsuffstate.init(this, 0, "recoll_noindex"); m_skpnstate.init(this, 0, "skippedNames"); m_rmtstate.init(this, 0, "indexedmimetypes"); } bool RclConfig::isDefaultConfig() { string defaultconf = path_cat(path_canon(path_home()), ".recoll/"); string specifiedconf = path_canon(m_confdir); path_catslash(specifiedconf); return !defaultconf.compare(specifiedconf); } RclConfig::RclConfig(const string *argcnf) { zeroMe(); // Compute our data dir name, typically /usr/local/share/recoll const char *cdatadir = getenv("RECOLL_DATADIR"); if (cdatadir == 0) { // If not in environment, use the compiled-in constant. m_datadir = RECOLL_DATADIR; } else { m_datadir = cdatadir; } // 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 = cp; } else { autoconfdir = true; m_confdir = path_cat(path_home(), ".recoll/"); } } // 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 (access(m_confdir.c_str(), 0) < 0) { m_reason = "Explicitly specified configuration " "directory must exist" " (won't be automatically created). Use mkdir first"; return; } } if (access(m_confdir.c_str(), 0) < 0) { if (!initUserConfig()) return; } m_cdirs.push_back(m_confdir); m_cdirs.push_back(path_cat(m_datadir, "examples")); string cnferrloc = m_confdir + " or " + path_cat(m_datadir, "examples"); // 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, true); if (mimeview == 0 || !mimeview->ok()) { m_reason = string("No/bad mimeview in: ") + cnferrloc; return; } if (!readFieldsConfig(cnferrloc)) return; m_ok = true; setKeyDir(cstr_null); m_stpsuffstate.init(this, mimemap, "recoll_noindex"); m_skpnstate.init(this, m_conf, "skippedNames"); m_rmtstate.init(this, m_conf, "indexedmimetypes"); 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(this, 0, "skippedNames"); m_rmtstate.init(this, 0, "indexedmimetypes"); return false; } delete m_conf; m_conf = newconf; m_skpnstate.init(this, m_conf, "skippedNames"); m_rmtstate.init(this, m_conf, "indexedmimetypes"); setKeyDir(cstr_null); bool nocjk = false; if (getConfParam("nocjk", &nocjk) && nocjk == true) { TextSplit::cjkProcessing(false); } else { int ngramlen; if (getConfParam("cjkngramlen", &ngramlen)) { TextSplit::cjkProcessing(true, (unsigned int)ngramlen); } else { TextSplit::cjkProcessing(true); } } bool nonum = false; if (getConfParam("nonumbers", &nonum) && nonum == true) { TextSplit::noNumbers(); } bool fnmpathname = true; if (getConfParam("skippedPathsFnmPathname", &fnmpathname) && fnmpathname == false) { FsTreeWalker::setNoFnmPathname(); } 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", defcharset, m_keydir)) defcharset.erase(); } bool RclConfig::getConfParam(const string &name, int *ivp) { string value; if (!getConfParam(name, value)) 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) { if (!bvp) return false; *bvp = false; string s; if (!getConfParam(name, s)) return false; *bvp = stringToBool(s); return true; } bool RclConfig::getConfParam(const string &name, vector *svvp) { if (!svvp) return false; svvp->clear(); string s; if (!getConfParam(name, s)) return false; return stringToStrings(s, *svvp); } bool RclConfig::getConfParam(const string &name, list *svvp) { if (!svvp) return false; svvp->clear(); string s; if (!getConfParam(name, s)) return false; return stringToStrings(s, *svvp); } list RclConfig::getTopdirs() { list tdl; if (!getConfParam("topdirs", &tdl)) { LOGERR(("RclConfig::getTopdirs: no top directories in config or bad list format\n")); return tdl; } for (list::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 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) { // 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 calling // getDefCharset from recollinit static string localecharset; if (localecharset.empty()) { 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 ) { localecharset = string(cp); } else { // Note: it seems that all versions of iconv will take // iso-8859. Some won't take iso8859 localecharset = string(cstr_iso_8859_1); } LOGDEB1(("RclConfig::getDefCharset: localecharset [%s]\n", localecharset.c_str())); } if (defcharset.empty()) { defcharset = localecharset; } if (filename) { return localecharset; } else { return defcharset; } } bool RclConfig::addLocalFields(map *tgt) { LOGDEB0(("RclConfig::addLocalFields: keydir [%s]\n", m_keydir.c_str())); string sfields; if (tgt == 0 || ! getConfParam("localfields", sfields)) return false; // Substitute ':' with '\n' inside the string. There is no way to escape ':' for (string::size_type i = 0; i < sfields.size(); i++) if (sfields[i] == ':') sfields[i] = '\n'; // Parse the result with a confsimple and add the results to the metadata ConfSimple conf(sfields, 1, true); list nmlst = conf.getNames(cstr_null); for (list::const_iterator it = nmlst.begin(); it != nmlst.end(); it++) { conf.get(*it, (*tgt)[*it]); LOGDEB(("RclConfig::addLocalFields: [%s] => [%s]\n", (*it).c_str(), (*tgt)[*it].c_str())); } return true; } // 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. list RclConfig::getAllMimeTypes() { list lst; if (mimeconf == 0) return lst; lst = mimeconf->getNames("index"); lst.sort(); lst.unique(); return lst; } // 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: needrecompute() needs to be called always. 2nd test stays back. if (m_stpsuffstate.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; } list stoplist; stringToStrings(m_stpsuffstate.savedvalue, stoplist); for (list::const_iterator it = stoplist.begin(); it != stoplist.end(); it++) { STOPSUFFIXES->insert(SfString(stringtolower(*it))); if (m_maxsufflen < it->length()) m_maxsufflen = 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) { string mtype; mimemap->get(suff, mtype, m_keydir); return mtype; } string RclConfig::getSuffixFromMimeType(const string &mt) { string suffix; listsfs = mimemap->getNames(cstr_null); string mt1; for (list::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(list& cats) { if (!mimeconf) return false; cats = mimeconf->getNames("categories"); return true; } bool RclConfig::isMimeCategory(string& cat) { listcats; getMimeCategories(cats); for (list::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, list& tps) { 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 && m_rmtstate.needrecompute()) { m_restrictMTypes.clear(); stringToStrings(stringtolower((const string&)m_rmtstate.savedvalue), m_restrictMTypes); } if (filtertypes && !m_restrictMTypes.empty()) { string mt = mtype; stringtolower(mt); if (m_restrictMTypes.find(mt) == m_restrictMTypes.end()) return hs; } if (!mimeconf->get(mtype, hs, "index")) { LOGDEB1(("getMimeHandler: no handler for '%s'\n", mtype.c_str())); } return hs; } bool RclConfig::getGuiFilterNames(list& cats) { if (!mimeconf) return false; cats = mimeconf->getNamesShallow("guifilters"); return true; } bool RclConfig::getGuiFilter(const string& catfiltername, string& frag) { 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 = ConfSimple(attrstr); } return true; } string RclConfig::getMissingHelperDesc() { string fmiss = path_cat(getConfDir(), "missing"); string out; file_to_string(fmiss, out); return out; } 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 listtps = m_fields->getNames("prefixes"); for (list::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()); 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 an 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 (list::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"); list l; stringToStrings(aliases, l); for (list::const_iterator ait = l.begin(); ait != l.end(); ait++) { if (pit != m_fldtotraits.end()) m_fldtotraits[stringtolower(*ait)] = ft; m_aliastocanon[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 list sl = m_fields->getNames("stored"); if (!sl.empty()) { for (list::const_iterator it = sl.begin(); it != sl.end(); it++) { string fld = fieldCanon(stringtolower(*it)); m_storedFields.insert(fld); } } // Extended file attribute to field translations listxattrs = m_fields->getNames("xattrtofields"); for (list::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) { string 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(), ft.pfx.c_str())); return true; } else { LOGDEB1(("RclConfig::readFieldsConfig: no prefix for field [%s]\n", fld.c_str())); *ftpp = 0; return false; } } set RclConfig::getIndexedFields() { set flds; if (m_fields == 0) return flds; list sl = m_fields->getNames("prefixes"); flds.insert(sl.begin(), sl.end()); return flds; } string RclConfig::fieldCanon(const string& f) { 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; } list RclConfig::getFieldSectNames(const string &sk, const char* patrn) { if (m_fields == 0) return list(); return m_fields->getNames(sk, patrn); } bool RclConfig::getFieldConfParam(const string &name, const string &sk, string &value) { if (m_fields == 0) return false; return m_fields->get(name, value, sk); } string RclConfig::getMimeViewerDef(const string &mtype, const string& apptag) { LOGDEB2(("RclConfig::getMimeViewerDef: mtype [%s] apptag [%s]\n", mtype.c_str(), apptag.c_str())); string hs; if (mimeview == 0) return hs; if (apptag.empty() || !mimeview->get(mtype + string("|") + apptag, hs, "view")) mimeview->get(mtype, hs, "view"); return hs; } bool RclConfig::getMimeViewerDefs(vector >& defs) { if (mimeview == 0) return false; listtps = mimeview->getNames("view"); for (list::const_iterator it = tps.begin(); it != tps.end();it++) { defs.push_back(pair(*it, getMimeViewerDef(*it, ""))); } return true; } bool RclConfig::setMimeViewerDef(const string& mt, const string& def) { if (mimeview == 0) return false; string pconfname = path_cat(getConfDir(), "mimeview"); // Make sure this exists close(open(pconfname.c_str(), O_CREAT|O_WRONLY, 0600)); ConfTree tree(pconfname.c_str()); if (!tree.set(mt, def, "view")) { m_reason = string("RclConfig::setMimeViewerDef: cant set value in ") + pconfname; return false; } list cdirs; cdirs.push_back(m_confdir); cdirs.push_back(path_cat(m_datadir, "examples")); delete mimeview; mimeview = new ConfStack("mimeview", cdirs, true); if (mimeview == 0 || !mimeview->ok()) { m_reason = string("No/bad mimeview in: ") + m_confdir; return false; } return true; } bool RclConfig::mimeViewerNeedsUncomp(const string &mimetype) { 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; } /** * Return icon name and path */ string RclConfig::getMimeIconName(const string &mtype, string *path) { string iconname; mimeconf->get(mtype, iconname, "icons"); if (iconname.empty()) iconname = "document"; if (path) { string iconsdir; #if defined (__FreeBSD__) && __FreeBSD_version < 500000 // gcc 2.95 dies if we call getConfParam here ?? if (m_conf) m_conf->get(string("iconsdir"), iconsdir, m_keydir); #else getConfParam("iconsdir", iconsdir); #endif if (iconsdir.empty()) { iconsdir = path_cat(m_datadir, "images"); } else { iconsdir = path_tildexpand(iconsdir); } *path = path_cat(iconsdir, iconname) + ".png"; } return iconname; } string RclConfig::getDbDir() { string dbdir; if (!getConfParam("dbdir", dbdir)) { LOGERR(("RclConfig::getDbDir: no db directory in configuration\n")); } else { dbdir = path_tildexpand(dbdir); // If not an absolute path, compute relative to config dir if (dbdir.at(0) != '/') { LOGDEB1(("Dbdir not abs, catting with confdir\n")); dbdir = path_cat(getConfDir(), dbdir); } } LOGDEB1(("RclConfig::getDbDir: dbdir: [%s]\n", dbdir.c_str())); return path_canon(dbdir); } bool RclConfig::sourceChanged() { 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; return false; } string RclConfig::getStopfile() { return path_cat(getConfDir(), "stoplist.txt"); } string RclConfig::getPidfile() { return path_cat(getConfDir(), "index.pid"); } // 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() { string path; if (!getConfParam("idxstatusfile", path)) { return path_cat(getConfDir(), "idxstatus.txt"); } else { path = path_tildexpand(path); // If not an absolute path, compute relative to config dir if (path.at(0) != '/') { path = path_cat(getConfDir(), path); } return path_canon(path); } } list& RclConfig::getSkippedNames() { if (m_skpnstate.needrecompute()) { stringToStrings(m_skpnstate.savedvalue, m_skpnlist); } return m_skpnlist; } list RclConfig::getSkippedPaths() { list 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()); for (list::iterator it = skpl.begin(); it != skpl.end(); it++) { *it = path_tildexpand(*it); *it = path_canon(*it); } skpl.sort(); skpl.unique(); return skpl; } list RclConfig::getDaemSkippedPaths() { list skpl = getSkippedPaths(); list dskpl; getConfParam("daemSkippedPaths", &dskpl); for (list::iterator it = dskpl.begin(); it != dskpl.end(); it++) { *it = path_tildexpand(*it); *it = path_canon(*it); } dskpl.sort(); skpl.merge(dskpl); skpl.unique(); return skpl; } // Look up an executable filter. We look in $RECOLL_FILTERSDIR, // filtersdir in config file, then let the system use the PATH string RclConfig::findFilter(const string &icmd) { // If the path is absolute, this is it if (icmd[0] == '/') return icmd; string cmd; const char *cp; // Filters dir from environment ? if ((cp = getenv("RECOLL_FILTERSDIR"))) { cmd = path_cat(cp, icmd); if (access(cmd.c_str(), X_OK) == 0) return cmd; } // Filters dir as configuration parameter? if (getConfParam(string("filtersdir"), cmd)) { cmd = path_cat(cmd, icmd); if (access(cmd.c_str(), X_OK) == 0) return cmd; } // Filters dir as datadir subdir. Actually the standard case, but // this is normally the same value found in config file (previous step) cmd = path_cat(m_datadir, "filters"); cmd = path_cat(cmd, icmd); if (access(cmd.c_str(), X_OK) == 0) return cmd; // Last resort for historical reasons: check in personal config // directory cmd = path_cat(getConfDir(), icmd); if (access(cmd.c_str(), X_OK) == 0) return cmd; // Let the shell try to find it... return icmd; } /** * Return decompression command line for given mime type */ bool RclConfig::getUncompressor(const string &mtype, list& cmd) { string hs; mimeconf->get(mtype, hs, cstr_null); if (hs.empty()) return false; list tokens; stringToStrings(hs, tokens); if (tokens.empty()) { LOGERR(("getUncompressor: empty spec for mtype %s\n", mtype.c_str())); return false; } list::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" ; // 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 (access(m_confdir.c_str(), 0) < 0 && mkdir(m_confdir.c_str(), 0700) < 0) { m_reason += string("mkdir(") + m_confdir + ") failed: " + strerror(errno); return false; } for (int i = 0; i < ncffiles; i++) { string dst = path_cat(m_confdir, string(configfiles[i])); if (access(dst.c_str(), 0) < 0) { FILE *fp = fopen(dst.c_str(), "w"); if (fp) { fprintf(fp, "%s\n", blurb); 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 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; // We should use reference-counted objects instead! 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)); m_fldtotraits = r.m_fldtotraits; m_aliastocanon = r.m_aliastocanon; 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; defcharset = r.defcharset; m_stpsuffstate.init(this, mimemap, r.m_stpsuffstate.paramname); m_skpnstate.init(this, m_conf, r.m_skpnstate.paramname); m_rmtstate.init(this, m_conf, r.m_rmtstate.paramname); } #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) { // Check that all known mime types have an icon and belong to // some category list catnames; config->getMimeCategories(catnames); cout << "Categories: "; set allmtsfromcats; for (list::const_iterator it = catnames.begin(); it != catnames.end(); it++) { cout << *it << " "; } cout << endl; for (list::const_iterator it = catnames.begin(); it != catnames.end(); it++) { list cts; config->getMimeCatTypes(*it, cts); for (list::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); } } list mtypes = config->getAllMimeTypes(); for (list::const_iterator it = mtypes.begin(); it != mtypes.end(); it++) { if (allmtsfromcats.find(*it) == allmtsfromcats.end()) { cout << "Not found in catgs: [" << *it << "]" << endl; } } } else { config->setKeyDir(cstr_null); list names = config->getConfNames(); names.sort(); names.unique(); for (list::iterator it = names.begin(); it != names.end();it++) { string value; config->getConfParam(*it, value); cout << *it << " -> [" << value << "]" << endl; } } exit(0); } #endif // TEST_RCLCONFIG recoll-1.17.3/common/rclconfig.h000644 001750 000000 00000025432 11740755063 017111 0ustar00dockeswheel000000 000000 /* 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 #include #include #include #include #include #include #ifndef NO_NAMESPACES using std::list; using std::string; using std::vector; using std::pair; using std::set; using std::map; using std::set; #endif #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; int savedkeydirgen; string savedvalue; void init(RclConfig *rconf, ConfNull *cnf, const string& nm); bool needrecompute(); }; // 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) FieldTraits(int i, double f) {wdfinc = i; boost = f;} FieldTraits() : wdfinc(1), boost(1.0) {} FieldTraits(const string& s) : pfx(s), wdfinc(1), boost(1.0) {} }; 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); // 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() {return m_ok;} const string &getReason() {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() {return m_confdir;} /** Check if the config files were modified since we read them */ bool sourceChanged(); /** Returns true if this is ~/.recoll */ bool isDefaultConfig(); /** Get the local value for /usr/local/share/recoll/ */ const string& getDatadir() {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) { if (m_conf == 0) return false; return m_conf->get(name, value, m_keydir); } /** Variant with autoconversion to int */ bool getConfParam(const string &name, int *value); /** Variant with autoconversion to bool */ bool getConfParam(const string &name, bool *value); /** Variant with conversion to string list/vector * (stringToStrings). Can fail if the string is malformed. */ bool getConfParam(const string &name, vector *value); bool getConfParam(const string &name, list *value); /** * Get list of config names under current sk, with possible * wildcard filtering */ list getConfNames(const char *pattern = 0) { return m_conf->getNames(m_keydir, pattern); } /** Check if name exists anywhere in config */ bool hasNameAnywhere(const string& nm) { 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); /** 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 */ list getTopdirs(); /** Get database directory */ string getDbDir(); /** Get stoplist file name */ string getStopfile(); /** Get indexing pid file name */ string getPidfile(); /** Get indexing status file name */ string getIdxStatusFile(); /** Get list of skipped file names for current keydir */ list& getSkippedNames(); /** Get list of skipped paths patterns. Doesn't depend on the keydir */ list getSkippedPaths(); /** Get list of skipped paths patterns, daemon version (may add some) Doesn't depend on the keydir */ list getDaemSkippedPaths(); /** conf: Add local fields to target dic */ bool addLocalFields(map *tgt); /** * 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, list& cmd); /** mimemap: compute mimetype */ string getMimeTypeFromSuffix(const string &suffix); /** mimemap: get a list of all indexable mime types defined */ list getAllMimeTypes(); /** mimemap: Get appropriate suffix for mime type. This is inefficient */ string getSuffixFromMimeType(const string &mt); /** 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. */ bool valueSplitAttributes(const string& whole, string& value, ConfSimple& attrs); /** mimeconf: get icon name for mimetype */ string getMimeIconName(const string &mtype, string *path = 0); /** mimeconf: get list of file categories */ bool getMimeCategories(list&); /** mimeconf: is parameter one of the categories ? */ bool isMimeCategory(string&); /** mimeconf: get list of mime types for category */ bool getMimeCatTypes(const string& cat, list&); /** mimeconf: get list of gui filters (doc cats by default */ bool getGuiFilterNames(list&); /** mimeconf: get query lang frag for named filter */ bool getGuiFilter(const string& filtername, string& frag); /** fields: get field prefix from field name */ bool getFieldTraits(const string& fldname, const FieldTraits **); const set& getStoredFields() {return m_storedFields;} set getIndexedFields(); /** Get canonic name for possible alias */ string fieldCanon(const string& fld); /** Get xattr name to field names translations */ const map& getXattrToField() {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]) */ list getFieldSectNames(const string &sk, const char* = 0); bool getFieldConfParam(const string &name, const string &sk, string &value); /** mimeview: get/set external viewer exec string(s) for mimetype(s) */ string getMimeViewerDef(const string &mimetype, const string& apptag); bool getMimeViewerDefs(vector >&); 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); /** Store/retrieve missing helpers description string */ string getMissingHelperDesc(); void storeMissingHelperDesc(const string &s); /** Find exec file for external filter. cmd is the command name from the * command string returned by getMimeHandlerDef */ string findFilter(const string& cmd); ~RclConfig() { freeAll(); } RclConfig(const RclConfig &r) { initFrom(r); } 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. list 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; map m_fldtotraits; // Field to field params map m_aliastocanon; set m_storedFields; map m_xattrtofld; void *m_stopsuffixes; unsigned int m_maxsufflen; ParamStale m_stpsuffstate; ParamStale m_skpnstate; list m_skpnlist; // Parameters auto-fetched on setkeydir string defcharset; // Limiting set of mime types to be processed. Normally empty. ParamStale m_rmtstate; set m_restrictMTypes; /** 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); }; #endif /* _RCLCONFIG_H_INCLUDED_ */ recoll-1.17.3/common/rclinit.cpp000644 001750 000000 00000010500 11740755063 017130 0ustar00dockeswheel000000 000000 /* 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 #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" static const int catchedSigs[] = {SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGUSR1, SIGUSR2}; RclConfig *recollinit(RclInitFlags flags, void (*cleanup)(void), void (*sigcleanup)(int), string &reason, const string *argcnf) { if (cleanup) atexit(cleanup); // We ignore SIGPIPE always. All pieces of code which can write to a pipe // must check write() return values. signal(SIGPIPE, SIG_IGN); // We would like to block SIGCHLD globally, but we can't because // QT uses it. Have to block it inside execmd.cpp // Install 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"); } } } DebugLog::getdbl()->setloglevel(DEBDEB1); DebugLog::setfilename("stderr"); 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 (logfilename.at(0) != '/' && !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 is set. This is only for converting file names // to utf8 for indexing. setlocale(LC_CTYPE, ""); // Make sure the locale charset is initialized (so that multiple // threads don't try to do it at once). config->getDefCharset(); // Init unac locking unac_init_mt(); // Init Unac translation exceptions string unacex; if (config->getConfParam("unac_except_trans", unacex) && !unacex.empty()) unac_set_except_translations(unacex.c_str()); 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() { sigset_t sset; sigemptyset(&sset); for (unsigned int i = 0; i < sizeof(catchedSigs) / sizeof(int); i++) sigaddset(&sset, catchedSigs[i]); pthread_sigmask(SIG_BLOCK, &sset, 0); } recoll-1.17.3/common/rclinit.h000644 001750 000000 00000004455 11740755063 016611 0ustar00dockeswheel000000 000000 /* 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(); #endif /* _RCLINIT_H_INCLUDED_ */ recoll-1.17.3/common/rclversion.h.in000644 001750 000000 00000000063 11740755063 017727 0ustar00dockeswheel000000 000000 static const char *rclversionstr = "@RCLVERSION@"; recoll-1.17.3/common/textsplit.cpp000644 001750 000000 00000066556 11740755063 017552 0ustar00dockeswheel000000 000000 /* 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 "textsplit.h" #include "debuglog.h" //#define UTF8ITER_CHECK #include "utf8iter.h" #include "uproplist.h" #ifndef NO_NAMESPACES using namespace std; #endif /* NO_NAMESPACES */ /** * 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. */ // 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}; static int charclasses[charclasses_size]; // Real 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 set unicign; static set visiblewhite; 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; char special[] = ".@+-,#'_\n\r"; for (i = 0; i < strlen(special); i++) charclasses[int(special[i])] = special[i]; for (i = 0; i < sizeof(uniign) / sizeof(int); i++) { unicign.insert(uniign[i]); } unicign.insert((unsigned int)-1); for (i = 0; i < sizeof(avsbwht) / sizeof(int); i++) { visiblewhite.insert(avsbwht[i]); } } }; static const CharClassInit charClassInitInstance; static inline int whatcc(unsigned int c) { if (c <= 127) { return charclasses[c]; } else { if (unicign.find(c) != unicign.end()) return SPACE; else return LETTER; } } // 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; // 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, int btstart, int btend) { LOGDEB3(("TextSplit::emitterm: [%s] pos %d\n", w.c_str(), pos)); unsigned int l = w.length(); if (l > 0 && l < (unsigned)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) { int c = (int)w[0]; if (charclasses[c] != A_ULETTER && charclasses[c] != A_LLETTER && charclasses[c] != DIGIT) { //cerr << "ERASING single letter term " << c << endl; return true; } } if (pos != m_prevpos || l != m_prevlen) { bool ret = takeword(w, pos, btstart, btend); m_prevpos = pos; m_prevlen = w.length(); return ret; } LOGDEB2(("TextSplit::emitterm:dup: [%s] pos %d\n", w.c_str(), pos)); } return true; } /** * A routine called from different places in text_to_words(), to * adjust the current state of the parser, and call the word * handler/emitter. Emit and reset the current word, possibly emit the current * span (if different). In query mode, words are not emitted, only final spans * * This is purely for factoring common code from different places in * text_to_words(). * * @return true if ok, false for error. Splitting should stop in this case. * @param spanerase Set if the current span is at its end. Reset it. * @param bp The current BYTE position in the stream * @param spanemit This is set for intermediate spans: glue char changed. */ inline bool TextSplit::doemit(bool spanerase, int bp, bool spanemit) { LOGDEB2(("TextSplit::doemit: sper %d bp %d spem %d. spp %d wS %d wL %d " "inn %d span [%s]\n", spanerase, bp, spanemit, m_spanpos, m_wordStart, m_wordLen, m_inNumber, m_span.c_str())); // Emit span? When splitting for query, we only emit final spans // (spanerase) bool spanemitted = false; if (!(m_flags & TXTS_NOSPANS) && !((m_wordLen == m_span.length()) && (o_noNumbers) && m_inNumber) && ((spanemit && !(m_flags & TXTS_ONLYSPANS)) || spanerase) ) { // Check for an acronym/abbreviation ie I.B.M. if (spanerase && m_wordLen != m_span.length() && m_span.length() > 2 && m_span.length() <= 20) { bool acron = true; for (unsigned int i = 1 ; i < m_span.length(); i += 2) { if (m_span[i] != '.') { acron = false; break; } } if (acron) { string acronym; for (unsigned int i = 0; i < m_span.length(); i += 2) { acronym += m_span[i]; } if (!emitterm(false, acronym, m_spanpos, bp - m_span.length(), bp)) return false; } } // Maybe trim at end. These are chars that we would keep inside // a span, but not at the end while (m_span.length() > 0) { switch (m_span[m_span.length()-1]) { case '.': case '-': case ',': case '@': case '_': case '\'': m_span.resize(m_span.length()-1); if (--bp < 0) bp = 0; break; default: goto breakloop1; } } breakloop1: spanemitted = true; if (!emitterm(true, m_span, m_spanpos, bp - m_span.length(), bp)) return false; } // Emit word if different from span and not 'no words' mode if (!(m_flags & TXTS_ONLYSPANS) && m_wordLen && !(o_noNumbers && m_inNumber) && (!spanemitted || m_wordLen != m_span.length())) { string s(m_span.substr(m_wordStart, m_wordLen)); if (!emitterm(false, s, m_wordpos, bp - m_wordLen, bp)) return false; } // Adjust state if (m_wordLen) { m_wordpos++; m_wordLen = 0; } if (spanerase) { discardspan(); } else { m_wordStart = m_span.length(); } return true; } void TextSplit::discardspan() { m_span.erase(); m_spanpos = m_wordpos; m_wordStart = 0; m_wordLen = 0; } /** * 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())); m_span.erase(); m_inNumber = false; m_wordStart = m_wordLen = m_prevpos = m_prevlen = m_wordpos = m_spanpos = 0; int curspanglue = 0; // 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 DIGIT: if (m_wordLen == 0) m_inNumber = true; m_wordLen += it.appendchartostring(m_span); nonalnumcnt = 0; break; case SPACE: SPACE: curspanglue = 0; nonalnumcnt = 0; if (m_wordLen || m_span.length()) { if (!doemit(true, it.getBpos())) return false; m_inNumber = false; } break; case WILD: if (m_flags & TXTS_KEEPWILD) goto NORMALCHAR; else goto SPACE; break; case '-': case '+': curspanglue = cc; 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 (whatcc(it[it.getCpos()+1]) == DIGIT) { // -10 m_inNumber = true; m_wordLen += it.appendchartostring(m_span); } else { goto SPACE; } } else if (m_inNumber && (m_span[m_span.length() - 1] == 'e' || m_span[m_span.length() - 1] == 'E')) { if (whatcc(it[it.getCpos()+1]) == DIGIT) { m_wordLen += it.appendchartostring(m_span); } else { goto SPACE; } } else { if (!doemit(false, it.getBpos())) return false; m_inNumber = false; m_wordStart += it.appendchartostring(m_span); } break; case '.': 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) { // we're eliminating 132.jpg here. Good idea ? if (nextwhat != DIGIT && nextc != 'e' && nextc != 'E') goto SPACE; m_wordLen += it.appendchartostring(m_span); curspanglue = cc; break; } else { // If . inside a word, it's spanglue, else, it's whitespace. // We also keep an initial '.' for catching .net, but this adds // quite a few spurious terms ! // Another problem is that something like .x-errs // will be split as .x-errs, x, errs but not x-errs // A final comma in a word will be removed by doemit // Only letters and digits make sense after if (nextwhat != A_LLETTER && nextwhat != A_ULETTER && nextwhat != DIGIT && nextwhat != LETTER) goto SPACE; if (cc == '.') { // Check for number like .1 if (m_span.length() == 0 && nextwhat == DIGIT) { m_inNumber = true; m_wordLen += it.appendchartostring(m_span); curspanglue = cc; break; } if (m_wordLen) { // Disputable special case: set spanemit to // true when encountering a '.' while spanglue // is '_'. Think of a_b.c Done to // avoid breaking stuff after changing '_' // from wordchar to spanglue if (!doemit(false, it.getBpos(), curspanglue == '_')) return false; curspanglue = cc; // span length could have been adjusted by trimming // inside doemit if (m_span.length()) m_wordStart += it.appendchartostring(m_span); break; } else { m_wordStart += it.appendchartostring(m_span); curspanglue = cc; break; } } } goto SPACE; } break; case '@': if (m_wordLen) { if (!doemit(false, it.getBpos())) return false; curspanglue = cc; m_inNumber = false; } m_wordStart += it.appendchartostring(m_span); break; case '_': if (m_wordLen) { if (!doemit(false, it.getBpos())) return false; curspanglue = cc; m_inNumber = false; } m_wordStart += it.appendchartostring(m_span); break; case '\'': // If in word, potential span: o'brien, else, this is more // whitespace if (m_wordLen) { if (!doemit(false, it.getBpos())) return false; curspanglue = cc; m_inNumber = false; m_wordStart += it.appendchartostring(m_span); } break; case '#': // Keep it only at end of word ... Special case for c# you see... if (m_wordLen > 0) { int w = whatcc(it[it.getCpos()+1]); if (w == SPACE || w == '\n' || w == '\r') { m_wordLen += it.appendchartostring(m_span); break; } } goto SPACE; break; case '\n': case '\r': if (m_span.length() && m_span[m_span.length() - 1] == '-') { // if '-' is the last char before end of line, just // ignore the line change. This is the right thing to // do almost always. We'd then need a way to check if // the - was added as part of the word hyphenation, or was // there in the first place, but this would need a dictionary. // Also we'd need to check for a soft-hyphen and remove it, // but this would require more utf-8 magic } else { // Handle like a normal separator 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" 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--; m_wordLen++; } goto NORMALCHAR; #endif /* CAMELCASE */ default: NORMALCHAR: if (m_inNumber && c != 'e' && c != 'E') { m_inNumber = false; } m_wordLen += it.appendchartostring(m_span); nonalnumcnt = 0; break; } } 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] = 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) { unsigned int btend = it.getBpos() + it.getBlen(); unsigned int loopbeg = (m_flags & TXTS_NOSPANS) ? nchars-1 : 0; unsigned int loopend = (m_flags & TXTS_ONLYSPANS) ? 1 : nchars; for (unsigned 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) { unsigned int btend = 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_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, list &tokens) { return u8stringToStrings >(s, tokens); } #else // TEST driver -> #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; } }; static string teststring = "Un bout de texte \nnormal. 2eme phrase.3eme;quatrieme.\n" "\"Jean-Francois Dockes\" \n" "n@d @net .net t@v@c c# c++ o'brien 'o'brien' l'ami\n" "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" "Debut-\ncontinue\n" "[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 " ; 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\n" ; static void Usage(void) { cerr << thisprog << ": usage:\n" << usage; exit(1); } static int op_flags; #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 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 '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 (!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 { cout << endl << teststring << endl << endl; odata = teststring; } 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 { 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); } } #endif // TEST recoll-1.17.3/common/textsplit.h000644 001750 000000 00000010522 11740755063 017175 0ustar00dockeswheel000000 000000 /* 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 #ifndef NO_NAMESPACES using std::string; using std::list; #endif 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; } enum Flags {TXTS_NONE = 0, TXTS_ONLYSPANS = 1, // Only return maximum spans (a@b.com) TXTS_NOSPANS = 2, // Only return atomic words (a, b, com) TXTS_KEEPWILD = 4 // Handle wildcards as letters }; 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 string &in); /** Process one output word: to be implemented by the actual user class */ virtual bool takeword(const 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; // Static utility functions: /** Count words in string, as the splitter would generate them */ static int countWords(const string &in, Flags flgs = TXTS_ONLYSPANS); /** Check if this is visibly not a single block of text */ static bool hasVisibleWhite(const 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 string &s, list &tokens); /** Is char CJK ? */ static bool isCJK(int c); private: Flags m_flags; int m_maxWordLength; // Current span. Might be jf.dockes@wanadoo.f string m_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; unsigned int m_prevlen; // This processes cjk text: bool cjk_to_words(Utf8Iter *it, unsigned int *cp); bool emitterm(bool isspan, string &term, int pos, int bs, int be); bool doemit(bool spanerase, int bp, bool spanemit=false); void discardspan(); }; #endif /* _TEXTSPLIT_H_INCLUDED_ */ recoll-1.17.3/common/unacpp.cpp000644 001750 000000 00000006474 11740755063 016771 0ustar00dockeswheel000000 000000 /* 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, bool dofold) { char *cout = 0; size_t out_len; int status; status = dofold ? unacfold_string(encoding, in.c_str(), in.length(), &cout, &out_len) : unac_string(encoding, in.c_str(), in.length(), &cout, &out_len); 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; } bool unaciscapital(const string& in) { if (in.empty()) return false; Utf8Iter it(in); string shorter; it.appendchartostring(shorter); string noacterm, noaclowterm; if (!unacmaybefold(shorter, noacterm, "UTF-8", false)) { LOGINFO(("unaciscapital: unac failed for [%s]\n", in.c_str())); return false; } if (!unacmaybefold(noacterm, noaclowterm, "UTF-8", true)) { LOGINFO(("unaciscapital: unacfold failed for [%s]\n", in.c_str())); return false; } Utf8Iter it1(noacterm); Utf8Iter it2(noaclowterm); if (*it1 != *it2) return true; else return false; } #else // not testing #include #include #include #include #include using namespace std; #include "unacpp.h" #include "readfile.h" #include "rclinit.h" int main(int argc, char **argv) { bool dofold = true; if (argc != 4) { cerr << "Usage: unacpp " << endl; exit(1); } const char *encoding = argv[1]; string ifn = argv[2]; if (!ifn.compare("stdin")) ifn.clear(); const char *ofn = argv[3]; string reason; (void)recollinit(RCLINIT_NONE, 0, 0, reason, 0); string odata; if (!file_to_string(ifn, odata)) { cerr << "file_to_string: " << odata << endl; exit(1); } string ndata; if (!unacmaybefold(odata, ndata, encoding, dofold)) { cerr << "unac: " << ndata << endl; exit(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; exit(1); } if (write(fd, ndata.c_str(), ndata.length()) != (int)ndata.length()) { cerr << "Write(2) failed: " << strerror(errno) << endl; exit(1); } close(fd); exit(0); } #endif recoll-1.17.3/common/unacpp.h000644 001750 000000 00000002270 11740755063 016424 0ustar00dockeswheel000000 000000 /* 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 extern bool unacmaybefold(const string& in, string& out, const char *encoding, bool dofold); // Utility function to determine if string begins with capital extern bool unaciscapital(const string& in); #endif /* _UNACPP_H_INCLUDED_ */ recoll-1.17.3/common/uproplist.h000644 001750 000000 00000030375 11740755063 017206 0ustar00dockeswheel000000 000000 /* 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. * * Data from: # PropList-4.0.1.txt # Date: 2004-03-02, 02:42:40 GMT [MD] # # Unicode Character Database # Copyright (c) 1991-2004 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see UCD.html */ static const unsigned int uniign[] = { 0x0021, /* ; Terminal_Punctuation # Po EXCLAMATION MARK*/ 0x002C, /* ; Terminal_Punctuation # Po COMMA*/ 0x002D, /* ; Dash # Pd HYPHEN-MINUS*/ 0x002E, /* ; Terminal_Punctuation # Po FULL STOP*/ 0x003A, /* ; Terminal_Punctuation # Po [2] COLON..SEMICOLON*/ 0x003B, /* ; Terminal_Punctuation # Po [2] COLON..SEMICOLON*/ 0x003F, /* ; Terminal_Punctuation # Po QUESTION MARK*/ 0x0085, /* NEXT LINE NEL;Cc */ 0x00A0, /* NO-BREAK SPACE; Zs */ 0x00A1, /* INVERTED EXCLAMATION MARK;Po */ 0x00A2, /* CENT SIGN;Sc */ 0x00A3, /* POUND SIGN;Sc; */ 0x00A4, /* CURRENCY SIGN;Sc; */ 0x00A5, /* YEN SIGN;Sc; */ 0x00A6, /* BROKEN BAR;So */ 0x00A7, /* SECTION SIGN;So; */ 0x00A9, /* COPYRIGHT SIGN;So */ 0x00AB, /* ; Quotation_Mark # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/ 0x00AC, /* NOT SIGN;Sm */ 0x00AD, /* ; Hyphen # Cf SOFT HYPHEN*/ 0x00AE, /* registered sign */ 0x00B0, /* DEGREE SIGN;So;0;ET;;;;;N;;;;; */ 0x00B1, /* PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;;*/ 0x00B7, /* MIDDLE DOT;Po;0;ON;;;;;N;;;;;*/ 0x00BB, /* ; Quotation_Mark # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/ 0x00BF, /* INVERTED QUESTION MARK;Po */ 0x00D7, /* MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; */ 0x037E, /* ; Terminal_Punctuation # Po GREEK QUESTION MARK*/ 0x0387, /* ; Terminal_Punctuation # Po GREEK ANO TELEIA*/ 0x055C, /* ; STerm # Po ARMENIAN EXCLAMATION MARK*/ 0x055E, /* ; STerm # Po ARMENIAN QUESTION MARK*/ 0x0589, /* ; STerm # Po ARMENIAN FULL STOP*/ 0x0589, /* ; Terminal_Punctuation # Po ARMENIAN FULL STOP*/ 0x058A, /* ; Dash # Pd ARMENIAN HYPHEN*/ 0x058A, /* ; Hyphen # Pd ARMENIAN HYPHEN*/ 0x05C3, /* ; Terminal_Punctuation # Po HEBREW PUNCTUATION SOF PASUQ*/ 0x060C, /* ; Terminal_Punctuation # Po ARABIC COMMA*/ 0x061B, /* ; Terminal_Punctuation # Po ARABIC SEMICOLON*/ 0x061F, /* ; STerm # Po ARABIC QUESTION MARK*/ 0x061F, /* ; Terminal_Punctuation # Po ARABIC QUESTION MARK*/ 0x06D4, /* ; STerm # Po ARABIC FULL STOP*/ 0x06D4, /* ; Terminal_Punctuation # Po ARABIC FULL STOP*/ 0x166E, /* ; STerm # Po CANADIAN SYLLABICS FULL STOP*/ 0x1680, /* ; White_Space # Zs OGHAM SPACE MARK*/ 0x16EB, /* RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;*/ 0x16EC, /* RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;;*/ 0x16ED, /* RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; */ 0x1803, /* ; STerm # Po MONGOLIAN FULL STOP*/ 0x1806, /* ; Hyphen # Pd MONGOLIAN TODO SOFT HYPHEN*/ 0x1809, /* ; STerm # Po MONGOLIAN MANCHU FULL STOP*/ 0x180E, /* ; White_Space # Zs MONGOLIAN VOWEL SEPARATOR*/ 0x2000, /* ; White_Space # Zs [11] EN QUAD..HAIR SPACE*/ 0x2001, /* ; White_Space # Zs [11] EN QUAD..HAIR SPACE*/ 0x2002, /* ; White_Space # Zs [11] EN QUAD..HAIR SPACE*/ 0x2003, /* ; White_Space # Zs [11] EN QUAD..HAIR SPACE*/ 0x2004, /* ; White_Space # Zs [11] EN QUAD..HAIR SPACE*/ 0x2005, /* ; White_Space # Zs [11] EN QUAD..HAIR SPACE*/ 0x2006, /* ; White_Space # Zs [11] EN QUAD..HAIR SPACE*/ 0x2007, /* ; White_Space # Zs [11] EN QUAD..HAIR SPACE*/ 0x2008, /* ; White_Space # Zs [11] EN QUAD..HAIR SPACE*/ 0x2009, /* ; White_Space # Zs [11] EN QUAD..HAIR SPACE*/ 0x200A, /* ; White_Space # Zs [11] EN QUAD..HAIR SPACE*/ 0x2010, /* ; Hyphen # Pd [2] HYPHEN..NON-BREAKING HYPHEN*/ 0x2011, /* ; Hyphen # Pd [2] HYPHEN..NON-BREAKING HYPHEN*/ 0x2012, /* ; Dash # Pd [6] HYPHEN..HORIZONTAL BAR*/ 0x2013, /* ; Dash # Pd [6] HYPHEN..HORIZONTAL BAR*/ 0x2014, /* ; Dash # Pd [6] HYPHEN..HORIZONTAL BAR*/ 0x2015, /* ; Dash # Pd [6] HYPHEN..HORIZONTAL BAR*/ 0x2018, /* ; Quotation_Mark # Pi LEFT SINGLE QUOTATION MARK*/ 0x2019, /* ; Quotation_Mark # Pf RIGHT SINGLE QUOTATION MARK*/ 0x201A, /* ; Quotation_Mark # Ps SINGLE LOW-9 QUOTATION MARK*/ 0x201B, /* ; Quotation_Mark # Pi SINGLE HIGH-REVERSED-9 QUOTATION MARK*/ 0x201C, /* ; Quotation_Mark # Pi LEFT DOUBLE QUOTATION MARK*/ 0x201D, /* ; Quotation_Mark # Pf RIGHT DOUBLE QUOTATION MARK*/ 0x201E, /* ; Quotation_Mark # Ps DOUBLE LOW-9 QUOTATION MARK*/ 0x201F, /* ; Quotation_Mark # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/ 0x2022, /* BULLET;Po;0;ON;;;;;N;;;;; */ 0x2023, /* TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;;*/ 0x2024, /* ONE DOT LEADER;Po;0;ON; 002E;;;;N;;;;;*/ 0x2025, /* TWO DOT LEADER;Po;0;ON; 002E 002E;;;;N;;;;; */ 0x2026, /* HORIZONTAL ELLIPSIS;Po;0;ON; 002E 002E 002E;;;;N;;;;; */ 0x2028, /* ; White_Space # Zl LINE SEPARATOR*/ 0x2029, /* ; White_Space # Zp PARAGRAPH SEPARATOR*/ 0x202F, /* ; White_Space # Zs NARROW NO-BREAK SPACE*/ 0x2032, /* PRIME;Po;0;ET;;;;;N;;;;;*/ 0x2039, /* ; Quotation_Mark # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/ 0x203A, /* ; Quotation_Mark # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/ 0x203C, /* ; STerm # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG*/ 0x203D, /* ; STerm # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG*/ 0x2047, /* ; Terminal_Punctuation # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK*/ 0x2048, /* ; Terminal_Punctuation # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK*/ 0x2049, /* ; Terminal_Punctuation # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK*/ 0x2053, /* ; Dash # Po SWUNG DASH*/ 0x205F, /* ; White_Space # Zs MEDIUM MATHEMATICAL SPACE*/ 0x207B, /* ; Dash # Sm SUPERSCRIPT MINUS*/ 0x208B, /* ; Dash # Sm SUBSCRIPT MINUS*/ 0x2117, /* SOUND RECORDING COPYRIGHT;So */ 0x2122, /* TRADE MARK SIGN;So; */ 0x2192, /* RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;;*/ 0x2212, /* ; Dash # Sm MINUS SIGN*/ 0x2E2E, /* REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; */ 0x3000, /* ; White_Space # Zs IDEOGRAPHIC SPACE*/ 0x3002, /* ; STerm # Po IDEOGRAPHIC FULL STOP*/ 0x300C, /* ; Quotation_Mark # Ps LEFT CORNER BRACKET*/ 0x300D, /* ; Quotation_Mark # Pe RIGHT CORNER BRACKET*/ 0x300E, /* ; Quotation_Mark # Ps LEFT WHITE CORNER BRACKET*/ 0x300F, /* ; Quotation_Mark # Pe RIGHT WHITE CORNER BRACKET*/ 0x301C, /* ; Dash # Pd WAVE DASH*/ 0x301D, /* ; Quotation_Mark # Ps REVERSED DOUBLE PRIME QUOTATION MARK*/ 0x301E, /* ; Quotation_Mark # Pe LOW DOUBLE PRIME QUOTATION MARK*/ 0x3030, /* ; Dash # Pd WAVY DASH*/ 0x30FB, /* ; Hyphen # Pc KATAKANA MIDDLE DOT*/ 0xC2B6, /* PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;; */ 0xC3B7, /* DIVISION SIGN;Sm;0;ON;;;;;N;;;;; */ 0xFE31, /* ; Dash # Pd PRESENTATION FORM FOR VERTICAL EM DASH*/ 0xFE32, /* ; Dash # Pd PRESENTATION FORM FOR VERTICAL EN DASH*/ 0xFE41, /* ; Quotation_Mark # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET*/ 0xFE42, /* ; Quotation_Mark # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET*/ 0xFE43, /* ; Quotation_Mark # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET*/ 0xFE44, /* ; Quotation_Mark # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET*/ 0xFE50, /* ; Terminal_Punctuation # Po [3] SMALL COMMA..SMALL FULL STOP*/ 0xFE51, /* ; Terminal_Punctuation # Po [3] SMALL COMMA..SMALL FULL STOP*/ 0xFE52, /* ; STerm # Po SMALL FULL STOP*/ 0xFE52, /* ; Terminal_Punctuation # Po [3] SMALL COMMA..SMALL FULL STOP*/ 0xFE54, /* ; Terminal_Punctuation # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK*/ 0xFE55, /* ; Terminal_Punctuation # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK*/ 0xFE56, /* ; Terminal_Punctuation # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK*/ 0xFE57, /* ; Terminal_Punctuation # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK*/ 0xFE58, /* ; Dash # Pd SMALL EM DASH*/ 0xFE63, /* ; Hyphen # Pd SMALL HYPHEN-MINUS*/ 0xFF01, /* FULLWIDTH EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; */ 0xFF02, /* FULLWIDTH QUOTATION MARK;Po;0;ON; 0022;;;;N;;;;; */ 0xFF03, /* FULLWIDTH NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; */ 0xFF04, /* FULLWIDTH DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; */ 0xFF05, /* FULLWIDTH PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; */ 0xFF06, /* FULLWIDTH AMPERSAND;Po;0;ON; 0026;;;;N;;;;; */ 0xFF07, /* FULLWIDTH APOSTROPHE;Po;0;ON; 0027;;;;N;;;;; */ 0xFF08, /* FULLWIDTH LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;FULLWIDTH OPENIN*/ 0xFF09, /* FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;FULLWIDTH CLOS*/ 0xFF0A, /* FULLWIDTH ASTERISK;Po;0;ON; 002A;;;;N;;;;; */ 0xFF0B, /* FULLWIDTH PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; */ 0xFF0C, /* FULLWIDTH COMMA;Po;0;CS; 002C;;;;N;;;;; */ 0xFF0D, /* FULLWIDTH HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; */ 0xFF0E, /* FULLWIDTH FULL STOP;Po;0;CS; 002E;;;;N;FULLWIDTH PERIOD;;;; */ 0xFF0F, /* FULLWIDTH SOLIDUS;Po;0;CS; 002F;;;;N;FULLWIDTH SLASH;;;; */ 0xFF1A, /* ; Terminal_Punctuation # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON*/ 0xFF1B, /* ; Terminal_Punctuation # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON*/ 0xFF1F, /* ; Terminal_Punctuation # Po FULLWIDTH QUESTION MARK*/ 0xFF61, /* ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC FULL STOP*/ 0xFF62, /* ; Quotation_Mark # Ps HALFWIDTH LEFT CORNER BRACKET*/ 0xFF63, /* ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET*/ 0xFF64, /* ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA*/ 0xFF65, /* ; Hyphen # Pc HALFWIDTH KATAKANA MIDDLE DOT*/ }; /* 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_ recoll-1.17.3/bincimapmime/00README.recoll000644 001750 000000 00000000163 11757427665 020441 0ustar00dockeswheel000000 000000 Most of the code in this directory was taken from the Binc IMAP project (http://www.bincimap.org/), version 1.3.3 recoll-1.17.3/bincimapmime/AUTHORS000644 001750 000000 00000004447 11757427665 017223 0ustar00dockeswheel000000 000000 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. recoll-1.17.3/bincimapmime/COPYING000644 001750 000000 00000044601 11757427665 017202 0ustar00dockeswheel000000 000000 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. recoll-1.17.3/bincimapmime/Makefile000644 001750 000000 00000001437 11757427665 017607 0ustar00dockeswheel000000 000000 # @(#$Id: Makefile,v 1.6 2006-01-19 12:01:42 dockes Exp $ (C) 2005 J.F.Dockes depth = .. include $(depth)/mk/sysconf LIBS = libmime.a PROGS = trbinc all: depend $(LIBS) SRCS = mime-parsefull.cc mime-parseonlyheader.cc \ mime-printbody.cc mime.cc \ convert.cc iodevice.cc iofactory.cc OBJS = mime-parsefull.o mime-parseonlyheader.o \ mime-printbody.o mime.o \ convert.o iodevice.o iofactory.o libmime.a : $(OBJS) $(AR) ru libmime.a $(OBJS) .cc.o: $(CXX) $(ALL_CXXFLAGS) -c $< TRBINCOBJS = trbinc.o trbinc: trbinc.o $(CXX) -o trbinc trbinc.o libmime.a depend: alldeps.stamp alldeps.stamp : $(SRCS) $(CXX) -M $(ALL_CXXFLAGS) $(SRCS) > alldeps touch alldeps.stamp clean: cp /dev/null alldeps rm -f alldeps.stamp rm -f ${LIBS} ${PROGS} ${OBJS} include alldeps recoll-1.17.3/bincimapmime/config.h000644 001750 000000 00000000000 11757427665 017546 0ustar00dockeswheel000000 000000 recoll-1.17.3/bincimapmime/convert.cc000644 001750 000000 00000006761 11757427665 020143 0ustar00dockeswheel000000 000000 /* -*- 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(unsigned int 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; } recoll-1.17.3/bincimapmime/convert.h000644 001750 000000 00000021477 11757427665 020006 0ustar00dockeswheel000000 000000 /* -*- 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. * -------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include #endif #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) { int 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(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") { int 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(unsigned int 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 recoll-1.17.3/bincimapmime/iodevice.cc000644 001750 000000 00000017772 11757427665 020256 0ustar00dockeswheel000000 000000 /*-*-mode:c++-*-*/ /* -------------------------------------------------------------------- * Filename: * src/iodevice.cc * * Description: * Implementation of the IODevice class. * -------------------------------------------------------------------- * Copyright 2002, 2003 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 "iodevice.h" #include "convert.h" // BincStream //#include "session.h" // getEnv/hasEnv #include #include #ifndef NO_NAMESPACES using namespace ::std; using namespace ::Binc; #endif /* NO_NAMESPACES */ //------------------------------------------------------------------------ IODevice::IODevice(int f) : flags(f | IsEnabled), maxInputBufferSize(0), maxOutputBufferSize(0), timeout(0), readCount(0), writeCount(0), outputLevel(ErrorLevel), outputLevelLimit(ErrorLevel), error(Unknown), errorString("Unknown error"), dumpfd(0) { } //------------------------------------------------------------------------ IODevice::~IODevice(void) { } //------------------------------------------------------------------------ IODevice &IODevice::operator <<(ostream &(*source)(ostream &)) { if (!(flags & IsEnabled) || outputLevel > outputLevelLimit) return *this; static std::ostream &(*endl_funcptr)(ostream &) = endl; if (source != endl_funcptr) return *this; outputBuffer << "\r\n"; if (dumpfd) ::write(dumpfd, "\r\n", 2); if (flags & FlushesOnEndl) flush(); else if (flags & HasOutputLimit) if (outputBuffer.getSize() > maxOutputBufferSize) flush(); return *this; } //------------------------------------------------------------------------ bool IODevice::canRead(void) const { return false; } //------------------------------------------------------------------------ void IODevice::clear() { if (!(flags & IsEnabled)) return; inputBuffer.clear(); outputBuffer.clear(); } //------------------------------------------------------------------------ bool IODevice::flush() { if (!(flags & IsEnabled)) return true; WriteResult writeResult = WriteWait; do { unsigned int s = outputBuffer.getSize(); if (s == 0) break; if (!waitForWrite()) return false; writeResult = write(); if (writeResult == WriteError) return false; writeCount += s - outputBuffer.getSize(); } while (outputBuffer.getSize() > 0 && writeResult == WriteWait); outputBuffer.clear(); return true; } //------------------------------------------------------------------------ void IODevice::setFlags(unsigned int f) { flags |= f; } //------------------------------------------------------------------------ void IODevice::clearFlags(unsigned int f) { flags &= ~f; } //------------------------------------------------------------------------ void IODevice::setMaxInputBufferSize(unsigned int max) { maxInputBufferSize = max; } //------------------------------------------------------------------------ void IODevice::setMaxOutputBufferSize(unsigned int max) { maxOutputBufferSize = max; } //------------------------------------------------------------------------ void IODevice::setTimeout(unsigned int t) { timeout = t; if (t) flags |= HasTimeout; else flags &= ~HasTimeout; } //------------------------------------------------------------------------ unsigned int IODevice::getTimeout(void) const { return timeout; } //------------------------------------------------------------------------ void IODevice::setOutputLevel(LogLevel level) { outputLevel = level; } //------------------------------------------------------------------------ IODevice::LogLevel IODevice::getOutputLevel(void) const { return outputLevel; } //------------------------------------------------------------------------ void IODevice::setOutputLevelLimit(LogLevel level) { outputLevelLimit = level; } //------------------------------------------------------------------------ IODevice::LogLevel IODevice::getOutputLevelLimit(void) const { return outputLevelLimit; } //------------------------------------------------------------------------ bool IODevice::readStr(string *dest, unsigned int max) { // If max is 0, fill the input buffer once only if it's empty. if (!max && inputBuffer.getSize() == 0 && !fillInputBuffer()) return false; // If max is != 0, wait until we have max. while (max && inputBuffer.getSize() < max) { if (!fillInputBuffer()) return false; } unsigned int bytesToRead = max ? max : inputBuffer.getSize(); *dest += inputBuffer.str().substr(0, bytesToRead); if (dumpfd) { ::write(dumpfd, inputBuffer.str().substr(0, bytesToRead).c_str(), bytesToRead); } inputBuffer.popString(bytesToRead); readCount += bytesToRead; return true; } //------------------------------------------------------------------------ bool IODevice::readChar(char *dest) { if (inputBuffer.getSize() == 0 && !fillInputBuffer()) return false; char c = inputBuffer.popChar(); if (dest) *dest = c; if (dumpfd) ::write(dumpfd, &c, 1); ++readCount; return true; } //------------------------------------------------------------------------ void IODevice::unreadChar(char c) { inputBuffer.unpopChar(c); } //------------------------------------------------------------------------ void IODevice::unreadStr(const string &s) { inputBuffer.unpopStr(s); } //------------------------------------------------------------------------ bool IODevice::skipTo(char c) { char dest = '\0'; do { if (!readChar(&dest)) return false; if (dumpfd) ::write(dumpfd, &dest, 1); } while (c != dest); return true; } //------------------------------------------------------------------------ string IODevice::service(void) const { return "nul"; } //------------------------------------------------------------------------ bool IODevice::waitForWrite(void) const { return false; } //------------------------------------------------------------------------ bool IODevice::waitForRead(void) const { return false; } //------------------------------------------------------------------------ IODevice::WriteResult IODevice::write(void) { return WriteError; } //------------------------------------------------------------------------ bool IODevice::fillInputBuffer(void) { return false; } //------------------------------------------------------------------------ IODevice::Error IODevice::getLastError(void) const { return error; } //------------------------------------------------------------------------ string IODevice::getLastErrorString(void) const { return errorString; } //------------------------------------------------------------------------ unsigned int IODevice::getReadCount(void) const { return readCount; } //------------------------------------------------------------------------ unsigned int IODevice::getWriteCount(void) const { return writeCount; } //------------------------------------------------------------------------ void IODevice::enableProtocolDumping(void) { #if 0 BincStream ss; ss << "/tmp/bincimap-dump-" << (int) time(0) << "-" << Session::getInstance().getIP() << "-XXXXXX"; char *safename = strdup(ss.str().c_str()); dumpfd = mkstemp(safename); if (dumpfd == -1) dumpfd = 0; delete safename; #endif } recoll-1.17.3/bincimapmime/iodevice.h000644 001750 000000 00000026066 11757427665 020114 0ustar00dockeswheel000000 000000 /*-*-mode:c++;c-basic-offset:2-*-*/ /* -------------------------------------------------------------------- * Filename: * src/iodevice.h * * Description: * Declaration of the IODevice class. * -------------------------------------------------------------------- * Copyright 2002, 2003 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 iodevice_h_included #define iodevice_h_included #ifdef HAVE_CONFIG_H #include #endif #include "convert.h" // BincStream #include #include // ::write namespace Binc { /*! \class IODevice \brief The IODevice class provides a framework for reading and writing to device. Implement new devices by inheriting this class and overloading all virtual methods. service() returns the service that the specific device is used for. Two values are "log" and "client". \sa IOFactory, MultilogDevice, SyslogDevice, StdIODevice, SSLDevice */ class IODevice { public: /*! Standard options for an IODevice. */ enum Flags { None = 0, FlushesOnEndl = 1 << 0, HasInputLimit = 1 << 1, HasOutputLimit = 1 << 2, IsEnabled = 1 << 3, HasTimeout = 1 << 4 }; /*! Errors from when an operation returned false. */ enum Error { Unknown, Timeout }; /*! Constructs an invalid IODevice. Instances of IODevice perform no operations, and all boolean functions always return false. This constructor is only useful if called from a subclass that reimplements all virtual methods. */ IODevice(int f = 0); /*! Destructs an IODevice; does nothing. */ virtual ~IODevice(void); /*! Clears all data in the input and output buffers. */ void clear(void); /*! Sets one or more flags. \param f A bitwise OR of flags from the Flags enum. */ void setFlags(unsigned int f); /*! Clears one or more flags. \param f A bitwise OR of flags from the Flags enum. */ void clearFlags(unsigned int f); /*! Sets the maximum allowed input buffer size. If this size is non-zero and exceeded, reading from the device will fail. This functionality is used to prevent clients from forcing this class to consume so much memory that the program crashes. Setting the max input buffer size to 0 disables the input size limit. \param max The maximum input buffer size in bytes. */ void setMaxInputBufferSize(unsigned int max); /*! Sets the maximum allowed output buffer size. If this size is non-zero and exceeded, flush() is called implicitly. Setting the max output buffer size to 0 disables the output size limit. This is generally discouraged. As a contrast to setMaxInputBufferSize(), this function is used to bundle up consequent write calls, allowing more efficient use of the underlying device as larger blocks of data are written at a time. \param max The maximum output buffer size in bytes. */ void setMaxOutputBufferSize(unsigned int max); /*! Sets the device's internal timeout in seconds. This timeout is used both when waiting for data to read and for waiting for the ability to write. If this timeout is exceeded, the read or write function that triggered the timeout will fail. Setting the timeout to 0 disables the timeout. \param t The timeout in seconds. \sa getTimeout() */ void setTimeout(unsigned int t); /*! Returns the timeout in seconds, or 0 if there is no timeout. \sa setTimeout() */ unsigned int getTimeout(void) const; enum LogLevel { ErrorLevel, InfoLevel, WarningLevel, DebugLevel }; /*! Sets the output level for the following write operations on this device. The output level is a number which gives the following write operations a priority. You can use setOutputLevelLimit() to filter the write operations valid for different operating modes. This enables you to have certain write operations ignored. For instance, if the output level is set to 0, then "Hello" is written, and the output level is set to 1, followed by writing "Daisy", the output level limit value will decive wether only "Hello" is written, or if also "Daisy" is written. A low value of the level gives higher priority, and a high level will give low priority. The default value is 0, and write operations that are done with output level 0 are never ignored. \param level The output level \sa getOutputLevel(), setOutputLevelLimit() */ void setOutputLevel(LogLevel level); /*! Returns the current output level. \sa setOutputLevel() */ LogLevel getOutputLevel(void) const; /*! Sets the current output level limit. Write operations with a level higher than the output level limit are ignored. \param level The output level limit \sa setOutputLevel() */ void setOutputLevelLimit(LogLevel level); /*! Returns the current output level limit. \sa setOutputLevelLimit() */ LogLevel getOutputLevelLimit(void) const; /*! Returns the number of bytes that have been read from this device since it was created. */ unsigned int getReadCount(void) const; /*! Returns the number of bytes that have been written to this device since it was created. */ unsigned int getWriteCount(void) const; /*! Calling this function enables the built-in protocol dumping feature in the device. All input and output to this device will be dumped to a file in /tmp. */ void enableProtocolDumping(void); /*! Writes data to the device. Depending on the value of the max output buffer size, the data may not be written immediately. \sa setMaxOutputBufferSize() */ template IODevice &operator <<(const T &source); /*! Writes data to the device. This function specializes on standard ostream derivates, such as std::endl. */ IODevice &operator <<(std::ostream &(*source)(std::ostream &)); /*! Returns true if data can be read from the device; otherwise returns false. */ virtual bool canRead(void) const; /*! Reads data from the device, and stores this in a string. Returns true on success; otherwise returns false. \param dest The incoming data is stored in this string. \param max No more than this number of bytes is read from the device. */ bool readStr(std::string *dest, unsigned int max = 0); /*! Reads exactly one byte from the device and stores this in a char. Returns true on success; otherwise returns false. \param dest The incoming byte is stored in this char. */ bool readChar(char *dest = 0); /*! FIXME: add docs */ void unreadChar(char c); /*! FIXME: add docs */ void unreadStr(const std::string &s); /*! Reads characters from the device, until and including one certain character is found. All read characters are discarded. This function can be used to skip to the beginning of a line, with the terminating character being '\n'. \param The certain character. */ bool skipTo(char c); /*! Flushes the output buffer. Writes all data in the output buffer to the device. */ bool flush(void); /*! Returns the type of error that most recently occurred. */ Error getLastError(void) const; /*! Returns a human readable description of the error that most recently occurred. If no known error has occurred, this method returns "Unknown error". */ std::string getLastErrorString(void) const; /*! Returns the type of service provided by this device. Two valid return values are "client" and "log". */ virtual std::string service(void) const; protected: /*! Waits until data can be written to the device. If the timeout is 0, this function waits indefinitely. Otherwise, it waits until the timeout has expired. If this function returns true, data can be written to the device; otherwise, getLastError() must be checked to determine whether a timeout occurred or whether an error with the device prevents further writing. */ virtual bool waitForWrite(void) const; /*! Waits until data can be read from the device. \sa waitForWrite() */ virtual bool waitForRead(void) const; /*! Types of results from a write. */ enum WriteResult { WriteWait = 0, WriteDone = 1 << 0, WriteError = 1 << 1 }; /*! Writes as much data as possible to the device. If some but not all data was written, returns WriteWait. If all data was written, returns WriteDone. If an error occurred, returns WriteError. */ virtual WriteResult write(void); /*! Reads data from the device, and stores it in the input buffer. Returns true on success; otherwise returns false. This method will fail if there is no more data available, if a timeout occurred or if an error with the device prevents more data from being read. The number of bytes read from the device is undefined. */ virtual bool fillInputBuffer(void); BincStream inputBuffer; BincStream outputBuffer; protected: unsigned int flags; unsigned int maxInputBufferSize; unsigned int maxOutputBufferSize; unsigned int timeout; unsigned int readCount; unsigned int writeCount; LogLevel outputLevel; LogLevel outputLevelLimit; mutable Error error; mutable std::string errorString; int dumpfd; }; //---------------------------------------------------------------------- template IODevice &IODevice::operator <<(const T &source) { if ((flags & IsEnabled) && outputLevel <= outputLevelLimit) { outputBuffer << source; if (dumpfd) { BincStream ss; ss << source; ::write(dumpfd, ss.str().c_str(), ss.getSize()); } if (flags & HasInputLimit) if (outputBuffer.getSize() > maxOutputBufferSize) flush(); } return *this; } } #endif recoll-1.17.3/bincimapmime/iofactory.cc000644 001750 000000 00000005217 11757427665 020455 0ustar00dockeswheel000000 000000 /*-*-mode:c++-*-*/ /* -------------------------------------------------------------------- * Filename: * src/iofactory.cc * * Description: * Implementation of the IOFactory class. * -------------------------------------------------------------------- * Copyright 2002, 2003 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 "iofactory.h" #include "iodevice.h" #ifndef NO_NAMESPACES using namespace ::Binc; using namespace ::std; #endif /* NO_NAMESPACES */ //------------------------------------------------------------------------ IOFactory::IOFactory(void) { } //------------------------------------------------------------------------ IOFactory::~IOFactory(void) { } //------------------------------------------------------------------------ IOFactory &IOFactory::getInstance(void) { static IOFactory ioFactory; return ioFactory; } //------------------------------------------------------------------------ void IOFactory::addDevice(IODevice *dev) { IODevice *ioDevice = IOFactory::getInstance().devices[dev->service()]; // FIXME: Delete correct object. Now, only IODevice's destructor is // called, and only IODevice's memory is freed. if (ioDevice) delete ioDevice; IOFactory::getInstance().devices[dev->service()] = dev; } //------------------------------------------------------------------------ IODevice &IOFactory::getClient(void) { static IODevice nulDevice; IOFactory &ioFactory = IOFactory::getInstance(); if (ioFactory.devices.find("client") != ioFactory.devices.end()) return *ioFactory.devices["client"]; return nulDevice; } //------------------------------------------------------------------------ IODevice &IOFactory::getLogger(void) { static IODevice nulDevice; IOFactory &ioFactory = IOFactory::getInstance(); if (ioFactory.devices.find("log") != ioFactory.devices.end()) return *ioFactory.devices["log"]; return nulDevice; } recoll-1.17.3/bincimapmime/iofactory.h000644 001750 000000 00000004204 11757427665 020312 0ustar00dockeswheel000000 000000 /*-*-mode:c++-*-*/ /* -------------------------------------------------------------------- * Filename: * src/iofactory.h * * Description: * Declaration of the IOFactory class. * -------------------------------------------------------------------- * Copyright 2002, 2003 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 IOFACTORY_H_INCLUDED #define IOFACTORY_H_INCLUDED #include #include #include "iodevice.h" namespace Binc { class IOFactory { public: ~IOFactory(void); static void addDevice(IODevice *dev); static IOFactory &getInstance(void); static IODevice &getClient(void); static IODevice &getLogger(void); private: IOFactory(void); std::map devices; }; } #define bincClient \ IOFactory::getClient() #if !defined (DEBUG) #define bincError if (false) std::cout #define bincWarning if (false) std::cout #define bincDebug if (false) std::cout #else #define bincError \ IOFactory::getLogger().setOutputLevel(IODevice::ErrorLevel);IOFactory::getLogger() #define bincWarning \ IOFactory::getLogger().setOutputLevel(IODevice::WarningLevel);IOFactory::getLogger() #define bincDebug \ IOFactory::getLogger().setOutputLevel(IODevice::DebugLevel);IOFactory::getLogger() #endif #define bincInfo \ IOFactory::getLogger().setOutputLevel(IODevice::InfoLevel);IOFactory::getLogger() #endif recoll-1.17.3/bincimapmime/mime-inputsource.h000644 001750 000000 00000011731 11757427665 021623 0ustar00dockeswheel000000 000000 /* -*- 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 #ifdef HAVE_CONFIG_H #include #endif #include #include #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 size_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 size_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 size_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 size_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 = lst - st; if (nbytes > nb) { nbytes = nb; } if (nbytes <= 0) { return (size_t)-1; } s.read(raw, nbytes); return nbytes; } inline void MimeInputSourceStream::reset(void) { MimeInputSource::reset(); s.seekg(0); } } #endif recoll-1.17.3/bincimapmime/mime-parsefull.cc000644 001750 000000 00000041166 11757427665 021403 0ustar00dockeswheel000000 000000 /* -*- 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) { int endpos = delimiter.length(); char *delimiterqueue = 0; int 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, 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 = 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 = 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; int 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; int 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, endpos)) { *boundarysize = _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; } recoll-1.17.3/bincimapmime/mime-parseonlyheader.cc000644 001750 000000 00000010202 11757427665 022556 0ustar00dockeswheel000000 000000 /* -*- 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 (int 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; } recoll-1.17.3/bincimapmime/mime-printbody.cc000644 001750 000000 00000004707 11757427665 021420 0ustar00dockeswheel000000 000000 /* -*- 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. * -------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include #endif #include "mime.h" #include "mime-utils.h" #include "mime-inputsource.h" #include "convert.h" #include "iodevice.h" #include "iofactory.h" #include #include #include #include #include #include #include #include #include #ifndef NO_NAMESPACES using namespace ::std; #endif /* NO_NAMESPACES */ //------------------------------------------------------------------------ void Binc::MimePart::printBody(IODevice &output, unsigned int startoffset, unsigned int length) const { mimeSource->reset(); mimeSource->seek(bodystartoffsetcrlf + startoffset); if (startoffset + length > bodylength) length = bodylength - startoffset; char c = '\0'; for (unsigned int i = 0; i < length; ++i) { if (!mimeSource->getChar(&c)) break; output << (char)c; } } 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; } } recoll-1.17.3/bincimapmime/mime-utils.h000644 001750 000000 00000003152 11757427665 020401 0ustar00dockeswheel000000 000000 /* -*- 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 recoll-1.17.3/bincimapmime/mime.cc000644 001750 000000 00000010272 11757427665 017402 0ustar00dockeswheel000000 000000 /* -*- 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)); } recoll-1.17.3/bincimapmime/mime.h000644 001750 000000 00000013365 11757427665 017252 0ustar00dockeswheel000000 000000 /* -*- 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 recoll-1.17.3/bincimapmime/trbinc.cc000644 001750 000000 00000005566 11757427665 017746 0ustar00dockeswheel000000 000000 /* 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 #include #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); } recoll-1.17.3/aspell/Makefile000644 001750 000000 00000001200 11740755063 016405 0ustar00dockeswheel000000 000000 depth = .. include $(depth)/mk/sysconf PROGS = rclaspell SRCS = rclaspell.cpp all: depend $(BIGLIB) $(PROGS) RCLASPELL_OBJS= trrclaspell.o $(BIGLIB) rclaspell : $(RCLASPELL_OBJS) $(CXX) $(ALL_CXXFLAGS) -o rclaspell $(RCLASPELL_OBJS) \ $(LIBXAPIAN) $(LIBICONV) trrclaspell.o : rclaspell.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_RCLASPELL -c -o trrclaspell.o \ rclaspell.cpp $(BIGLIB): force cd $(depth)/lib;$(MAKE) force: depend: alldeps.stamp alldeps.stamp : $(SRCS) $(CXX) -M $(ALL_CXXFLAGS) $(SRCS) > alldeps touch alldeps.stamp clean: cp /dev/null alldeps rm -f alldeps.stamp rm -f *.o $(PROGS) include alldeps recoll-1.17.3/aspell/aspell-local.h000644 001750 000000 00000063200 11740755063 017476 0ustar00dockeswheel000000 000000 /* 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 */ recoll-1.17.3/aspell/rclaspell.cpp000644 001750 000000 00000035056 11740755063 017452 0ustar00dockeswheel000000 000000 #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 #include #include ASPELL_INCLUDE #include "pathut.h" #include "execmd.h" #include "rclaspell.h" #include "debuglog.h" #include "ptmutex.h" // 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; } // We first look for the aspell library in libdir, and also try to // be clever with ASPELL_PROG. vector libdirs; libdirs.push_back(LIBDIR); // If not in the standard place, the aspell library has to live // under the same prefix as the aspell program. { string aspellPrefix = path_getfather(path_getfather(m_data->m_exec)); // This would probably require some more tweaking on solaris/irix etc. string dir = sizeof(long) > 4 ? "lib64" : "lib"; string libaspell = path_cat(aspellPrefix, dir); if (libaspell != LIBDIR) libdirs.push_back(libaspell); } reason = "Could not open shared library "; for (vector::iterator it = libdirs.begin(); it != libdirs.end(); it++) { string libbase = path_cat(*it, "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)) { // Prefixed terms are also somewhere else without the suffix, // skip them if (m_input->empty() || ('A' <= m_input->at(0) && m_input->at(0) <= 'Z')) continue; if (!Rcl::Db::isSpellingCandidate(*m_input)) continue; // Got a non-empty sort-of appropriate term, let's send it to // aspell 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; // We create the dictionary by executing the aspell command: // aspell --lang=[lang] create master [dictApath] ExecCmd aspell; list args; args.push_back(string("--lang=")+ m_lang); args.push_back("--encoding=utf-8"); args.push_back("create"); args.push_back("master"); args.push_back(dicPath()); 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)) { reason = string("aspell dictionary creation command failed.\n" "One possible reason might be missing language " "data files for lang = ") + m_lang; 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(Rcl::Db &db, const string &term, string& reason) { LOGDEB2(("Aspell::check [%s]\n", term.c_str())); if (!ok() || !make_speller(reason)) return false; if (term.empty()) return true; //?? int ret = aapi.aspell_speller_check(m_data->m_speller, term.c_str(), term.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; if (term.empty()) return true; //?? AspellCanHaveError *ret; const AspellWordList *wl = aapi.aspell_speller_suggest(m_data->m_speller, term.c_str(), term.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) { // stemDiffers checks that the word exists (we don't want // aspell computed stuff, only exact terms from the dictionary), // and that it stems differently to the base word (else it's not // useful to expand the search). Or is it ? // ******** This should depend if // stemming is turned on or not for querying ******* string sw(word); if (db.termExists(sw) && db.stemDiffers("english", sw, term)) 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; Rcl::Db rcldb; static char usage [] = " -b : build dictionary\n" " -s : suggestions for term\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) { 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 '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); } if (!rcldb.open(dbdir, 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 { 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 recoll-1.17.3/aspell/rclaspell.h000644 001750 000000 00000004574 11740755063 017120 0ustar00dockeswheel000000 000000 /* 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" #ifndef NO_NAMESPACES using std::string; using std::list; #endif // NO_NAMESPACES 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(string &reason); /** Build dictionary out of index term list. This is done at the end * of an indexing pass. */ bool buildDict(Rcl::Db &db, string &reason); /** Check that word is in dictionary. ret==false && !reason.empty() => err*/ bool check(Rcl::Db &db, const string& term, string& reason); /** Return a list of possible expansions for a given word */ bool suggest(Rcl::Db &db, const string& term, list &suggestions, string &reason); private: string dicPath(); RclConfig *m_config; string m_lang; AspellData *m_data; bool make_speller(string& reason); }; #endif /* RCL_USE_ASPELL */ #endif /* _RCLASPELL_H_INCLUDED_ */