From 311decd6e66a9bece45fc8d80e4c343202af5060 Mon Sep 17 00:00:00 2001 From: medoc Date: Mon, 9 Apr 2012 19:14:49 +0200 Subject: [PATCH] Merged in hxcan/recoll (pull request #1): get active indexes from the environment --- packaging/debian/debianrclqt4/control | 9 +- packaging/debian/debianrclqt4/copyright | 314 ++++++++++++------ packaging/debian/debianrclqt4/docs | 1 - .../patches/fix-python-install.patch | 7 +- packaging/debian/debianrclqt4/rules | 20 +- packaging/debian/debianrclqt4/source/format | 1 + packaging/debian/debianrclqt4/watch | 10 - src/README | 39 ++- src/VERSION | 2 +- src/common/autoconfig.h.in | 4 +- src/common/rclinit.cpp | 6 + src/common/unacpp.cpp | 13 +- src/configure | 28 +- src/configure.ac | 7 + src/doc/user/docbook-xsl.css | 212 ++++++++++++ src/doc/user/usermanual.sgml | 277 +++++++++------ src/doc/user/xmlmake.sh | 49 +++ src/filters/rclchm | 43 ++- src/filters/rcldia | 124 +++++++ src/filters/rclexecm.py | 5 +- src/index/Makefile | 8 - src/index/csguess.cpp | 215 ------------ src/index/csguess.h | 28 -- src/index/fsindexer.cpp | 1 - src/internfile/mh_html.cpp | 1 - src/internfile/mh_text.cpp | 1 - src/lib/Makefile | 12 +- src/lib/mkMake | 3 +- src/mk/manifest.txt | 3 +- src/python/recoll/setup.py.in | 21 +- src/qtgui/i18n/recoll_es.ts | 2 +- src/qtgui/recoll.pro.in | 6 - src/qtgui/reslist.cpp | 7 + src/sampleconf/mimeconf | 4 + src/sampleconf/mimemap | 1 + src/sampleconf/mimeview | 2 + src/sampleconf/recoll.conf.in | 11 + src/unac/unac.c | 135 +++++++- src/unac/unac.h | 16 + src/utils/pathut.cpp | 76 ++++- src/utils/rclionice.cpp | 1 + tests/config/recoll.conf | 2 + tests/dia/dia.sh | 14 + tests/dia/dia.txt | 4 + tests/lyx/lyx.sh | 4 +- tests/unacex/unacex.sh | 20 ++ tests/unacex/unacex.txt | 3 + unac/unac.c | 135 +++++++- unac/unac.h | 16 + website/doc.html | 4 +- website/features.html | 48 +-- website/filters/filters.html | 5 + website/index.html.en | 23 +- website/pics/00REMAKEALB.sh | 2 + website/pics/index.html | 26 +- website/pics/index.html.head | 27 ++ website/pics/recoll-HTML_search_results.html | 4 +- website/pics/recoll0.html | 4 +- website/pics/recoll1.html | 4 +- website/pics/recoll2-thumb.png | Bin 45853 -> 25877 bytes website/pics/recoll2.html | 6 +- website/pics/recoll2.png | Bin 46557 -> 46698 bytes website/pics/recoll2.txt | 2 +- website/pics/recoll3.html | 4 +- website/pics/recoll4.html | 4 +- website/pics/recoll5.html | 4 +- website/pics/recoll_chinese.html | 4 +- website/pics/result-table.html | 4 +- 68 files changed, 1474 insertions(+), 624 deletions(-) delete mode 100644 packaging/debian/debianrclqt4/docs create mode 100644 packaging/debian/debianrclqt4/source/format create mode 100644 src/doc/user/docbook-xsl.css create mode 100644 src/doc/user/xmlmake.sh create mode 100755 src/filters/rcldia delete mode 100644 src/index/csguess.cpp delete mode 100644 src/index/csguess.h create mode 100755 tests/dia/dia.sh create mode 100644 tests/dia/dia.txt create mode 100755 tests/unacex/unacex.sh create mode 100644 tests/unacex/unacex.txt create mode 100644 website/pics/00REMAKEALB.sh create mode 100644 website/pics/index.html.head diff --git a/packaging/debian/debianrclqt4/control b/packaging/debian/debianrclqt4/control index 9bcf0a0e..8df37ce7 100644 --- a/packaging/debian/debianrclqt4/control +++ b/packaging/debian/debianrclqt4/control @@ -9,15 +9,16 @@ Build-Depends: debhelper (>= 7), libxapian-dev (>= 1.0.15), libx11-dev, libz-dev, - python-dev, + python-all-dev (>= 2.6.6-3~), quilt -Standards-Version: 3.8.3 +Standards-Version: 3.9.3 Package: recoll Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Recommends: aspell, python, xsltproc -Suggests: antiword, catdoc, ghostscript, libimage-exiftool-perl, poppler-utils, unrtf, python-mutagen +Recommends: aspell, python, xdg-utils, xsltproc +Suggests: antiword, catdoc, ghostscript, libimage-exiftool-perl, poppler-utils, + pstotext, python-chm, python-mutagen, unrtf, untex Description: a personal full text search package with a QT GUI The Recoll personal full text search package is based on a very strong backend (Xapian), for which it provides an easy to use and feature-rich diff --git a/packaging/debian/debianrclqt4/copyright b/packaging/debian/debianrclqt4/copyright index 3cb35945..e934b0fd 100644 --- a/packaging/debian/debianrclqt4/copyright +++ b/packaging/debian/debianrclqt4/copyright @@ -1,113 +1,219 @@ -This package was debianized by Jean-Francois Dockes on -Wed, 10 Jan 2007 16:04:13 +0100. +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: recoll +Upstream-Contact: Jean-Francois Dockes +Source: http://www.lesbonscomptes.com/recoll/ -It was downloaded from http://www.recoll.org +Files: * +Copyright: 2005-2012, Jean-Francois Dockes +License: GPL-2+ -Upstream Author: Jean-Francois Dockes +Files: Binc IMAP project (bincimapmime/*) +Copyright: 2002-2005, Andreas Aardal Hanssen +License: GPL-2+ -Copyright: (C) 2005,2006, Jean-Francois Dockes +Files: filters/rcl* files index/csguess.cpp internfile/htmlparse.cpp +Copyright: 2000-2004, Mikio Hirabayashi +License: GPL-2+ +Files: filters/rclpython +Copyright: J\xfcrgen Hermann, Mike Brown, Christopher Arndt + +License: GPL-2+ + +Files: internfile/htmlparse.cpp mh_html.cpp +Copyright: 1999-2001, BrightStation PLC +Copyright: 2001, Ananova Ltd +Copyright: 2002-2004, Olly Betts +License: GPL-2+ + +Files: unac/* +Copyright: 2000-2002, Loic Dachary +License: GPL-2+ + +Files: common/* +Copyright: 2004-2005, J.F.Dockes +License: GPL-2+ + +Files: debian/* +Copyright: 2007-2012, Kartik Mistry +License: GPL-2+ + +License: GPL-2+ + This package is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free Software + Foundation; either version 2 of the License, or (at your option) any later + version. + . + This package is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License along with + this package; if not, write to the Free Software Foundation, Inc., 51 Franklin + St, Fifth Floor, Boston, MA 02110-1301 USA + . + On Debian systems, the complete text of the GNU General Public License can be + found in `/usr/share/common-licenses/GPL-2' and + `/usr/share/common-licenses/GPL-3'. + +Files: aspell/* +Copyright: 2001-2002, by Kevin Atkinson +License: LGPL-2+ + +Files: images/text-x-python.png +Copyright: David Vignoni +License: LGPL-2+ + +License: LGPL-2+ + This package is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) any + later version. + . + This package is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + . + You should have received a copy of the GNU Lesser General Public License along + with this package; if not, write to the Free Software Foundation, Inc., 51 + Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + . + On Debian systems, the complete text of the GNU Lesser General Public License + can be found in `/usr/share/common-licenses/LGPL-2' and + `/usr/share/common-licenses/LGPL-2.1' and `/usr/share/common-licenses/LGPL-3'. + +Files: qtgui/q3richtext_p.h +Copyright: 1992-2007, Trolltech ASA. All rights reserved License: + This file is part of the Qt3Support module of the Qt Toolkit. + . + This file may be used under the terms of the GNU General Public License + version 2.0 as published by the Free Software Foundation and appearing in the + file LICENSE.GPL included in the packaging of this file. Please review the + following information to ensure GNU General Public Licensing requirements will + be met: http://trolltech.com/products/qt/licenses/licensing/opensource/ + . + If you are unsure which license is appropriate for your use, please review the + following information: + http://trolltech.com/products/qt/licenses/licensing/licensingoverview + or contact the sales department at sales@trolltech.com. + . + In addition, as a special exception, Trolltech gives you certain additional + rights. These rights are described in the Trolltech GPL Exception version 1.0, + which can be found at http://www.trolltech.com/products/qt/gplexception/ and + in the file GPL_EXCEPTION.txt in this package. + . + In addition, as a special exception, Trolltech, as the sole copyright + holder for Qt Designer, grants users of the Qt/Eclipse Integration + plug-in the right for the Qt/Eclipse Integration to link to + functionality provided by Qt Designer and its related libraries. + . + Trolltech reserves all rights not expressly granted herein. + . + Trolltech ASA (c) 2007 + . + This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - This package is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +Files: common/uproplist.h +Copyright: 1991-2006, Unicode, Inc. +License: + All rights reserved. Distributed under the Terms of Use in + http://www.unicode.org/copyright.html + . + Permission is hereby granted, free of charge, to any person obtaining a copy + of the Unicode data files and any associated documentation (the "Data Files") + or Unicode software and any associated documentation (the "Software") to deal + in the Data Files or Software without restriction, including without + limitation the rights to use, copy, modify, merge, publish, distribute, and/or + sell copies of the Data Files or Software, and to permit persons to whom the + Data Files or Software are furnished to do so, provided that (a) the above + copyright notice(s) and this permission notice appear with all copies of the + Data Files or Software, (b) both the above copyright notice(s) and this + permission notice appear in associated documentation, and (c) there is clear + notice in each modified Data File or in the Software as well as in the + documentation associated with the Data File(s) or Software that the data or + software has been modified. + . + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY + KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD + PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN + THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL + DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE + DATA FILES OR SOFTWARE. + . + Except as contained in this notice, the name of a copyright holder shall not + be used in advertising or otherwise to promote the sale, use or other dealings + in these Data Files or Software without prior written authorization of the + copyright holder. - This package is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +Files: utils/md5.* +Copyright: 1991-1992, RSA Data Security, Inc. All rights reserved. +License: + MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + . + License to copy and use this software is granted provided that it is + identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in + all material mentioning or referencing this software or this function. + . + License is also granted to make and use derivative works provided that such + works are identified as "derived from the RSA Data Security, Inc. MD5 + Message-Digest Algorithm" in all material mentioning or referencing the + derived work. + . + RSA Data Security, Inc. makes no representations concerning either the + merchantability of this software or the suitability of this software for any + particular purpose. It is provided "as is" without express or implied warranty + of any kind. + . + These notices must be retained in any copies of any part of this documentation + and/or software. - You should have received a copy of the GNU General Public License - along with this package; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +Files: desktop/xdg-utils-1.0.1/* +Copyright: 2006, Kevin Krammer , + Jeremy White +License: + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. -On Debian systems, the complete text of the GNU General -Public License can be found in `/usr/share/common-licenses/GPL'. - -The Debian packaging is (C) 2007, Jean-Francois Dockes and -is licensed under the GPL, see above. - -Portions of the software are: - -Copyright (C) 2001-2002 by Kevin Atkinson under the GNU LGPL: -/* This file is part of The New Aspell - * Copyright (C) 2001-2002 by Kevin Atkinson under the GNU LGPL - * license version 2.0 or 2.1. You should have received a copy of the - * LGPL license along with this library if you did not you can find it - * at http://www.gnu.org/. - -On Debian systems, the complete text of the GNU LGPL -can be found in `/usr/share/common-licenses/LGPL-2'. - - -Copyright 2002-2005 Andreas Aardal Hanssen -Copyright (C) 2000-2004 Mikio Hirabayashi -Copyright 1999,2000,2001 BrightStation PLC -Copyright 2001 Ananova Ltd -Copyright 2002 Olly Betts -Copyright (C) 2000, 2001, 2002 Loic Dachary - - GPL V2 or later, same license text as above - -Copyright (c) 1991-2004 Unicode, Inc. - - COPYRIGHT AND PERMISSION NOTICE - - Copyright © 1991-2006 Unicode, Inc. All rights reserved. Distributed under - the Terms of Use in http://www.unicode.org/copyright.html. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of the Unicode data files and any associated documentation (the "Data - Files") or Unicode software and any associated documentation (the - "Software") to deal in the Data Files or Software without restriction, - including without limitation the rights to use, copy, modify, merge, - publish, distribute, and/or sell copies of the Data Files or Software, and - to permit persons to whom the Data Files or Software are furnished to do - so, provided that (a) the above copyright notice(s) and this permission - notice appear with all copies of the Data Files or Software, (b) both the - above copyright notice(s) and this permission notice appear in associated - documentation, and (c) there is clear notice in each modified Data File or - in the Software as well as in the documentation associated with the Data - File(s) or Software that the data or software has been modified. - - THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY - KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF - THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS - INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR - CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF - USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THE DATA FILES OR SOFTWARE. - - Except as contained in this notice, the name of a copyright holder shall - not be used in advertising or otherwise to promote the sale, use or other - dealings in these Data Files or Software without prior written - authorization of the copyright holder. - -Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All -/* - * MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm - * - * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All - * rights reserved. - * - * License to copy and use this software is granted provided that it - * is identified as the "RSA Data Security, Inc. MD5 Message-Digest - * Algorithm" in all material mentioning or referencing this software - * or this function. - * - * License is also granted to make and use derivative works provided - * that such works are identified as "derived from the RSA Data - * Security, Inc. MD5 Message-Digest Algorithm" in all material - * mentioning or referencing the derived work. - * - * RSA Data Security, Inc. makes no representations concerning either - * the merchantability of this software or the suitability of this - * software for any particular purpose. It is provided "as is" - * without express or implied warranty of any kind. - * - * These notices must be retained in any copies of any part of this - * documentation and/or software. - */ +Files: index/csguess.cpp +Copyright: 2000-2004, Mikio Hirabayashi +License: LGPL-2.1+ + This file is part of QDBM, Quick Database Manager. + . + QDBM is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2.1 of the License or any later + version. + . + QDBM is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + . + You should have received a copy of the GNU Lesser General Public License + along with QDBM; if not, write to the Free Software Foundation, Inc., + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + . + On Debian systems, the complete text of the GNU Lesser General Public License + can be found in `/usr/share/common-licenses/LGPL-2.1' and + `/usr/share/common-licenses/LGPL-3'. diff --git a/packaging/debian/debianrclqt4/docs b/packaging/debian/debianrclqt4/docs deleted file mode 100644 index e845566c..00000000 --- a/packaging/debian/debianrclqt4/docs +++ /dev/null @@ -1 +0,0 @@ -README diff --git a/packaging/debian/debianrclqt4/patches/fix-python-install.patch b/packaging/debian/debianrclqt4/patches/fix-python-install.patch index 49ce3727..4c57ca55 100644 --- a/packaging/debian/debianrclqt4/patches/fix-python-install.patch +++ b/packaging/debian/debianrclqt4/patches/fix-python-install.patch @@ -1,5 +1,8 @@ -setup.py --root and --user options interfer with debian wanting a dist-packages, -not site-packages installation for python modules +Description: Fix python module installation + setup.py --root and --user options interfer with debian wanting a + dist-packages, not site-packages installation for python modules +Author: Jean-Francois Dockes +Last-Update: 2012-03-26 --- a/recollinstall.in +++ b/recollinstall.in @@ -139,5 +139,4 @@ diff --git a/packaging/debian/debianrclqt4/rules b/packaging/debian/debianrclqt4/rules index 3af18c6a..5c8224ed 100755 --- a/packaging/debian/debianrclqt4/rules +++ b/packaging/debian/debianrclqt4/rules @@ -1,7 +1,5 @@ #!/usr/bin/make -f -include /usr/share/quilt/quilt.make - # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 @@ -28,13 +26,15 @@ config.status: configure --mandir=\$${prefix}/share/man \ --prefix=/usr -build: build-stamp -build-stamp: $(QUILT_STAMPFN) config.status +build: build-arch build-indep +build-arch: build-stamp +build-indep: build-stamp +build-stamp: config.status dh_testdir $(MAKE) touch $@ -clean: unpatch +clean: dh_testdir dh_testroot rm -f build-stamp config.log @@ -46,8 +46,11 @@ install: dh_testroot dh_prep dh_installdirs - $(MAKE) prefix=$(CURDIR)/debian/recoll/usr install - (cd python/recoll;python setup.py install --install-layout=deb --root=$(CURDIR)/debian/recoll/ ) + + $(MAKE) STRIP=ls prefix=$(CURDIR)/debian/tmp/usr install + (cd python/recoll; python setup.py install \ + --install-layout=deb \ + --prefix=$(CURDIR)/debian/tmp/usr ) binary-arch: build install dh_testdir @@ -56,6 +59,7 @@ binary-arch: build install dh_installdocs README dh_installmenu dh_installman + dh_install --sourcedir=debian/tmp dh_link dh_strip dh_compress @@ -69,4 +73,4 @@ binary-arch: build install binary-indep: build install binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install +.PHONY: build build-arch build-indep clean binary-indep binary-arch binary install diff --git a/packaging/debian/debianrclqt4/source/format b/packaging/debian/debianrclqt4/source/format new file mode 100644 index 00000000..163aaf8d --- /dev/null +++ b/packaging/debian/debianrclqt4/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/packaging/debian/debianrclqt4/watch b/packaging/debian/debianrclqt4/watch index 8b5064a9..e707c144 100644 --- a/packaging/debian/debianrclqt4/watch +++ b/packaging/debian/debianrclqt4/watch @@ -1,12 +1,2 @@ -# Example watch control file for uscan -# Rename this file to "watch" and then you can run the "uscan" command -# to check for upstream updates and more. -# See uscan(1) for format - -# Compulsory line, this is a version 3 file version=3 - -# Uncomment to examine a Webpage -# http://www.recoll.org/download.html recoll-(.*)\.tar\.gz - diff --git a/src/README b/src/README index 59fb4665..8da24bfb 100644 --- a/src/README +++ b/src/README @@ -235,24 +235,37 @@ More documentation can be found in the doc/ directory or at http://www.recoll.or files with different character sets, encodings, and languages into the same index. It has input filters for many document types. - Stemming depends on the document language. Recoll stores the unstemmed - versions of terms and uses auxiliary databases for term expansion. It can - switch stemming languages, or add a language, without re-indexing. Storing - documents in different languages in the same index is possible, and useful - in practice, but does introduce possibilities of confusion. Recoll - currently makes no attempt at automatic language recognition. + 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 parameters from this file 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 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 Indexing is started automatically the first time you execute the recoll search graphical user interface, or by executing the recollindex command. diff --git a/src/VERSION b/src/VERSION index 511a76e6..06fb41b6 100644 --- a/src/VERSION +++ b/src/VERSION @@ -1 +1 @@ -1.17.1 +1.17.2 diff --git a/src/common/autoconfig.h.in b/src/common/autoconfig.h.in index 5e99c482..41a7691e 100644 --- a/src/common/autoconfig.h.in +++ b/src/common/autoconfig.h.in @@ -109,7 +109,9 @@ #undef _FILE_OFFSET_BITS #undef _LARGE_FILES -#if _FILE_OFFSET_BITS == 64 || defined(__APPLE__) || defined(__OpenBSD__) +/* 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" diff --git a/src/common/rclinit.cpp b/src/common/rclinit.cpp index 37391888..1578a9e5 100644 --- a/src/common/rclinit.cpp +++ b/src/common/rclinit.cpp @@ -107,9 +107,15 @@ RclConfig *recollinit(RclInitFlags flags, // 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", diff --git a/src/common/unacpp.cpp b/src/common/unacpp.cpp index 280e8ef5..11d6775d 100644 --- a/src/common/unacpp.cpp +++ b/src/common/unacpp.cpp @@ -88,6 +88,7 @@ using namespace std; #include "unacpp.h" #include "readfile.h" +#include "rclinit.h" int main(int argc, char **argv) { @@ -98,8 +99,13 @@ int main(int argc, char **argv) } 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; @@ -111,7 +117,12 @@ int main(int argc, char **argv) exit(1); } - int fd = open(ofn, O_CREAT|O_EXCL|O_WRONLY, 0666); + 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; diff --git a/src/configure b/src/configure index e461ab05..959edd29 100755 --- a/src/configure +++ b/src/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for Recoll 1.17.0. +# Generated by GNU Autoconf 2.68 for Recoll 1.17.1. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -557,8 +557,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Recoll' PACKAGE_TARNAME='recoll' -PACKAGE_VERSION='1.17.0' -PACKAGE_STRING='Recoll 1.17.0' +PACKAGE_VERSION='1.17.1' +PACKAGE_STRING='Recoll 1.17.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -618,6 +618,7 @@ QTGUI QMAKE LIBFAM LIBXAPIANSTATICEXTRA +LIBXAPIANDIR LIBXAPIAN LIBICONV INCICONV @@ -1257,7 +1258,7 @@ 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.0 to adapt to many kinds of systems. +\`configure' configures Recoll 1.17.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1322,7 +1323,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Recoll 1.17.0:";; + short | recursive ) echo "Configuration of Recoll 1.17.1:";; esac cat <<\_ACEOF @@ -1449,7 +1450,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Recoll configure 1.17.0 +Recoll configure 1.17.1 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. @@ -2002,7 +2003,7 @@ 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.0, which was +It was created by Recoll $as_me 1.17.1, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -4598,10 +4599,16 @@ 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 @@ -5644,7 +5651,8 @@ test "X$m_prefix" = "XNONE" && m_prefix=/usr/local m_datadir=${m_prefix}/share QTRECOLL_DATADIR=${m_datadir}/recoll -RCLVERSION='1.17.0' +RCLVERSION='1.17.1' + @@ -6213,7 +6221,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # 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.0, which was +This file was extended by Recoll $as_me 1.17.1, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -6275,7 +6283,7 @@ _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.0 +Recoll config.status 1.17.1 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" diff --git a/src/configure.ac b/src/configure.ac index 7fb79821..8bad8920 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -321,10 +321,16 @@ 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 @@ -504,6 +510,7 @@ 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) diff --git a/src/doc/user/docbook-xsl.css b/src/doc/user/docbook-xsl.css new file mode 100644 index 00000000..8cc0a8b2 --- /dev/null +++ b/src/doc/user/docbook-xsl.css @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2001, 2003, 2010 The FreeBSD Documentation Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: doc/share/misc/docbook.css,v 1.15 2010/03/20 04:15:01 hrs Exp $ + */ + +body address { + line-height: 1.3; + margin: .6em 0; +} + +body blockquote { + margin-top: .75em; + line-height: 1.5; + margin-bottom: .75em; +} + +html body { + margin: 1em 8% 1em 10%; + line-height: 1.2; +} + +.legalnotice { + font-size: small; + font-variant: small-caps; +} + +body div { + margin: 0; +} + +dl { + margin: .8em 0; + line-height: 1.2; +} + +body form { + margin: .6em 0; +} + +h1, h2, h3, h4, h5, h6, +div.example p b, +.question, +div.table p b, +div.procedure p b { + color: #990000; +} + +body h1, body h2, body h3, body h4, body h5, body h6 { + line-height: 1.3; + margin-left: 0; +} + +body h1, body h2 { + margin: .8em 0 0 -4%; +} + +body h3, body h4 { + margin: .8em 0 0 -3%; +} + +body h5 { + margin: .8em 0 0 -2%; +} + +body h6 { + margin: .8em 0 0 -1%; +} + +body hr { + margin: .6em; + border-width: 0 0 1px 0; + border-style: solid; + border-color: #cecece; +} + +body img.navheader { + margin: 0 0 0 -4%; +} + +ol { + margin: 0 0 0 5%; + line-height: 1.2; +} + +body pre { + margin: .75em 0; + line-height: 1.0; + font-family: monospace; +} + +body td, body th { + line-height: 1.2; +} + +ul, body dir, body menu { + margin: 0 0 0 5%; + line-height: 1.2; +} + +html { + margin: 0; + padding: 0; +} + +body p b.application { + color: #000000; +} +body p span.application { + font-weight: bold; + color: #000000; +} + +.filename { + color: #007a00; +} + +.guimenu, .guimenuitem, .guisubmenu, +.guilabel, .interface, +.shortcut, .shortcut .keycap { + font-weight: bold; +} + +.guibutton { + background-color: #cfcfcf; + padding: 2px; +} + +.accel { + background-color: #f0f0f0; + text-decoration: underline; +} + +.screen { + padding: 1ex; +} + +.programlisting { + padding: 1ex; + background-color: #eee; + border: 1px solid #ccc; +} + +@media screen { /* hide from ie3 */ + a[href]:hover { background: #ffa } +} + +blockquote.note { + color: #222; + background: #eee; + border: 1px solid #ccc; + padding: 0.4em 0.4em; + width: 85%; +} + +blockquote.tip { + color: #004f00; + background: #d8ecd6; + border: 1px solid green; + padding: 0.2em 2em; + width: 85%; +} + +blockquote.important { + font-style:italic; + border: 1px solid #a00; + border-left: 12px solid #c00; + padding: 0.1em 1em; +} + +blockquote.warning { + color: #9f1313; + background: #f8e8e8; + border: 1px solid #e59595; + padding: 0.2em 2em; + width: 85%; +} + +.example { + background: #fefde6; + border: 1px solid #f1bb16; + margin: 1em 0; + padding: 0.2em 2em; + width: 90%; +} + +.informaltable table.calstable tr td { + padding-left: 1em; + padding-right: 1em; +} diff --git a/src/doc/user/usermanual.sgml b/src/doc/user/usermanual.sgml index d5432611..499006b4 100644 --- a/src/doc/user/usermanual.sgml +++ b/src/doc/user/usermanual.sgml @@ -34,6 +34,9 @@ This document introduces full text search notions and describes the installation and use of the &RCL; application. It currently describes &RCL; &RCLVERSION;. + @@ -45,12 +48,12 @@ Giving it a try - If you do not like reading manuals (who does?) and would - like to give &RCL; a try, just perform installation and start the - recoll user interface, which will index your - home directory by default, allowing you to search immediately after - indexing completes. + If you do not like reading manuals (who does?) and would like + to give &RCL; 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 @@ -135,45 +138,65 @@ different character sets, encodings, and languages into the same index. It has input filters for many document types. - Stemming depends on the document language. &RCL; stores - the unstemmed versions of terms and uses auxiliary databases for - term expansion. It can switch stemming languages, or add a - language, without re-indexing. Storing documents in different - languages in the same index is possible, and useful in - practice, but does introduce possibilities of confusion. &RCL; - currently makes no attempt at automatic language recognition. + Stemming is the process by which &RCL; reduces words to + their radicals so that searching does not depend, for example, + on a word being singular or plural (floor, floors), or on a verb + tense (flooring, floored). Because the mechanisms used for + stemming depend on the specific grammatical rules for each + language, there is a separate 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. &RCL; stores the unstemmed + versions of terms in the main index and uses auxiliary databases + for term expansion (one for each stemming language), which means + that you can switch stemming languages between searches, or add + a language without needing a full reindex. &RCL; currently + makes no attempt at automatic language recognition, which means + that the stemmer will sometimes be applied to terms from other + languages with potentially strange results. In practise, even if + this introduces possibilities of confusion, this approach has + been proven quite useful, and, awaiting the addition of an + automatic language recognition module to &RCL;, it is much less + cumbersome than separating your documents according to what + language they are written in. &RCL; has many parameters which define exactly what to - index, and how to classify and decode the source documents. These - are kept in configuration - files. A default configuration is copied into a standard - location (usually something like - /usr/[local/]share/recoll/examples) during - installation. The default parameters from this file may be - overridden by values that you set inside your personal - configuration, found by default in the .recoll - sub-directory of your home directory. The default configuration - will index your home directory with default parameters and should - be sufficient for giving &RCL; a try, but you may want to adjust it - later, which can be done either by editing the text files or by - using configuration menus in the recoll - GUI + index, and how to classify and decode the source + documents. These are kept in configuration files. A + default configuration is copied into a standard location + (usually something like + /usr/[local/]share/recoll/examples) + during installation. The default values set by the + configuration files in this directory may be overridden by + values that you set inside your personal configuration, found + by default in the .recoll sub-directory + of your home directory. The default configuration will index + your home directory with default parameters and should be + sufficient for giving &RCL; a try, but you may want to adjust + it later, which can be done either by editing the text files + or by using configuration menus in the + recoll GUI - Indexing - is started automatically the first time you execute the - recoll search graphical user interface, or by - executing the recollindex command. + 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 graphical user - interface (GUI) program, which has many options to help you find - what you are looking for. However, there are other ways to perform - &RCL; searches: mostly a - command line tool, a + performed inside the recoll GUI, which has many + options to help you find what you are looking for. However, there + are other ways to perform &RCL; searches: mostly a + command line interface, a Python - programming interface, and a - KDE KIO slave module. + programming interface, a + KDE KIO slave module, and + a Ubuntu Unity Lens module. + @@ -234,25 +257,27 @@ configuration files. Most file types, like HTML or word processing files, only hold - one document. Some file types, like mail folder files or zip + 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 &RCL; has no problem processing, for example, an ms-word - document which would be an attachment to an email message part of - a folder file archived inside a zip file... + deep, and &RCL; 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... - &RCL; indexing processes plain text, HTML, openoffice - and e-mail files, and a few others internally. + &RCL; indexing processes plain text, HTML, OpenDocument + (Open/LibreOffice), email formats, and a few others internally. Other file types (ie: postscript, pdf, ms-word, rtf ...) need external applications for preprocessing. The list is in the installation section. After every indexing operation, &RCL; updates a list of commands that would be needed for indexing existing files - types. This list can be displayed from the - recoll File menu. It is - stored in the missing text file - inside the configuration directory. + 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, &RCL; will index all appropriate files from your home directory, with a reasonable @@ -336,9 +361,9 @@ recoll indexed). Of course, images, sound and video do not increase the - index size, which means that it will be quite typical nowadays - (2006), that even a big index will be negligible against the - total amount of data on the computer. + 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 @@ -439,14 +464,20 @@ recoll option.) The interface is started from the - Preferences menu. It has two main - panels. The first panel allows setting global variables, like - the list of top directories or the list of skipped paths. The - second panel allows setting variables that can be redefined - for subdirectories. This second panel 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). + 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 @@ -521,15 +552,17 @@ recoll if canceled). The recollindex indexing process can be - interrupted by sending an interrupt (^C, SIGINT) or terminate + 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. The - indexing thread can be equivalently stopped from the menu. + 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 - exemple, the stemming and spelling databases will be inexistant + 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, @@ -576,7 +609,8 @@ recoll As of version 1.17 the &RCL; GUI has dialogs to manage crontab entries for recollindex. You can reach them from the - Preferences->Indexing Schedule menu. They only + Preferences->Indexing + Schedule menu. They only work with the good old cron, and do not give access to all features of cron scheduling. @@ -652,12 +686,13 @@ fvwm on the log level. When building &RCL;, the real time indexing support can be - customised during package - configuration - with the --with[out]-fam or + 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. + 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 @@ -712,7 +747,7 @@ fvwm In most cases, you can enter the terms as you think them, even if they contain embedded punctuation or other non-textual characters. For - exemple, &RCL; can handle things like e-mail addresses, or + example, &RCL; can handle things like email addresses, or arbitrary cut and paste from another text window, punctation and all. @@ -950,7 +985,7 @@ fvwm that you can't actually visualize the folder (there will be an error dialog if you try). &RCL; is unfortunately not yet smart enough to disable the entry in this case. In other cases, the - Open option makes sense, for exemple to + Open option makes sense, for example to start a chm viewer on the parent document for a help page. @@ -1006,7 +1041,7 @@ fvwm create a new preview window. The old one stays open until you close it. - You can close a preview tab by typing ^W + 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. @@ -1030,7 +1065,7 @@ fvwm F3 inside the text area to get to the next occurrence. - If you have a search string entered and you use ^Up/^Down + 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. @@ -1042,8 +1077,8 @@ fvwm the main text but in one of the fields. You can print the current preview window contents by typing - ^P (Ctrl + P) in - the window text. + Ctrl-P (Ctrl + + P) in the window text. @@ -1539,19 +1574,19 @@ fvwm Closing previews - Entering ^W in a tab will + 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 ^P in a preview window will print + Entering Ctrl-P in a preview window will print the currently displayed text. Quitting - Entering ^Q almost anywhere will + Entering Ctrl-Q almost anywhere will close the application. @@ -1588,9 +1623,10 @@ fvwm 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. + 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 @@ -1830,7 +1866,7 @@ fvwm 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 exemples on the + abilities... There are a few examples on the page about customising the result list on the &RCL; web site. @@ -2126,7 +2162,7 @@ text/html [file:///Users/uncrypted-dockes/projets/bateaux/ilur/factEtCie/r potatoes (in any part of the document). An element is composed of an optional field specification, - and a value, separated by a colon. Exemple: + and a value, separated by a colon. Example: Beatles, author:balzac, dc:title:grandet @@ -2163,7 +2199,7 @@ text/html [file:///Users/uncrypted-dockes/projets/bateaux/ilur/factEtCie/r title:prejudice title:pride, and is unlikely to find a result. - Modifiers can be set on a phrase clause, for exemple to specify + Modifiers can be set on a phrase clause, for example to specify a proximity search (unordered). See the modifier section. @@ -2209,7 +2245,7 @@ text/html [file:///Users/uncrypted-dockes/projets/bateaux/ilur/factEtCie/r size for filtering the - results on file size. Exemple: + results on file size. Example: size<10000. You can use <, > or = as operators. You can specify a range like the @@ -2233,7 +2269,7 @@ text/html [file:///Users/uncrypted-dockes/projets/bateaux/ilur/factEtCie/r 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. Exemples: + index. Examples: 2001-03-01/2002-05-01 the basic syntax for an interval of dates. @@ -2555,7 +2591,7 @@ text/html [file:///Users/uncrypted-dockes/projets/bateaux/ilur/factEtCie/r Subject: for email) when indexing. This is not essential. - You should look to one of the simple filters, for exemple + You should look to one of the simple filters, for example rclps for a starting point. Don't forget to make your filter executable before @@ -3087,7 +3123,7 @@ while query.next >= 0 and query.next < nres: 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 &RCL; (text, HTML, mail files, and a few + natively processed by &RCL; (text, HTML, email files, and a few others). You should also maybe have a look at the @@ -3259,13 +3295,13 @@ while query.next >= 0 and query.next < nres: Konqueror webarchive format with Python (uses the Tarfile module). - mimehtml web archive format (support based on the mail + mimehtml web archive format (support based on the email filter, which introduces some mild weirdness, but still usable). - Text, HTML, mail folders, and Scribus files are + 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. @@ -3557,6 +3593,28 @@ while query.next >= 0 and query.next < nres: 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. + + + Main configuration file @@ -3611,7 +3669,7 @@ skippedNames = #* bin CVS Cache cache* caughtspam tmp .thumbnails .svn \ 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, mail user + 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 @@ -3816,9 +3874,36 @@ skippedPaths = ~/somedir/∗.txt + 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 mail messages which don't + 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. @@ -4081,9 +4166,9 @@ mondelaypatterns = *.log:20 "this one has spaces*:10" filter-specific sections Some filters may need specific - configuration for handling fields. Only the mail message filter + configuration for handling fields. Only the email message filter currently has such a section (named - [mail]). It allows indexing arbitrary mail + [mail]). It allows indexing arbitrary email headers in addition to the ones indexed by default. Other such sections may appear in the future. @@ -4093,9 +4178,9 @@ mondelaypatterns = *.log:20 "this one has spaces*:10" Here follows a small example of a personal fields - file. This would extract a specific mail header and + 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 mail filter does no decoding on the values, + 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). diff --git a/src/doc/user/xmlmake.sh b/src/doc/user/xmlmake.sh new file mode 100644 index 00000000..0cc228b6 --- /dev/null +++ b/src/doc/user/xmlmake.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +# A script to produce the Recoll manual with an xml toolchain. +# Limitations: +# - Does not produce the links to the whole/chunked versions at the top +# of the document +# - The anchor names from the source text are converted to uppercase by +# the sgml toolchain. This does not happen with the xml toolchain, +# which means that external links like +# usermanual.html#RCL.CONFIG.INDEXING won't work because fragments are +# case-sensitive. This could be solved by converting all ids inside the +# source file to upper-case. + +# Wherever docbook.xsl and chunk.xsl live +XSLDIR="/usr/local/share/xsl/docbook/" + +dochunky=1 +test $# -eq 1 && dochunky=0 + +# Remove the SGML header and uncomment the XML one +sed -e '\!//FreeBSD//DTD!d' \ + -e '\!DTD DocBook XML!s///' \ + < usermanual.sgml > usermanual.xml + +# Options common to the single-file and chunked versions +commonoptions="--stringparam section.autolabel 1 \ + --stringparam section.autolabel.max.depth 3 \ + --stringparam section.label.includes.component.label 1 \ + --stringparam autotoc.label.in.hyperlink 0 \ + --stringparam abstract.notitle.enabled 1 \ + --stringparam html.stylesheet docbook-xsl.css \ + --stringparam generate.toc \"book toc,title,figure,table,example,equation\" \ +" + +# Do the chunky thing +test $dochunky -ne 0 && eval xsltproc $commonoptions \ + --stringparam use.id.as.filename 1 \ + "$XSLDIR/html/chunk.xsl" \ + usermanual.xml + +# Produce the single file version +eval xsltproc $commonoptions \ + -o usermanual-xml.html \ + "$XSLDIR/html/docbook.xsl" \ + usermanual.xml + +tidy -indent usermanual-xml.html > tmpfile +mv -f tmpfile usermanual-xml.html diff --git a/src/filters/rclchm b/src/filters/rclchm index 6be74113..b78a1cd4 100755 --- a/src/filters/rclchm +++ b/src/filters/rclchm @@ -2,11 +2,20 @@ """Extract Html files from a Microsoft Compiled Html Help file (.chm) Needs at least python 2.2 for HTMLParser (chmlib needs 2.2 too)""" +# Do we return individual chapters as html pages or concatenate everything? +rclchm_catenate = 0 +# Use special html type to allow for mimeconf/mimeview Open magic, +# Or go the regular html way with text/html +#rclchm_html_mtype = "text/x-chm-html" +rclchm_html_mtype = "text/html" + import sys import os import posixpath import urlparse import urllib +if rclchm_catenate: + import subprocess import rclexecm @@ -171,7 +180,11 @@ class rclCHM: self.tp = ChmTopicsParser(em) self.currentindex = 0 self.em = em - + if rclchm_catenate: + self.em.setmimetype("text/plain") + else: + self.em.setmimetype(rclchm_html_mtype) + def extractone(self, path): """Extract one path-named internal file from the chm file""" @@ -188,10 +201,27 @@ class rclCHM: res, doc = self.chm.RetrieveObject(ui) #self.em.rclog("extract: RetrieveObject: %d [%s]" % (res, doc)) if res > 0: - self.em.setmimetype("text/html") + self.em.setmimetype(rclchm_html_mtype) return (True, doc, path, iseof) return (False, "", path, iseof) - + + def dumpall(self): + alltxt="" + for pth in self.tp.contents: + ret,doc,path,iseof = self.extractone(pth) + if not ret: + continue + # Feed doc to lynx + process = subprocess.Popen(["lynx", "-stdin", "-dump", "-nolist", + "-display_charset=utf8", + "-force_html"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE + ) + txt,err = process.communicate(doc) + alltxt += txt + return alltxt + def openfile(self, params): """Open the chm file and build the contents list by extracting and parsing the Topics object""" @@ -239,6 +269,13 @@ class rclCHM: return self.extractone(params["ipath:"]) def getnext(self, params): + if rclchm_catenate: + alltxt = self.dumpall() + if alltxt: + return (True, alltxt, "", rclexecm.RclExecM.eofnext) + else: + return (False, "", "", rclexecm.RclExecM.eofnow) + if self.currentindex >= len(self.tp.contents): return (False, "", "", rclexecm.RclExecM.eofnow) else: diff --git a/src/filters/rcldia b/src/filters/rcldia new file mode 100755 index 00000000..185a4dc3 --- /dev/null +++ b/src/filters/rcldia @@ -0,0 +1,124 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# dia (http://live.gnome.org/Dia) file filter for recoll +# stefan.friedel@iwr.uni-heidelberg.de 2012 +# +# add the following to ~/.recoll/mimeconf into the [index] section: +# application/x-dia-diagram = execm rcldia;mimetype=text/html;charset=utf-8 +# and into the [icons] section: +# application/x-dia-diagram = drawing +# and finally under [categories]: +# other = ...\ +# application/x-dia-diagram +# +# in ~/.recoll/mimemap: +# .dia = application/x-dia-diagram + +# Small fixes from jfd: dia files are sometimes not compressed. +# And a note: this file actually has no reason to return HTML as there is +# no metadata. We could just as well and more simply return text/plain +import rclexecm +import re +from gzip import GzipFile +import xml.parsers.expat + +# some regexps to parse/format the xml data: delete #/spaces at the b/eol and +# ignore empty lines +rhs = re.compile(r'^[#|\s+](.*)') +rhe = re.compile(r'(.*)[#|\s+]$') +rempty = re.compile(r'^#?\s*#?$') + +htmltemplate = ''' + + + + +{0} + + +''' + +# xml parser for dia xml file +class Parser: + def __init__(self,rclem): + self._parser = xml.parsers.expat.ParserCreate(encoding='UTF-8') + self._parser.StartElementHandler = self.startelement + self._parser.EndElementHandler = self.endelement + self._parser.CharacterDataHandler = self.chardata + self.string = [] + self.handlethis = False + self.rclem = rclem + + def startelement(self, name, attrs): + if name == 'dia:string': + self.handlethis = True + else: + self.handlethis = False + + def chardata(self,data): + if self.handlethis: + # check if line is not empty and replace hashes/spaces + # tricky: after htmlescape check also for umlauts + if not rempty.search(data): + self.string.append(self.rclem.htmlescape( + rhe.sub(r'\1',rhs.sub(r'\1',data))).encode('ascii', 'xmlcharrefreplace')) + + def endelement(self,name): + self.handlethis = False + + def feed(self, fh): + self._parser.ParseFile(fh) + del self._parser + +class DiaExtractor: + def __init__(self, em): + self.em = em + + def extractdia(self): + docdata = "" + ipath = "" + try: + docdata = self.ExtractDiaText() + ok = True + except Exception, err: + ok = False + iseof = rclexecm.RclExecM.eofnext + self.em.setmimetype("text/html") + return (ok, docdata, ipath, iseof) + + ###### File type handler api, used by rclexecm ----------> + def openfile(self, params): + try: + self.dia = GzipFile(params["filename:"], 'r') + # Dial files are sometimes not compressed. Quite weirdly, + # GzipFile does not complain until we try to read. Have to do it + # here to be able to retry an uncompressed open. + data = self.dia.readline() + self.dia.seek(0) + return True + except: + # File not compressed ? + try: + self.dia = open(params["filename:"], 'r') + except: + return False + return True + + def getipath(self, params): + ok, data, ipath, eof = self.extractdia() + return (ok, data, ipath, eof) + + def getnext(self, params): + ok, data, ipath, eof = self.extractdia() + return (ok, data, ipath, eof) + + ###### read data + def ExtractDiaText(self): + diap = Parser(self.em) + diap.feed(self.dia) + return htmltemplate.format('\n'.join(diap.string)) + +# Main program: create protocol handler and extractor and run them +proto = rclexecm.RclExecM() +extract = DiaExtractor(proto) +rclexecm.main(proto, extract) diff --git a/src/filters/rclexecm.py b/src/filters/rclexecm.py index 2e8fc7df..821dcff0 100644 --- a/src/filters/rclexecm.py +++ b/src/filters/rclexecm.py @@ -24,8 +24,11 @@ class RclExecM: sys.exit(exitvalue) def htmlescape(self, txt): - txt = txt.replace("<", "<") + # This must stay first (it somehow had managed to skip after + # the next line, with rather interesting results) txt = txt.replace("&", "&") + + txt = txt.replace("<", "<") txt = txt.replace('"', "&dquot;") return txt diff --git a/src/index/Makefile b/src/index/Makefile index 7c24c36b..04c983d9 100644 --- a/src/index/Makefile +++ b/src/index/Makefile @@ -28,14 +28,6 @@ subtreelist : $(SUBTREELIST_OBJS) subtreelist.o : subtreelist.cpp $(CXX) $(ALL_CXXFLAGS) -DTEST_SUBTREELIST -c subtreelist.cpp -CSGUESS_OBJS= trcsguess.o $(BIGLIB) -csguess : $(CSGUESS_OBJS) - $(CXX) $(ALL_CXXFLAGS) -o csguess $(CSGUESS_OBJS) \ - $(LIBICONV) -trcsguess.o : csguess.cpp - $(CXX) $(ALL_CXXFLAGS) -DTEST_CSGUESS -c -o trcsguess.o \ - csguess.cpp - MIMETYPE_OBJS= trmimetype.o $(BIGLIB) mimetype : $(MIMETYPE_OBJS) $(CXX) $(ALL_CXXFLAGS) -o mimetype $(MIMETYPE_OBJS) \ diff --git a/src/index/csguess.cpp b/src/index/csguess.cpp deleted file mode 100644 index 28da1ed1..00000000 --- a/src/index/csguess.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/* 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_CSGUESS - -// This code was converted from estraier / qdbm / myconf.c: - -/************************************************************************** - * Copyright (C) 2000-2004 Mikio Hirabayashi - * - * This file is part of QDBM, Quick Database Manager. - * - * QDBM is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 2.1 of the License or any later - * version. QDBM is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. You should have received a copy of the GNU - * Lesser General Public License along with QDBM; if not, write to the Free - * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - * 02111-1307 USA. - * *********************************************************/ - -#include -#include -#include - -#ifndef NO_NAMESPACES -using std::string; -#endif /* NO_NAMESPACES */ - -#include - -#include "csguess.h" -#include "autoconfig.h" -#ifdef RCL_ICONV_INBUF_CONST -#define ICV_P2_TYPE const char** -#else -#define ICV_P2_TYPE char** -#endif - -// The values from estraier were 32768, 256, 0.001 -const int ICONVCHECKSIZ = 32768; -const int ICONVMISSMAX = 256; -const double ICONVALLWRAT = 0.001; - -// Try to transcode and count errors (for charset guessing) -static int transcodeErrCnt(const char *ptr, int size, - const char *icode, const char *ocode) -{ - iconv_t ic; - char obuf[2*ICONVCHECKSIZ], *wp, *rp; - size_t isiz, osiz; - int miss; - isiz = size; - if((ic = iconv_open(ocode, icode)) == (iconv_t)-1) - return size; - miss = 0; - rp = (char *)ptr; - while(isiz > 0){ - osiz = 2*ICONVCHECKSIZ; - wp = obuf; - if(iconv(ic, (ICV_P2_TYPE)&rp, &isiz, &wp, &osiz) == (size_t)-1){ - if(errno == EILSEQ || errno == EINVAL){ - rp++; - isiz--; - miss++; - if(miss >= ICONVMISSMAX) - break; - } else { - miss = size; - break; - } - } - } - if(iconv_close(ic) == -1) - return size; - return miss; -} - -// Try to guess character encoding. This could be optimized quite a -// lot by avoiding the multiple passes on the document, to be done -// after usefulness is demonstrated... -string csguess(const string &in, const string &dflt) -{ - const char *hypo; - int i, miss; - const char *text = in.c_str(); - bool cr = false; - - int size = in.length(); - if (size > ICONVCHECKSIZ) - size = ICONVCHECKSIZ; - - // UTF-16 with normal prefix ? - if (size >= 2 && (!memcmp(text, "\xfe\xff", 2) || - !memcmp(text, "\xff\xfe", 2))) - return "UTF-16"; - - // If we find a zero at an appropriate position, guess it's UTF-16 - // anyway. This is a quite expensive test for other texts as we'll - // have to scan the whole thing. - for (i = 0; i < size - 1; i += 2) { - if (text[i] == 0 && text[i + 1] != 0) - return "UTF-16BE"; - if (text[i + 1] == 0 && text[i] != 0) - return "UTF-16LE"; - } - - // Look for iso-2022 (rfc1468) specific escape sequences. As - // iso-2022 begins in ascii, and typically soon escapes, these - // succeed fast for a japanese text, but are quite expensive for - // any other - for (i = 0; i < size - 3; i++) { - if (text[i] == 0x1b) { - i++; - if (text[i] == '(' && strchr("BJHI", text[i + 1])) - return "ISO-2022-JP"; - if (text[i] == '$' && strchr("@B(", text[i + 1])) - return "ISO-2022-JP"; - } - } - - // Try conversions from ascii and utf-8. These are unlikely to succeed - // by mistake. - if (transcodeErrCnt(text, size, "US-ASCII", "UTF-16BE") < 1) - return "US-ASCII"; - - if (transcodeErrCnt(text, size, "UTF-8", "UTF-16BE") < 1) - return "UTF-8"; - - hypo = 0; - for (i = 0; i < size; i++) { - if (text[i] == 0xd) { - cr = true; - break; - } - } - - if (cr) { - if ((miss = transcodeErrCnt(text, size, "Shift_JIS", "EUC-JP")) < 1) - return "Shift_JIS"; - if (!hypo && miss / (double)size <= ICONVALLWRAT) - hypo = "Shift_JIS"; - if ((miss = transcodeErrCnt(text, size, "EUC-JP", "UTF-16BE")) < 1) - return "EUC-JP"; - if (!hypo && miss / (double)size <= ICONVALLWRAT) - hypo = "EUC-JP"; - } else { - if ((miss = transcodeErrCnt(text, size, "EUC-JP", "UTF-16BE")) < 1) - return "EUC-JP"; - if (!hypo && miss / (double)size <= ICONVALLWRAT) - hypo = "EUC-JP"; - if ((miss = transcodeErrCnt(text, size, "Shift_JIS", "EUC-JP")) < 1) - return "Shift_JIS"; - if (!hypo && miss / (double)size <= ICONVALLWRAT) - hypo = "Shift_JIS"; - } - if ((miss = transcodeErrCnt(text, size, "UTF-8", "UTF-16BE")) < 1) - return "UTF-8"; - if (!hypo && miss / (double)size <= ICONVALLWRAT) - hypo = "UTF-8"; - if ((miss = transcodeErrCnt(text, size, "CP932", "UTF-16BE")) < 1) - return "CP932"; - if (!hypo && miss / (double)size <= ICONVALLWRAT) - hypo = "CP932"; - - return hypo ? hypo : dflt; -} - -#else - -#include - -#include -#include -#include - -using namespace std; - -#include "readfile.h" -#include "csguess.h" - -int main(int argc, char **argv) -{ - if (argc != 2) { - cerr << "Usage: trcsguess " << endl; - exit(1); - } - const string filename = argv[1]; - const string dflt = argv[2]; - string text; - if (!file_to_string(filename, text)) { - cerr << "Couldnt read file, errno " << errno << endl; - exit(1); - } - cout << csguess(text, dflt) << endl; - exit(0); -} -#endif diff --git a/src/index/csguess.h b/src/index/csguess.h deleted file mode 100644 index 34176b98..00000000 --- a/src/index/csguess.h +++ /dev/null @@ -1,28 +0,0 @@ -/* 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 _CSGUESS_H_INCLUDED_ -#define _CSGUESS_H_INCLUDED_ - -#include - - -// Try to guess the character set. This might guess unicode encodings, and -// some asian charsets, but has no chance, for example, of discriminating -// betweeen the different iso8859-xx charsets. -extern std::string csguess(const std::string &in, const std::string &dflt); - -#endif /* _CSGUESS_H_INCLUDED_ */ diff --git a/src/index/fsindexer.cpp b/src/index/fsindexer.cpp index 9cd4715f..3c4e7519 100644 --- a/src/index/fsindexer.cpp +++ b/src/index/fsindexer.cpp @@ -39,7 +39,6 @@ #include "readfile.h" #include "indexer.h" #include "fsindexer.h" -#include "csguess.h" #include "transcode.h" #include "debuglog.h" #include "internfile.h" diff --git a/src/internfile/mh_html.cpp b/src/internfile/mh_html.cpp index e8e07d05..31615397 100644 --- a/src/internfile/mh_html.cpp +++ b/src/internfile/mh_html.cpp @@ -18,7 +18,6 @@ #include "cstr.h" #include "mimehandler.h" #include "debuglog.h" -#include "csguess.h" #include "readfile.h" #include "transcode.h" #include "mimeparse.h" diff --git a/src/internfile/mh_text.cpp b/src/internfile/mh_text.cpp index a9b7a203..03a2461b 100644 --- a/src/internfile/mh_text.cpp +++ b/src/internfile/mh_text.cpp @@ -29,7 +29,6 @@ using namespace std; #include "cstr.h" #include "mh_text.h" -#include "csguess.h" #include "debuglog.h" #include "readfile.h" #include "md5.h" diff --git a/src/lib/Makefile b/src/lib/Makefile index efb07466..6d831a67 100644 --- a/src/lib/Makefile +++ b/src/lib/Makefile @@ -6,15 +6,15 @@ LIBS = librcl.a all: $(LIBS) -OBJS = rclaspell.o beaglequeuecache.o cstr.o rclconfig.o rclinit.o textsplit.o unacpp.o beaglequeue.o csguess.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-getpart.o mime-parsefull.o mime-parseonlyheader.o mime-printbody.o mime-printdoc.o mime-printheader.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 csguess.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-getpart.dep.stamp mime-parsefull.dep.stamp mime-parseonlyheader.dep.stamp mime-printbody.dep.stamp mime-printdoc.dep.stamp mime-printheader.dep.stamp mime.dep.stamp convert.dep.stamp iodevice.dep.stamp iofactory.dep.stamp +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-getpart.o mime-parsefull.o mime-parseonlyheader.o mime-printbody.o mime-printdoc.o mime-printheader.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-getpart.dep.stamp mime-parsefull.dep.stamp mime-parseonlyheader.dep.stamp mime-printbody.dep.stamp mime-printdoc.dep.stamp mime-printheader.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 - $(CC) $(ALL_CXXFLAGS) -c $(depth)/unac/unac.c + $(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 @@ -31,8 +31,6 @@ 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 -csguess.o : ../index/csguess.cpp $(depth)/mk/localdefs - $(CXX) $(ALL_CXXFLAGS) -c ../index/csguess.cpp fsindexer.o : ../index/fsindexer.cpp $(depth)/mk/localdefs $(CXX) $(ALL_CXXFLAGS) -c ../index/fsindexer.cpp indexer.o : ../index/indexer.cpp $(depth)/mk/localdefs @@ -191,9 +189,6 @@ unacpp.dep.stamp : ../common/unacpp.cpp $(depth)/mk/localdefs beaglequeue.dep.stamp : ../index/beaglequeue.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../index/beaglequeue.cpp > beaglequeue.dep touch beaglequeue.dep.stamp -csguess.dep.stamp : ../index/csguess.cpp $(depth)/mk/localdefs - $(CXX) -M $(ALL_CXXFLAGS) ../index/csguess.cpp > csguess.dep - touch csguess.dep.stamp fsindexer.dep.stamp : ../index/fsindexer.cpp $(depth)/mk/localdefs $(CXX) -M $(ALL_CXXFLAGS) ../index/fsindexer.cpp > fsindexer.dep touch fsindexer.dep.stamp @@ -364,7 +359,6 @@ include rclinit.dep include textsplit.dep include unacpp.dep include beaglequeue.dep -include csguess.dep include fsindexer.dep include indexer.dep include mimetype.dep diff --git a/src/lib/mkMake b/src/lib/mkMake index 510a435d..98c2079a 100755 --- a/src/lib/mkMake +++ b/src/lib/mkMake @@ -12,7 +12,6 @@ ${depth}/common/rclinit.cpp \ ${depth}/common/textsplit.cpp \ ${depth}/common/unacpp.cpp \ ${depth}/index/beaglequeue.cpp \ -${depth}/index/csguess.cpp \ ${depth}/index/fsindexer.cpp \ ${depth}/index/indexer.cpp \ ${depth}/index/mimetype.cpp \ @@ -122,7 +121,7 @@ librcl.a : \$(DEPS) \$(OBJS) unac.o \$(RANLIB) librcl.a unac.o : \$(depth)/unac/unac.c \$(depth)/unac/unac.h $defs - \$(CC) \$(ALL_CXXFLAGS) -c \$(depth)/unac/unac.c + \$(CXX) \$(ALL_CXXFLAGS) -c \$(depth)/unac/unac.c EOF for c in $SRC_CPP;do diff --git a/src/mk/manifest.txt b/src/mk/manifest.txt index 03452b52..d97b0ff3 100644 --- a/src/mk/manifest.txt +++ b/src/mk/manifest.txt @@ -142,6 +142,7 @@ filters/rclabw filters/rclaptosidman filters/rclaudio filters/rclchm +filters/rcldia filters/rcldjvu filters/rcldoc filters/rcldvi @@ -185,8 +186,6 @@ index/ index/Makefile index/beaglequeue.cpp index/beaglequeue.h -index/csguess.cpp -index/csguess.h index/fsindexer.cpp index/fsindexer.h index/indexer.cpp diff --git a/src/python/recoll/setup.py.in b/src/python/recoll/setup.py.in index 2f35d33c..fd73f8ef 100644 --- a/src/python/recoll/setup.py.in +++ b/src/python/recoll/setup.py.in @@ -3,14 +3,21 @@ import os import sys sysname = os.uname()[0] -if sysname == 'Linux': - libs = ['rcl', 'xapian'] -else: - libs = ['rcl', 'xapian', 'iconv'] - - 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: @@ -42,7 +49,7 @@ module1 = Extension('recoll', os.path.join(top, 'unac') ], libraries = libs, - library_dirs = [os.path.join(top, 'lib'), '/usr/local/lib'], + library_dirs = libdirs, sources = ['pyrecoll.cpp', ]) diff --git a/src/qtgui/i18n/recoll_es.ts b/src/qtgui/i18n/recoll_es.ts index e391f564..e26f7154 100644 --- a/src/qtgui/i18n/recoll_es.ts +++ b/src/qtgui/i18n/recoll_es.ts @@ -176,7 +176,7 @@ Filter sizes - Tamaños de filtros + Filtro de tamaños diff --git a/src/qtgui/recoll.pro.in b/src/qtgui/recoll.pro.in index 21d09e98..b5a4b259 100644 --- a/src/qtgui/recoll.pro.in +++ b/src/qtgui/recoll.pro.in @@ -88,12 +88,6 @@ unix { UNAME = $$system(uname -s) contains( UNAME, [lL]inux ) { - LIBS -= -liconv - LIBS += -ldl -lX11 -} - -contains( UNAME, GNU/kFreeBSD ) { - LIBS -= -liconv LIBS += -ldl -lX11 } diff --git a/src/qtgui/reslist.cpp b/src/qtgui/reslist.cpp index bc06cf2f..18215e71 100644 --- a/src/qtgui/reslist.cpp +++ b/src/qtgui/reslist.cpp @@ -231,9 +231,16 @@ string QtGuiResListPager::iconUrl(RclConfig *config, Rcl::Doc& doc) ConfIndexer::docsToPaths(docs, paths); if (!paths.empty()) { string path; + LOGDEB2(("ResList::iconUrl: source path [%s]\n", paths[0].c_str())); if (thumbPathForUrl(cstr_fileu + paths[0], 128, path)) { + LOGDEB2(("ResList::iconUrl: icon path [%s]\n", path.c_str())); return cstr_fileu + path; + } else { + LOGDEB2(("ResList::iconUrl: no icon: path [%s]\n", + path.c_str())); } + } else { + LOGDEB(("ResList::iconUrl: docsToPaths failed\n")); } } return ResListPager::iconUrl(config, doc); diff --git a/src/sampleconf/mimeconf b/src/sampleconf/mimeconf index 210039e4..37774f47 100644 --- a/src/sampleconf/mimeconf +++ b/src/sampleconf/mimeconf @@ -71,6 +71,7 @@ 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 @@ -107,6 +108,7 @@ 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 @@ -153,6 +155,7 @@ 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 @@ -283,6 +286,7 @@ message = message/rfc822 \ 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 \ diff --git a/src/sampleconf/mimemap b/src/sampleconf/mimemap index 7b532828..3d184aec 100644 --- a/src/sampleconf/mimemap +++ b/src/sampleconf/mimemap @@ -41,6 +41,7 @@ .djvu = image/vnd.djvu .svg = image/svg+xml +.dia = application/x-dia-diagram .gz = application/x-gzip .Z = application/x-gzip diff --git a/src/sampleconf/mimeview b/src/sampleconf/mimeview index fdff86b3..d421e06b 100644 --- a/src/sampleconf/mimeview +++ b/src/sampleconf/mimeview @@ -52,6 +52,7 @@ 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 @@ -82,6 +83,7 @@ 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 diff --git a/src/sampleconf/recoll.conf.in b/src/sampleconf/recoll.conf.in index d36fefd7..bab728b3 100644 --- a/src/sampleconf/recoll.conf.in +++ b/src/sampleconf/recoll.conf.in @@ -65,6 +65,17 @@ indexstemminglanguages = english # 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). diff --git a/src/unac/unac.c b/src/unac/unac.c index ff02e00a..bc39ddfc 100644 --- a/src/unac/unac.c +++ b/src/unac/unac.c @@ -17,15 +17,57 @@ */ #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 @@ -12622,12 +12664,12 @@ int unacmaybefold_string_utf16(const char* in, size_t in_length, char* out; int out_size; int out_length; - int i; + unsigned int i; out_size = in_length > 0 ? in_length : 1024; out = *outp; - out = realloc(out, out_size + 1); + 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); @@ -12646,11 +12688,25 @@ int unacmaybefold_string_utf16(const char* in, size_t in_length, /* * Lookup the tables for decomposition information */ - if (dofold) { - unacfold_char_utf16(c, p, l); +#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 { - unac_char_utf16(c, p, l); +#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 */ @@ -12678,7 +12734,7 @@ int unacmaybefold_string_utf16(const char* in, size_t in_length, char *saved; out_size += ((l + 1) * 2) + 1024; saved = out; - out = realloc(out, out_size); + out = (char *)realloc(out, out_size); if(out == 0) { if(debug_level >= UNAC_DEBUG_LOW) DEBUG("realloc %d bytes failed\n", out_size); @@ -12798,7 +12854,7 @@ static int convert(const char* from, const char* to, out_size = in_length > 0 ? in_length : 1024; out = *outp; - out = realloc(out, out_size + 1); + out = (char *)realloc(out, out_size + 1); if(out == 0) { /* *outp still valid, no freeing */ if(debug_level >= UNAC_DEBUG_LOW) @@ -12884,7 +12940,7 @@ static int convert(const char* from, const char* to, { char *saved = out_base; /* +1 for null */ - out_base = realloc(out_base, out_size + 1); + out_base = (char *)realloc(out_base, out_size + 1); if (out_base == 0) { /* *outp potentially not valid any more. Free here, * and zero out */ @@ -12929,7 +12985,7 @@ int unacmaybefold_string(const char* charset, */ if (in_length <= 0) { if(!*outp) { - if ((*outp = malloc(32)) == 0) + if ((*outp = (char*)malloc(32)) == 0) return -1; } (*outp)[0] = '\0'; @@ -12975,3 +13031,64 @@ 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 */ diff --git a/src/unac/unac.h b/src/unac/unac.h index 74b6e602..13c52098 100644 --- a/src/unac/unac.h +++ b/src/unac/unac.h @@ -116,6 +116,22 @@ int unacfold_string(const char* charset, /* 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. */ diff --git a/src/utils/pathut.cpp b/src/utils/pathut.cpp index 8b4c59fd..65f406a0 100644 --- a/src/utils/pathut.cpp +++ b/src/utils/pathut.cpp @@ -389,6 +389,52 @@ bool path_isdir(const string& path) 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); @@ -397,24 +443,23 @@ string url_encode(const string& url, string::size_type offs) int c; const char *h = "0123456789ABCDEF"; c = cp[i]; - if(c <= 0x1f || + if (c <= 0x20 || c >= 0x7f || - c == '<' || - c == '>' || - c == ' ' || - c == '\t'|| c == '"' || c == '#' || c == '%' || - c == '{' || - c == '}' || - c == '|' || - c == '\\' || - 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]; @@ -445,7 +490,9 @@ string url_gpath(const string& url) return path_canon(url.substr(colon+1)); } -// Convert to file path if url is like file:// +// 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) @@ -570,7 +617,8 @@ static const string thmbdirnormal = ".thumbnails/normal"; static void thumbname(const string& url, string& name) { string digest; - MD5String(url, digest); + string l_url = url_encode(url); + MD5String(l_url, digest); MD5HexPrint(digest, name); name += ".png"; } diff --git a/src/utils/rclionice.cpp b/src/utils/rclionice.cpp index 31072cb2..c5a01bb2 100644 --- a/src/utils/rclionice.cpp +++ b/src/utils/rclionice.cpp @@ -15,6 +15,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include +#include #include "rclionice.h" #include "execmd.h" diff --git a/tests/config/recoll.conf b/tests/config/recoll.conf index 59d3e389..df13a81b 100644 --- a/tests/config/recoll.conf +++ b/tests/config/recoll.conf @@ -15,6 +15,8 @@ daemSkippedPaths = \ defaultcharset = iso-8859-1 +unac_except_trans = åå Ã…Ã¥ ää Ää öö Öö + [/home/dockes/projets/fulltext/testrecoll/special] defaultcharset = iso-8859-1 [/home/dockes/projets/fulltext/testrecoll/txt] diff --git a/tests/dia/dia.sh b/tests/dia/dia.sh new file mode 100755 index 00000000..313c5d96 --- /dev/null +++ b/tests/dia/dia.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +topdir=`dirname $0`/.. +. $topdir/shared.sh + +initvariables $0 +( +recollq DEPARTMENT NumberOfEmployees +recollq Within5Min WaterLevel KeptBelow +) 2> $mystderr | egrep -v '^Recoll query: ' > $mystdout + +diff -w ${myname}.txt $mystdout > $mydiffs 2>&1 + +checkresult diff --git a/tests/dia/dia.txt b/tests/dia/dia.txt new file mode 100644 index 00000000..5bb5b1bb --- /dev/null +++ b/tests/dia/dia.txt @@ -0,0 +1,4 @@ +1 results +application/x-dia-diagram [file:///home/dockes/projets/fulltext/testrecoll/dia/ER-demo.dia] [ER-demo.dia] 60803 bytes +1 results +application/x-dia-diagram [file:///home/dockes/projets/fulltext/testrecoll/dia/Istar.dia] [Istar.dia] 3537 bytes diff --git a/tests/lyx/lyx.sh b/tests/lyx/lyx.sh index 7610142c..0aad06c7 100755 --- a/tests/lyx/lyx.sh +++ b/tests/lyx/lyx.sh @@ -8,7 +8,9 @@ initvariables $0 ( recollq 'Bienvenue Dans Univers De Lyx' recollq 'Welcome To Lyx' -recollq 'Udvozli Ont A LyX' +recollq 'LyX rendkivul jol dokumentalt' +# cant use this one because o-diaeresis is in the swedish unacex +# recollq 'Udvozli Ont A LyX' ) 2> $mystderr | egrep -v '^Recoll query: ' > $mystdout diff -w ${myname}.txt $mystdout > $mydiffs 2>&1 diff --git a/tests/unacex/unacex.sh b/tests/unacex/unacex.sh new file mode 100755 index 00000000..582a5206 --- /dev/null +++ b/tests/unacex/unacex.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +topdir=`dirname $0`/.. +. $topdir/shared.sh + +initvariables $0 + +# We need an utf-8 locale for the 1st command to properly read its argument +export LANG=fr_FR.UTF-8 + +( +# Should succeed +recollq '"strippes: UNACEXååääöö"' +# Should fail +recollq '"strippes: UNACEXaaaaoo"' +) 2> $mystderr | egrep -v '^Recoll query: ' > $mystdout + +diff -w ${myname}.txt $mystdout > $mydiffs 2>&1 + +checkresult diff --git a/tests/unacex/unacex.txt b/tests/unacex/unacex.txt new file mode 100644 index 00000000..242edba6 --- /dev/null +++ b/tests/unacex/unacex.txt @@ -0,0 +1,3 @@ +1 results +text/html [file:///home/dockes/projets/fulltext/testrecoll/unacex/swedishchars.html] [Some chars] 293 bytes +0 results diff --git a/unac/unac.c b/unac/unac.c index ff02e00a..bc39ddfc 100644 --- a/unac/unac.c +++ b/unac/unac.c @@ -17,15 +17,57 @@ */ #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 @@ -12622,12 +12664,12 @@ int unacmaybefold_string_utf16(const char* in, size_t in_length, char* out; int out_size; int out_length; - int i; + unsigned int i; out_size = in_length > 0 ? in_length : 1024; out = *outp; - out = realloc(out, out_size + 1); + 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); @@ -12646,11 +12688,25 @@ int unacmaybefold_string_utf16(const char* in, size_t in_length, /* * Lookup the tables for decomposition information */ - if (dofold) { - unacfold_char_utf16(c, p, l); +#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 { - unac_char_utf16(c, p, l); +#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 */ @@ -12678,7 +12734,7 @@ int unacmaybefold_string_utf16(const char* in, size_t in_length, char *saved; out_size += ((l + 1) * 2) + 1024; saved = out; - out = realloc(out, out_size); + out = (char *)realloc(out, out_size); if(out == 0) { if(debug_level >= UNAC_DEBUG_LOW) DEBUG("realloc %d bytes failed\n", out_size); @@ -12798,7 +12854,7 @@ static int convert(const char* from, const char* to, out_size = in_length > 0 ? in_length : 1024; out = *outp; - out = realloc(out, out_size + 1); + out = (char *)realloc(out, out_size + 1); if(out == 0) { /* *outp still valid, no freeing */ if(debug_level >= UNAC_DEBUG_LOW) @@ -12884,7 +12940,7 @@ static int convert(const char* from, const char* to, { char *saved = out_base; /* +1 for null */ - out_base = realloc(out_base, out_size + 1); + out_base = (char *)realloc(out_base, out_size + 1); if (out_base == 0) { /* *outp potentially not valid any more. Free here, * and zero out */ @@ -12929,7 +12985,7 @@ int unacmaybefold_string(const char* charset, */ if (in_length <= 0) { if(!*outp) { - if ((*outp = malloc(32)) == 0) + if ((*outp = (char*)malloc(32)) == 0) return -1; } (*outp)[0] = '\0'; @@ -12975,3 +13031,64 @@ 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 */ diff --git a/unac/unac.h b/unac/unac.h index 74b6e602..13c52098 100644 --- a/unac/unac.h +++ b/unac/unac.h @@ -116,6 +116,22 @@ int unacfold_string(const char* charset, /* 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. */ diff --git a/website/doc.html b/website/doc.html index 633d3a25..4d06d750 100644 --- a/website/doc.html +++ b/website/doc.html @@ -12,7 +12,7 @@ - + @@ -34,6 +34,8 @@
  • English, HTML
  • +
  • + 中文,HTML
  • English, PDF
  • Italian (rather old)
  • diff --git a/website/features.html b/website/features.html index 62ccf2ed..33ba555a 100644 --- a/website/features.html +++ b/website/features.html @@ -87,11 +87,11 @@

    Document types

    Recoll can index many document types (along with their - compressed versions). Some types are handled internally (no - external application needed). Other types need a separate - application to be installed to extract the text. Types that - only need very common utilities (awk/sed/groff etc.) are - listed in the native section.

    + compressed versions). Some types are handled internally (no + external application needed). Other types need a separate + application to be installed to extract the text. Types that + only need very common utilities (awk/sed/groff/Python etc.) + are listed in the native section.

    File types indexed natively

    @@ -100,22 +100,25 @@
  • html.
  • -
  • maildir and mailbox (Mozilla, Thunderbird and Evolution mail ok).
  • +
  • maildir and + mailbox ( + Mozilla, + Thunderbird and + Evolutionmail ok). +
  • -
  • gaim and purple log files.
  • +
  • gaim and + purple log files.
  • -
  • Lyx files (needs Lyx to be installed).
  • +
  • Lyx files (needs + Lyx to be installed).
  • Scribus files.
  • -
  • Man pages (need groff).
  • +
  • Man pages (needs + groff).
  • + +
  • Dia diagrams.

File types indexed with external helpers

@@ -124,9 +127,10 @@ command in addition to the applications specifically listed.

The XML ones
-

The following types need xsltproc from the libxslt package. - Quite a few also need unzip:

+ +

The following types need + xsltproc from the libxslt package. + Quite a few also need unzip:

  • Abiword files.
  • @@ -148,6 +152,9 @@
    Other formats
    +

    The following need miscellaneous helper programs to decode + the internal formats.

    +
    • pdf with the pdftotext command, which can be installed @@ -166,7 +173,8 @@ "http://vitus.wagner.pp.ru/software/catdoc/">catdoc utilities.
    • CHM (Microsoft help) files - with Python, pychm + with Python, + pychm and chmlib.
    • GNU info files diff --git a/website/filters/filters.html b/website/filters/filters.html index 7e822a01..753d4b1e 100644 --- a/website/filters/filters.html +++ b/website/filters/filters.html @@ -75,6 +75,11 @@ should upgrade.

      +

      DIA files

      +

      rcldia is a new filter + for Dia files, + contributed by Stefan Friedel.

      +

      CHM files

      rclchm. The previous version of the filter mishandled files which had encoded internal URLs (not diff --git a/website/index.html.en b/website/index.html.en index 78083018..b69eb47f 100644 --- a/website/index.html.en +++ b/website/index.html.en @@ -7,7 +7,7 @@ - + @@ -69,20 +69,19 @@

      News:

        -
      • 2012-03-27: The Unity Lens can now handle results for embedded - documents, using the Recoll GUI as a proxy to extract and - display them.
      • +
      • 2012-04-07: we now have a Chinese user manual: Recoll现在有中文手册咯: + + Recoll中文手册,HTML
      • -
      • 2012-03-26: Recoll gets a Ubuntu Unity Lens. If you are running +
      • 2012-03-27: Recoll gets a Ubuntu Unity Lens. If you are running an Ubuntu release where this makes sense, you can install the recoll-lens package from the - - Recoll PPA.
        - Please note: for now, the Lens will only return - results which are normal files, not embedded documents. - Ie: no mbox messages, no attachments, no archive - members, etc. For now, you'll have to use the full Recoll - GUI to find these.
      • + + Recoll PPA. The Lens uses the Recoll GUI as a proxy to + extract and display embedded documents, which native utility + can't reach directly. And of course you still need to run + the GUI (or the command line recollindex) to get indexing + going !
      • 2012-03-24: Release 1.17 is out, see the Release notes.
      • diff --git a/website/pics/00REMAKEALB.sh b/website/pics/00REMAKEALB.sh new file mode 100644 index 00000000..b90c0ea0 --- /dev/null +++ b/website/pics/00REMAKEALB.sh @@ -0,0 +1,2 @@ +#!/bin/sh +onlylist=1 photalb . . diff --git a/website/pics/index.html b/website/pics/index.html index 2e9a69d3..3eab3b14 100644 --- a/website/pics/index.html +++ b/website/pics/index.html @@ -1,9 +1,30 @@ + - Photos + Recoll screenshots + + + + + + + + + + + + +
        + +

        Recoll Screenshots

        +
      • Back to Recoll home
      • + @@ -19,4 +40,5 @@ -
        + + diff --git a/website/pics/index.html.head b/website/pics/index.html.head new file mode 100644 index 00000000..32eed3ce --- /dev/null +++ b/website/pics/index.html.head @@ -0,0 +1,27 @@ + + + + + Recoll screenshots + + + + + + + + + + + + + + +
        + +

        Recoll Screenshots

        +
      • Back to Recoll home
      • + diff --git a/website/pics/recoll-HTML_search_results.html b/website/pics/recoll-HTML_search_results.html index c190076b..3985edb3 100644 --- a/website/pics/recoll-HTML_search_results.html +++ b/website/pics/recoll-HTML_search_results.html @@ -4,9 +4,9 @@ Photo -

        Prev Up +

        Prev Up Next      - Raw Image

        + Image

        A customized result list, thanks to Michael Croes. The html code follows, it should be pasted into the Preferences->Query Configuration->Result paragraph format string entry. diff --git a/website/pics/recoll0.html b/website/pics/recoll0.html index 2cead8b3..c5208800 100644 --- a/website/pics/recoll0.html +++ b/website/pics/recoll0.html @@ -4,9 +4,9 @@ Photo -

        Prev Up +

        Prev Up Next      - Raw Image

        + Image

        Search results.

        diff --git a/website/pics/recoll1.html b/website/pics/recoll1.html index 8be2a21b..882ae903 100644 --- a/website/pics/recoll1.html +++ b/website/pics/recoll1.html @@ -4,9 +4,9 @@ Photo -

        Prev Up +

        Prev Up Next      - Raw Image

        + Image

        A result list with a preview window open.

        diff --git a/website/pics/recoll2-thumb.png b/website/pics/recoll2-thumb.png index d3d8585101d27bf7ea5963f2ce8c8aa47f06967b..4f4cf021abd0ca022b40f527d3b157861d043799 100644 GIT binary patch literal 25877 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 HWyJpggiLo$ literal 45853 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 C6zZG+ diff --git a/website/pics/recoll2.html b/website/pics/recoll2.html index bc6b8d8d..d410d3ab 100644 --- a/website/pics/recoll2.html +++ b/website/pics/recoll2.html @@ -4,10 +4,10 @@ Photo -

        Prev Up +

        Prev Up Next      - Raw Image

        -

        The advanced search dialog.

        + Image

        +

        The two tabs in the advanced search dialog.

        diff --git a/website/pics/recoll2.png b/website/pics/recoll2.png index 995b66ffe15fc4529a1c432d31356768810c2c01..2fa3a339f9ea701e633d0461dc42cde69f948202 100644 GIT binary patch literal 46698 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 literal 46557 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 Lnp}m9dEkElH>soz diff --git a/website/pics/recoll2.txt b/website/pics/recoll2.txt index a70ce9bd..4e503cb3 100644 --- a/website/pics/recoll2.txt +++ b/website/pics/recoll2.txt @@ -1 +1 @@ -The advanced search dialog. +The two tabs in the advanced search dialog. diff --git a/website/pics/recoll3.html b/website/pics/recoll3.html index ea9ff5d5..74d8ba5f 100644 --- a/website/pics/recoll3.html +++ b/website/pics/recoll3.html @@ -4,9 +4,9 @@ Photo -

        Prev Up +

        Prev Up Next      - Raw Image

        + Image

        A result list from which the native application (firefox) was started by clicking the Edit link.

        diff --git a/website/pics/recoll4.html b/website/pics/recoll4.html index 3bd0c1d8..505f8444 100644 --- a/website/pics/recoll4.html +++ b/website/pics/recoll4.html @@ -4,9 +4,9 @@ Photo -

        Prev Up +

        Prev Up Next      - Raw Image

        + Image

        The document history window looks a little like a result list I'm afraid...

        diff --git a/website/pics/recoll5.html b/website/pics/recoll5.html index d0c4c81f..479ccf87 100644 --- a/website/pics/recoll5.html +++ b/website/pics/recoll5.html @@ -4,9 +4,9 @@ Photo -

        Prev Up +

        Prev Up Next      - Raw Image

        + Image

        The term explorer tool in phonetic mode.

        diff --git a/website/pics/recoll_chinese.html b/website/pics/recoll_chinese.html index 133dacf4..bbe5b132 100644 --- a/website/pics/recoll_chinese.html +++ b/website/pics/recoll_chinese.html @@ -4,9 +4,9 @@ Photo -

        Prev Up +

        Prev Up Next      - Raw Image

        + Image

        Recoll searching Chinese text. Chinese text search is based on n-grams and relatively rough, but still useful (I am told).

        diff --git a/website/pics/result-table.html b/website/pics/result-table.html index 08167805..262d20d4 100644 --- a/website/pics/result-table.html +++ b/website/pics/result-table.html @@ -4,9 +4,9 @@ Photo -

        Prev Up +

        Prev Up Next      - Raw Image

        + Image